找到两个角度之间的最短距离

时间:2015-01-20 02:07:13

标签: c#

我一直试图找到一种找到两个角度之间最短距离的方法。角度在-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}

4 个答案:

答案 0 :(得分:12)

public static double AngleDifference( double angle1, double angle2 )
{
    double diff = ( angle2 - angle1 + 180 ) % 360 - 180;
    return diff < -180 ? diff + 360 : diff;
}

这可以通过注意到我们想要取两个角度angle1angle2之间的差异并将该结果包装到范围[-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