7

通常,极坐标从 0 到π到 2 π(实际上正好在 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返回该范围内的角度是非常标准的;例如,这就是atan2C 标准库中的。

如果您想要 0..2pi 而不是 -pi..pi,请测试结果是否为负,如果是则添加 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)返回3.141592653589793Math.atan2(-0, -1)返回-3.141592653589793

您可以使用这个事实来简化等式以获得范围内的结果[0, 2π)

注意如果你否定XY值,你会得到什么:

   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)

如果然后添加π到结果中,您将获得 range 中的值[0, 2π)

因此,您可以使用:

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