導入
実務において、ECサイトのレコメンドエンジンや位置情報サービス、あるいはゲームサーバーのバックエンド開発を行う際、「空間上の距離」を計算する場面に遭遇することがあります。2次元平面上の距離(ピタゴラスの定理)は馴染みがある方も多いですが、3次元空間(x, y, z軸)に拡張された場合でも、その考え方は共通です。本記事では、PHPで3次元空間上の2点間の距離を正確かつ簡潔に計算する手法について解説します。
基礎知識
3次元空間上の2点 $A(x_1, y_1, z_1)$ と $B(x_2, y_2, z_2)$ の距離 $d$ は、以下の数式で求められます。
$d = \sqrt{(x_2 – x_1)^2 + (y_2 – y_1)^2 + (z_2 – z_1)^2}$
PHPでは、べき乗を求める pow() 関数と、平方根を求める sqrt() 関数を組み合わせることで、この数式をそのままプログラムに落とし込むことが可能です。
実装/解決策
実装にあたっては、可読性と再利用性を考慮し、関数化しておくことを推奨します。特に、大規模なデータセットに対して距離計算を行う場合は、計算回数に比例して負荷が増大するため、関数呼び出しのオーバーヘッドやデータ構造の持ち方を工夫する必要があります。
サンプルプログラム
以下のコードは、3次元座標を配列で受け取り、距離を算出する実用的な関数例です。
/
function calculate3DDistance(array $p1, array $p2): float
{
// 各軸の差分を2乗して加算
$sum = pow($p2[0] – $p1[0], 2) +
pow($p2[1] – $p1[1], 2) +
pow($p2[2] – $p1[2], 2);
// 平方根を返却
return sqrt($sum);
}
// 座標定義
$point1 = [1, 1, 0];
$point2 = [10, 0, 0];
$distance = calculate3DDistance($point1, $point2);
echo “2点間の距離は: ” . $distance . ” です。”;
?>
応用・注意点
実務でこの計算を利用する際、以下の3点に注意してください。
1. パフォーマンスの最適化:
単に「距離を比較したいだけ(大小関係さえ分かれば良い)」というケースでは、sqrt() を実行する必要はありません。平方根は計算コストが高いため、距離の2乗($d^2$)のまま比較を行うことで、処理速度を劇的に向上させることができます。
2. 浮動小数点数の精度:
PHPの数値計算は浮動小数点数(float)で行われます。極めて精密な計算が求められる金融や測量分野では、誤差が生じないよう bcmath 拡張モジュールなどを使用して精度を制御することを検討してください。
3. データバリデーション:
外部からの入力値を用いて距離計算を行う場合、必ず配列の要素数が3つであること、かつ数値であることを is_numeric() 等でバリデーションし、例外処理を適切に行ってください。予期せぬ入力はプログラムのクラッシュを招く原因となります。