atan2ってどう使うの?

atan2って何?

JavaScriptにはMathという組み込みオブジェクトのatan2()という関数が存在している。

このMath.atan2(y, x)という関数の戻り値は、MDN[1]によると

点 (0, 0) から点 (x,y) までの半直線と、正の x 軸の間の (−𝜋<𝑥<𝜋内の) ラジアン単位の角度

らしい。

そもそも、atan2という言葉がいまいち分からない。
意味について調べるとWikipedia[2]より

二つの引数を取るアークタンジェント

ということらしい。

アークタンジェントって何?

簡単に言うとタンジェントの逆関数。範囲は、−𝜋/2<𝑥<𝜋/2
理系大学生の数学駆け込み寺[3]によると

𝑡𝑎𝑛𝑥 は 𝑥 という角度の直角三角形において、底辺と対辺の2辺の比を表していますが、𝑎𝑟𝑐𝑡𝑎𝑛𝑥 はこの2辺の比に対しての角度 𝑥 を考えています。

とわかりやすく説明されている。つまりアークタンジェントは角度を求めることができる!

atan と atan2 の違いって何?

よし、これでatan2を使えるようになった。と思って調べるともう一つ似たような関数が出てくる。それがatan。MDN[4]によると

Math.atan() 関数は、引数として与えた数値のアークタンジェントをラジアン単位で返します。

らしい。範囲は、−𝜋/2<𝑥<𝜋/2


atan(x) atan2(y, x)
引数 (数値) (点のy座標, 点のx座標)
戻り値 与えられた数値のアークタンジェント (ラジアン単位) 点(0, 0)から点(x,y)までの半直線と、正のx軸の間の(−𝜋<𝑥<𝜋内の)ラジアン単位の角度
範囲 −𝜋/2<𝑥<𝜋/2 −𝜋<𝑥<𝜋

したがって、atanの場合には、タンジェントを表す数値が判明している場合に利用でき、atan2の場合は点のx座標, 点のy座標が判明している場合に利用できる。

atan2ってどんなところで使えるの?

例えば、3次元空間内で自分から見て相手がある角度の範囲内にいるときに、何か特別なアクションをさせる場合に使える。FPSでいうとショットガンの角度の有効範囲的な。

具体的にどう使うかというと、自分から見て前後をy座標として左右をx座標とする。自分の座標をoとする。自分は相手が𝜋/3<𝑥<2𝜋/3にいるときにショットガンを撃つと相手に当たようにする。

const enableShotgun = (y, x) => {
  const enemyPosition = Math.atan2(y, x)
  if(Math.PI / 3 < enemyPosition && enemyPosition < 2 * Math.PI / 3) {
    return true;
  } else {
    return false;
  }
}
enableShotgun(4, 2); // true
enableShotgun(0, 3); // false

おわりに

中々みかけない、atan2について触れてみた。これでみんなもatan2マスターだ!

この記事は岩手県立大学 Advent Calendar 2020の24日目です。

参考文献