JavaScript atan2()函数未给出预期结果

JavaScript atan2()函数未给出预期结果,javascript,coordinates,atan2,radians,polar-coordinates,Javascript,Coordinates,Atan2,Radians,Polar Coordinates,通常,极坐标从0到π到2π(正好在2π之前,因为它再次等于0)。然而,当使用JavaScriptatan2()函数时,我得到了一个不同的奇怪范围: Cartesian X | Cartesian Y | Theta (θ) =========================================================== 1 | 0 | 0 (0 × π) 1 | 1 | 0.7

通常,极坐标从0到π到2π(正好在2π之前,因为它再次等于0)。然而,当使用JavaScript
atan2()
函数时,我得到了一个不同的奇怪范围:

Cartesian X | Cartesian Y | Theta (θ) =========================================================== 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 × π) 笛卡尔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选择这个范围而不是典型的极坐标范围。谢谢

如果结果为负值,只需在结果中添加
2*PI

function atan2Normalized(x,y) {
    var result = Math.atan2(x, y);
    if (result < 0) {
        result += (2 * Math.PI);
    }
    return(result);
}
函数atan2Normalized(x,y){ var结果=数学atan2(x,y); 如果(结果<0){ 结果+=(2*Math.PI); } 返回(结果); }
对于
atan2
来说,返回角度在该范围内是相当标准的;例如,C标准库中的
atan2
就是这样做的

如果想要0..2pi而不是-pi..pi,请测试结果是否为负,如果为负,则添加2pi

我怎样才能让它使用范围{0,…,2π}而不是{–π。。。, π} ?

该函数将为
-0
提供与
0
不同的结果

例如,其中
Math.atan2(0,-1)
返回
3.141592653589793
Math.atan2(-0,-1)
返回
-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;

这是
atan2(y,x)
not
atan2(x,y)
@GarethMcCaughanq-你是对的-我知道,但只是打错了。我已经更正了。谢谢!这肯定会有帮助。我也可以使用条件(或任何技术术语),比如
theta\u fixed=(theta>0)?theta:(theta+2*Math.PI);
我之所以将这个答案标记为正确答案,只是因为它回答了我的问题“为什么”(这是标准答案).我想我必须处理这种特殊性。谢谢!不客气。使用范围-pi..pi没有什么比0..2pi更特殊的了。事实上,可以说它更有意义,因为它将不连续性放在负x轴上,而不是正x轴上,这通常是合理的。Fo例如,atan2(y,x)与log(x+iy)的虚部大致相同,当x+iy是正的和实的时,你真的希望它被定义(并且是连续的)。哦,天哪…我花了一个小时来解决我的错误…谢谢!为什么有人会创建这样的API?有什么理由这样做吗?