7

通常、極座標は0からπ2πになります(実際にはの直前で、再び0になります)。ただし、JavaScriptatan2()関数を使用すると、別の奇妙な範囲が表示されます。

デカルトX| デカルトY| シータ(θ)
================================================== =========
     1 | 0 | 0(0× π)
     1 | 1 | 0.7853981633974483(0.25× π)
     0 | 1 | 1.5707963267948966(0.5× π)
    -1 | 1 | 2.356194490192345(0.75× π)
    -1 | 0 | 3.141592653589793(1× π)
    -1 | -1 | -2.356194490192345(-0.75× π)
     0 | -1 | -1.5707963267948966(-0.5× π)
     1 | -1 | -0.7853981633974483(-0.25× π

ご覧のとおり、π(180°)に達すると–π (–180°)にジャンプし、0に戻ります。範囲{0、...、2を使用するにはどうすればよいですか。 { –π、...、π }の代わりにπ }?私は値を「修正」するためにすべての計算を考えようとしてきましたが、JavaScriptが通常の極範囲ではなくこの範囲を選択する理由も知りたいです。ありがとう!

4

4 に答える 4

8

atan2その範囲の角度を返すことはかなり標準的です。たとえば、これatan2は C 標準ライブラリの が行うことです。

-pi..pi の代わりに 0..2pi が必要な場合は、結果が負かどうかをテストし、負の場合は 2pi を追加します。

于 2012-04-27T01:09:23.643 に答える
7

そうじゃatan2(y, x)ないatan2(x, y)

于 2016-09-03T15:16:30.703 に答える
4

結果が負の場合は、結果に追加2 * PIするだけです。

function atan2Normalized(x,y) {
    var result = Math.atan2(x, y);
    if (result < 0) {
        result += (2 * Math.PI);
    }
    return(result);
}
于 2012-04-27T01:07:36.883 に答える
0

{–π, ..., π} の代わりに範囲 {0, ..., 2π} を使用するにはどうすればよいですか?

このMath.atan2(Y,X)関数は、 for とは異なる結果を返し-0ます0

たとえば、Math.atan2(0, -1)return 3.141592653589793Math.atan2(-0, -1)return -3.141592653589793.

この事実を利用して、 の範囲で結果を得るための式を単純化できます[0, 2π)

と の値を否定するXと、次のようになることに注意してください。Y

   X   |   Y   |  -X   |  -Y   |  Math.atan2(-Y,-X)
===========================================================
   1   |   0   |  -1   |  -0   | -1.00π (-3.141592653589793)
   1   |   1   |  -1   |  -1   | -0.75π (-2.356194490192345)
   0   |   1   |  -0   |  -1   | -0.50π (-1.5707963267948966)
  -1   |   1   |   1   |  -1   | -0.25π (-0.7853981633974483)
  -1   |   0   |   1   |  -0   |  0.00π (0)
  -1   |  -1   |   1   |   1   |  0.25π (0.7853981633974483)
   0   |  -1   |  -0   |   1   |  0.50π (1.5707963267948966)
   1   |  -1   |  -1   |   1   |  0.75π (2.356194490192345)

その後π、結果に加算すると、範囲内の値が得られます[0, 2π)

したがって、次を使用できます。

var theta = Math.atan2(-Y, -X) + Math.PI;
于 2016-07-01T17:01:50.753 に答える