【PHP実践|実務向け】PHPで二点間の角度を正確に求めるためのatan2関数活用術

導入: なぜatan2関数が必要なのか

Web開発やゲーム、データ解析において、座標から角度を算出する処理は頻繁に発生します。単純に三角関数のtan(タンジェント)を使って「y/x」を計算しようとすると、xが0の時に「ゼロ除算」エラーが発生し、プログラムが停止してしまいます。また、単純なアークタンジェントでは象限(座標がどのエリアにあるか)を正しく判定できないという課題があります。本記事では、この問題をスマートに解決するPHPのatan2関数について解説します。

基礎知識: atanとatan2の違い

数学的な角度を求める際、一般的にはatan関数を用いますが、プログラミングにおいてはatan2関数を使うのが定石です。
atan(y/x):引数をひとつ(y/xの比率)しか受け取らないため、xが0の時にエラーとなり、また全ての象限で正しい角度を返せません。
atan2(y, x):yとxの二つの引数を受け取ります。内部的に座標の象限を考慮して計算を行うため、ゼロ除算を回避しつつ、-πからπの範囲で正確なラジアンを返します。

実装/解決策

PHPのatan2関数は、返り値として「ラジアン(Radian)」を返します。実務では人間が理解しやすい「度数(Degree)」に変換して利用することが多いため、PHP標準のrad2deg関数を組み合わせて使用するのが最適です。

サンプルプログラム

以下のコードは、原点(0,0)から見た任意の座標(x,y)の角度を度数法で算出する例です。

  • 二点間の角度を計算する関数
  • @param float $x 座標のX値
  • @param float $y 座標のY値
  • @return float 度数法の角度(0〜360度)
  • /
    function getAngle($x, $y) {
    // atan2関数でラジアンを取得(引数の順序はy, xであることに注意)
    $radian = atan2($y, $x);

    // ラジアンを度数法に変換
    $degree = rad2deg($radian);

    // 結果がマイナスの場合、360を足して0〜360度の範囲に補正する
    if ($degree < 0) { $degree += 360; } return $degree; } // 実行例 echo "座標(10, 10)の角度: " . getAngle(10, 10) . "度" . PHP_EOL; // 45度 echo "座標(0, 10)の角度: " . getAngle(0, 10) . "度" . PHP_EOL; // 90度 echo "座標(-10, 0)の角度: " . getAngle(-10, 0) . "度" . PHP_EOL; // 180度 ?>

    応用・注意点

    1. 引数の順序:atan2関数は「atan2(y, x)」という順序で引数を渡します。数学の座標系(x, y)と混同して逆に指定すると、全く別の角度が算出されるため注意してください。
    2. 円周率の利用:もし独自の計算で円周率を使いたい場合は、M_PI定数やpi()関数を使用してください。数値リテラルで「3.14」と書くよりも精度が高く、コードの可読性も向上します。
    3. ゼロ除算への配慮:atan2を使うことでゼロ除算エラーは回避されますが、xとyが両方とも0の場合(原点)は戻り値が0となります。仕様として原点をどう扱うか、事前に検討しておくことをおすすめします。

    タイトルとURLをコピーしました