JavaScript atan2()函数未给出预期结果
通常,极坐标从0到π到2π(正好在2π之前,因为它再次等于0)。然而,当使用JavaScriptJavaScript 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
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)
notatan2(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?有什么理由这样做吗?