计算两个旋转度的绝对距离,作为数字(在JavaScript中)

时间:2017-03-03 01:00:08

标签: javascript math rotation distance

我想计算两度值之间的距离。我知道如果点在一个轴上的位置,我可以使用它:

var dist = Math.abs( x1 - x2 );

...但是度数的问题是,它们可以是负数或正数,也可以是360以上。我的目标是计算距离,无论旋转是负还是高于360°

修改

让我更清楚我想要的东西:例如,我可以拥有值-90deg270deg。这应该导致距离0的结果。如果第一个元素的轮换将更改为-100deg的{​​{1}},则距离应更改为-80deg

4 个答案:

答案 0 :(得分:2)

如果你想让它适用于任何角度(包括像750度的角度)和这种语言,你有一个已经签名的余数运算符(如Java或JavaScript),那么你需要做更多的工作。如果您使用的是未签名操作员的语言,那么Rory Daulton的答案就是好的。 (总而言之,请在rot1%360下面使用modulo(rot1,360)rot2同样使用-10 % 360 = -10。)

首先,您需要将每个负角度设为等效的正角度。没有单一的运算符可以执行此操作,例如,在这些语言中y。你可以使用这样的函数得到它(假设function modulo(x,y) { var xPrime = x; while(xPrime<0) { xPrime += y; // ASSUMES y > 0 } return xPrime % y; } 为正):

%

然后您可以按照其他人的建议做更多或更少,但使用此自定义函数而不是var distance = Math.abs(modulo(rot1,360) - modulo(rot2,360)) distance = Math.min(distance, 360-distance) 运算符。

swap(x[i], x[problem5(&x[i], tmpsize, m, n)]);

答案 1 :(得分:1)

似乎适用于所有情况的Python代码是

dist = abs(x1 % 360 - x2 % 360)
dist = min(dist, 360 - dist)

需要最后一行来处理像x1=10; x2=350这样的案例。其他答案会给340,但正确的答案是20

答案 2 :(得分:1)

旧话题,但是,由于while循环,对于我遇到的一个问题,接受的答案并不是真正可以接受的,可悲的是,这是我在Google搜索中可以找到的最好的答案。但是,如果您还必须处理非常高的负旋转值,我会找到一个更好,更快的解决方案。

这行代码采用旋转值(r),并将其映射到0-360的范围。

r = (r<0) ? (r+(Math.ceil(-r/360)*360)) : (r%360);

进一步说明: 可接受的答案将每个循环的负旋转值增加360,直到变为正值为止,而我的解决方案计算出需要增加360的频率,并一次性完成。

答案 3 :(得分:-1)

所以,我按照this answer

进行了研究
function modulo(value, mod) {
    return value - Math.floor( value/mod ) * value;
}
var dist = rotation1 - rotation2;
dist = Math.abs( modulo( (dist + 180), 360 ) - 180 );

修改

实际上,this answer也可以。移植到JavaScript它将是:

var dist = Math.abs(rotation1 % 360 - rotation2 % 360);
dist = Math.min(dist, 360 - dist);

我喜欢它,因为它不需要特殊的模数函数。