JavaScript/Math/atan2

カテゴリ:Book:JavaScript#Math/atan2%20

Math.atan2(y, x) は、引数 yx の逆正接(アークタンジェント)を返します。これは、点 (x, y) の偏角(角度)をラジアン単位で返します[1]

  • 引数 yxNaN の場合、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 を返します。
  • 引数 yInfinity かつ xInfinity の場合、π/4 を返します。
  • 引数 yInfinity かつ x-Infinity の場合、3π/4 を返します。
  • 引数 y-Infinity かつ xInfinity の場合、-π/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) の偏角を計算しています。ユーザーが入力した値が NaNInfinity の場合、適切に処理されます。

偏角を利用した方向の計算

以下のプログラムは、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点間の方向を計算しています。dxdy は、点1から点2へのベクトルの成分です。

注意点

  • 象限の考慮: Math.atan2 は、xy の符号を考慮して、正しい象限の角度を返します。これは、Math.atan(y / x) では得られない利点です。
  • 戻り値の範囲: Math.atan2 の戻り値は、 から π の範囲です。
  • 精度: 浮動小数点演算の特性上、Math.atan2 の結果には微小な誤差が含まれることがあります。

脚註

  1. これは、数学的には atan2(y, x) = atan(y / x) ですが、x0 の場合や象限を考慮する点で異なります。

外部リンク

カテゴリ:Book:JavaScript#Math/atan2%20 カテゴリ:JavaScript
カテゴリ:Book:JavaScript カテゴリ:JavaScript カテゴリ:Pages using the JsonConfig extension