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

时间:2012-04-27 01:04:16

标签: javascript coordinates atan2 radians polar-coordinates

通常,极坐标从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 × π)

如您所见,在达到π(180°)后,它会跳到 - π(-180°),然后再回到0。我怎样才能使用 {0,...,2 π} 而不是 { - π ,. ..,π} ?我一直在尝试考虑每个计算来“修复”这些值,但我也想知道为什么JavaScript会选择这个范围而不是典型的极坐标范围。谢谢!

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

如果结果为否定,只需在结果中添加2 * PI

function atan2Normalized(x,y) {
    var result = Math.atan2(x, y);
    if (result < 0) {
        result += (2 * Math.PI);
    }
    return(result);
}

答案 2 :(得分:4)

atan2(y, x)而非atan2(x, y)

答案 3 :(得分:0)

  

如何使用范围{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; 范围内的值。

因此您可以使用:

$scope.result = [];
factoryCities.then(function(data){
    $scope.result = data;    
});