JavaScript的atan2()函数没有给出预期结果

7
通常,极坐标的范围是从0到π到2π(实际上是在2π之前,因为它等于0)。但是,在使用JavaScript的atan2()函数时,我得到了一个不同的、奇怪的范围:
笛卡尔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个回答

8

atan2通常返回该范围内的角度;例如,C标准库中的atan2就是这样做的。

如果你想要0到2pi而不是-pi到pi,可以测试结果是否为负数,如果是,则加上2pi。


我将此答案标记为正确,只是因为它回答了我的问题,“为什么”(这是标准)。我想我必须应对这种特殊情况。谢谢! - TerranRich
1
不用客气。使用范围-pi..pi并没有比0..2pi更具特异性。实际上,可以说它更有意义,因为它将不连续点放在负x轴而不是正x轴上,这通常是明智的选择。例如,atan2(y,x)与log(x+iy)的虚部几乎相同,当x+iy为正实数时,您确实希望其被定义(且连续)。 - Gareth McCaughan

7

atan2(y, x) 代替 atan2(x, y)


2
天啊...我花了一个小时才解决我的错误...谢谢!为什么会有人创建这样的API呢?这个顺序有什么原因吗? - Jan Peter

4
如果结果为负数,只需将2 * PI添加到结果中。
function atan2Normalized(x,y) {
    var result = Math.atan2(x, y);
    if (result < 0) {
        result += (2 * Math.PI);
    }
    return(result);
}

@GarethMcCaughanq - 你是对的 - 我知道那个,只是打错了。我已经改正了。 - jfriend00
谢谢!这肯定会有所帮助。我还可以使用条件语句(或者技术术语是什么),例如 theta_fixed = (theta > 0) ? theta : (theta + 2 * Math.PI); - TerranRich

2
如何使其使用范围 {0, ..., 2π} 而不是 {–π, ..., π}?
函数 Math.atan2(Y,X) 对于 -00 的返回结果不同。
例如,其中 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)

如果你将结果加上 π,你会得到一个范围在[0, 2π)内的值。
因此你可以使用:
var theta = Math.atan2(-Y, -X) + Math.PI;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接