導入
業務システムにおいて、物流の配送ルート最適化や、3D空間を扱うシミュレーション、あるいは単純な位置情報の計算など、数学的な演算が必要になる場面は少なくありません。PHPはWeb開発が主流ですが、標準関数を組み合わせることで、こうした幾何学計算も効率的に実装可能です。今回は、現場で役立つ「3次元空間での中点計算」と「2点間の距離算出」という基本的なTipsを紹介します。
基礎知識
幾何学計算の基本は、座標を配列やオブジェクトとして扱うことです。3次元空間の点は、一般的に(x, y, z)の3つの値で構成されます。
中点とは、2つの点の中間に位置する点のことで、それぞれの座標成分を足して2で割ることで算出できます。
2点間の距離は「ピタゴラスの定理(三平方の定理)」を応用します。各軸の差の2乗を足し合わせ、その平方根をとることで導き出されます。PHPには、累乗を扱うpow()関数と、平方根を求めるsqrt()関数が標準で備わっているため、これらを使うのが定石です。
実装/解決策
実務では、座標データが配列で渡されることが多いため、汎用的な関数として実装するのがベストです。引数として座標を受け取り、計算結果を返す関数を作成しましょう。また、PHP 7以降であれば型宣言を導入し、入力データが正しい数値型であることを保証すると、より安全なコードになります。
サンプルプログラム
以下のコードは、3次元空間上の2点間の中点計算と距離計算を実装した例です。
/
function get_middle_point(array $p1, array $p2): array {
// 各軸ごとの平均値を算出
return [
($p1[0] + $p2[0]) / 2,
($p1[1] + $p2[1]) / 2,
($p1[2] + $p2[2]) / 2
];
}
/
- 3次元空間上の2点間の距離を算出する関数
/
function get_distance(array $p1, array $p2): float {
// sqrt( (x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2 )
$sum = pow($p2[0] – $p1[0], 2) + pow($p2[1] – $p1[1], 2) + pow($p2[2] – $p1[2], 2);
return sqrt($sum);
}
// 座標の定義
$pointA = [5, 10, 3];
$pointB = [20, 2, 10];
// 実行と出力
$middle = get_middle_point($pointA, $pointB);
$dist = get_distance($pointA, $pointB);
echo “中点: ” . implode(‘, ‘, $middle) . PHP_EOL;
echo “距離: ” . $dist . PHP_EOL;
?>
応用・注意点
現場で活用する際、以下の点に注意してください。
1. 浮動小数点数の精度: 非常に精密な計算が必要な場合、PHPの浮動小数点数の精度(IEEE 754)では誤差が生じることがあります。その場合は、bcmath拡張機能を使用し、文字列として計算を行うことを検討してください。
2. バリデーション: 入力された配列の要素数が3つ未満だった場合、Undefined offsetエラーが発生します。実務コードでは、事前にcount()関数で要素数を確認するチェック処理を必ず含めてください。
3. パフォーマンス: 大量の座標計算をループ内で行う場合、関数呼び出しのオーバーヘッドを避けるため、計算処理をインライン化するなどの最適化が有効なケースもあります。ただし、可読性を優先し、まずは関数化してテスト可能な状態に保つことを推奨します。