我想计算两度值之间的距离。我知道如果点在一个轴上的位置,我可以使用它:
var dist = Math.abs( x1 - x2 );
...但是度数的问题是,它们可以是负数或正数,也可以是360以上。我的目标是计算距离,无论旋转是负还是高于360°
修改
让我更清楚我想要的东西:例如,我可以拥有值-90deg
和270deg
。这应该导致距离0
的结果。如果第一个元素的轮换将更改为-100deg
的{{1}},则距离应更改为-80deg
。
答案 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);
我喜欢它,因为它不需要特殊的模数函数。