Javascript 使用Math.atan2进行角度及其反演

Javascript 使用Math.atan2进行角度及其反演,javascript,math,atan2,Javascript,Math,Atan2,这是我用来求向量角及其逆的原始代码。在代码的后面部分,它们用于一些不同的计算。我想删除第二个Math.atan2函数,并将其替换为以下函数以帮助优化代码: var vTheta = Math.atan2(v.vy,v.vx); var obsAngle = Math.atan2(-v.vy,-v.vx); var vTheta=Math.atan2(v.vy,v.vx); 角度=0; 如果(vTheta>=0)obsAngle=Math.PI-vTheta; 否则,如果(vTheta

这是我用来求向量角及其逆的原始代码。在代码的后面部分,它们用于一些不同的计算。我想删除第二个Math.atan2函数,并将其替换为以下函数以帮助优化代码:

var vTheta = Math.atan2(v.vy,v.vx);
var obsAngle = Math.atan2(-v.vy,-v.vx);
var vTheta=Math.atan2(v.vy,v.vx);
角度=0;
如果(vTheta>=0)obsAngle=Math.PI-vTheta;
否则,如果(vTheta<0)obsAngle=Math.PI+vTheta;
当我打印两个版本的obsAngle结果时,obsAngle是相同的(或足够接近),但是程序的行为并不相同。在这两种情况下,角度都在-pi和pi之间


这两个版本之间会有什么差异导致问题

atan2
将返回范围内的值[−π,π]. 如果θ≥ 0,即θ∈ [0,π]然后π− θ ∈ [0,π]. 同样,如果θ<0,即θ∈ [−π、 0)然后π+θ∈ [0,π)。所以你的第二次计算永远不会得到负值

第一次计算得到的角度与vTheta-obsAngle=±π有关。要模拟这一点,您必须编写

var vTheta = Math.atan2(v.vy,v.vx);    
var obsAngle = 0;
    if (vTheta >= 0) obsAngle = Math.PI - vTheta;
    else if (vTheta < 0) obsAngle = Math.PI + vTheta;

我是个傻瓜…简单的数学…应该是vTheta-math.PI…产生正确的反转。是的,atan2(-y,-x)=atan2(y,x)+PI+2*k*PI,其中k是任何正整数或负整数。var vTheta=math.atan2(v.vy,v.vx);var obsAngle=0;if(vTheta>=0)obsAngle=vTheta-math.PI;else if(vTheta<0)obsAngle=Math.PI+vTheta;是的,这就是使用k=0表示正θ,k=-1表示负θ以保持在范围[-PI,PI]内。
if (vTheta >= 0) obsAngle = vTheta - Math.PI;
else             obsAngle = vTheta + Math.PI;