我一直试图找到一种找到两个角度之间最短距离的方法。角度在-360°的范围内。 360并以度数给出。
简而言之,我需要一种简单的方法(越简单越好)找到两个角度之间的最短距离,让我们称它们为angle1和angle2。 Angle1是我想要达到的角度,角度2是我所处的角度。在此之后,我想使用if函数来确定实体的旋转方向。
伪代码:
CloseDistance = (Find shortest distance between angle1 (where i want to go) and angle2 (where i am))
if (CloseDistance > Something)
{Rotate to the right} else {Rotate to the left}
答案 0 :(得分:12)
public static double AngleDifference( double angle1, double angle2 )
{
double diff = ( angle2 - angle1 + 180 ) % 360 - 180;
return diff < -180 ? diff + 360 : diff;
}
这可以通过注意到我们想要取两个角度angle1
和angle2
之间的差异并将该结果包装到范围[-180,179)。 mod运算符允许我们将某些东西包装到[0,n]范围内。即x % n
&#34;包装&#34; (注意x < 0
)x到范围[0,n)。
我们的范围从-180而不是0开始,所以我们通过添加180来转移它。然后我们换到360,然后我们转回去。这就是方法第一行的作用。
第二行用负数来处理那个小皱纹。如果angle2 - angle1 + 180
碰巧小于0,则diff
将小于180.在这种情况下,我们只需将360重新加入范围即可将其重新包含在范围内。否则我们什么都不做。
作为额外的奖励,输入角度完全不受约束。它们不需要在-360到360之间。它们可以是任何东西。
答案 1 :(得分:1)
我找到的最简单的方法是
double closedistance = (destangle - startangle) % 360
abs(closedistance)
为您提供所需的距离。
闭合的符号(= closedistance/abs(closedistance)
)给出旋转方向(+逆时针, - 顺时针)或只是像这样检查
if (closedistance > 0) {} // anticlockwise
else {} // clockwise
这适用于任何角度值。
答案 2 :(得分:0)
似乎你需要在-180 .. + 179区间内的结果角度。负号表示右旋,正表示左(或反之亦然)。
因此,你需要modular arithmetic模数360。
在C#remaidner operator做你需要的:
var distance = (destinationAngle - sourceAngle) % 360;
不幸的是,它给出了间隔-359 .. + 359的结果。要更正此问题,您可以将太大的值转换为区间-180 .. + 179:
var distance = (destinationAngle - sourceAngle) % 360;
if (distance < -180)
distance += 360;
else if (distance > 179)
distance -= 360;
出现间隔(-180和+179)的不对称端,因为-180和+180都是相同的角度,所以你应该选择其中一个以避免歧义。
F.e。
Destination | Source | Result
45 | 30 | 15
30 | 45 | -15
-45 | -30 | -15
-30 | -45 | 15
360 + 45 = 405 | 30 | 15
-405 | -30 | -15
我可以看到你需要的东西。如果您的角度是双倍的,请使用Math.IEEERemainder方法。
答案 3 :(得分:0)
两个角度之间的最大距离是180度,只需选择0到360之间的角度
int angle1 = n;
int angle2 = n2;
if(angle1 < 0)
angle1 += 360;
if(angle2 < 0)
angle2 += 360;
if (angle2 > angle1 && angle2 - angle1 <= 180 )
//go clockwise
else if (angle2 > angle1 && angle2 - angle1 > 180 )
//go counter clockwise
else if (angle1 > angle2 && angle1 - angle2 <= 180 )
//go counter clockwise
else if (angle1 > angle2 && angle1 - angle2 > 180 )
//go clockwise