JavaScript/Math/atan2
Math.atan2(y, x)
は、引数 y
と x
の逆正接(アークタンジェント)を返します。これは、点 (x, y)
の偏角(角度)をラジアン単位で返します[1]。
- 引数
y
とx
がNaN
の場合、NaN
を返します。 - 引数
y
が+0
かつx
が正の場合、+0
を返します。 - 引数
y
が-0
かつx
が正の場合、-0
を返します。 - 引数
y
が+0
かつx
が負の場合、π
を返します。 - 引数
y
が-0
かつx
が負の場合、-π
を返します。 - 引数
y
が正かつx
が+0
または-0
の場合、π/2
を返します。 - 引数
y
が負かつx
が+0
または-0
の場合、-π/2
を返します。 - 引数
y
がInfinity
かつx
がInfinity
の場合、π/4
を返します。 - 引数
y
がInfinity
かつx
が-Infinity
の場合、3π/4
を返します。 - 引数
y
が-Infinity
かつx
がInfinity
の場合、-π/4
を返します。 - 引数
y
が-Infinity
かつx
が-Infinity
の場合、-3π/4
を返します。
例
偏角を計算するプログラム
以下のプログラムは、ユーザーが入力した点 (x, y)
の偏角を計算します。
const f = p => { for (;;) { a = prompt(`${p}は何ですか?`); if (!isNaN(a)) return a; alert(`${p}に、入力ミスがあります。 "${a}"`); } } for (;;) { const x = f("x座標"); const y = f("y座標"); const atan2 = Math.atan2(y, x); if (!isNaN(atan2)) { alert(`点 (${x}, ${y}) の偏角は ${atan2.toFixed(3)} ラジアンです。`); break; } alert("入力が大きすぎます。"); }
このプログラムでは、Math.atan2
を使用して点 (x, y)
の偏角を計算しています。ユーザーが入力した値が NaN
や Infinity
の場合、適切に処理されます。
偏角を利用した方向の計算
以下のプログラムは、2点間の方向を計算します。
const f = p => { for (;;) { a = prompt(`${p}は何ですか?`); if (!isNaN(a)) return a; alert(`${p}に、入力ミスがあります。 "${a}"`); } } for (;;) { const x1 = f("点1のx座標"); const y1 = f("点1のy座標"); const x2 = f("点2のx座標"); const y2 = f("点2のy座標"); const dx = x2 - x1; const dy = y2 - y1; const angle = Math.atan2(dy, dx); if (!isNaN(angle)) { alert(`点1 (${x1}, ${y1}) から 点2 (${x2}, ${y2}) への方向は ${angle.toFixed(3)} ラジアンです。`); break; } alert("入力が大きすぎます。"); }
このプログラムでは、Math.atan2
を使用して2点間の方向を計算しています。dx
と dy
は、点1から点2へのベクトルの成分です。
注意点
- 象限の考慮:
Math.atan2
は、x
とy
の符号を考慮して、正しい象限の角度を返します。これは、Math.atan(y / x)
では得られない利点です。 - 戻り値の範囲:
Math.atan2
の戻り値は、-π
からπ
の範囲です。 - 精度: 浮動小数点演算の特性上、
Math.atan2
の結果には微小な誤差が含まれることがあります。
脚註
- ↑ これは、数学的には
atan2(y, x) = atan(y / x)
ですが、x
が0
の場合や象限を考慮する点で異なります。