2013-04-23 44 views
7

给定两个轴承,我如何找到它们之间的最小角度?找到两个轴承之间的夹角

因此,例如,如果1航向是340度,第二个是10度,最小角度将是30度。

我附上了一张图片来展示我的意思。我试过从另一个中减去一个,但由于环绕的效果而无法工作。我也尝试过使用负度数(180 - 359为-180到0),但是当试图计算正数和负数之间的角度时,这会变得混乱。

我敢肯定,必须有一个更简单的方法,有很多if陈述。

感谢您的帮助。 Adam

BTW。这是一个导航问题,因此圆的半径是未知的。

Finding the angle between two headings

+0

Mod运算符将帮助你在这里。很多。 – 2013-04-23 23:04:13

+0

ooops!修复! – 2013-04-23 23:08:52

回答

6
float getDifference(float a1, float a2) { 
    return Math.min((a1-a2)<0?a1-a2+360:a1-a2, (a2-a1)<0?a2-a1+360:a2-a1) 
} 
+0

谢谢你的工作。我一直试图解决这个问题6个小时! – 2013-04-23 23:25:04

+1

等价:'Math.min((a1 - a2 + 360)%360,(a2 - a1 + 360)%360)'(使用'fmod','IEERemainder'等等,不支持浮点值。) – 2015-11-27 17:55:48

+0

太棒了,你让我的一天。 – FerDensetsu 2017-07-06 17:56:42

4

什么:

angle = Math.abs(a1-a2); 
if (angle > 180) 
    angle = 360 - angle; 

你提到关于正负数的问题,所以可能有一些东西我不考虑在这里......

+0

我相信你的答案与我的答案相同,但也许更容易理解。 看起来像我们已经得到的两者之间的交叉的另一种选择是'Math.min(Math.abs(a1-a2),360 - Math.abs(a1-a2));' – 2013-04-24 15:24:06

+0

它们在他们都是正确和有效的感觉。在我看来,你的实现将该问题视为OP算法正确性的问题,而我认为这是一个格式化已经正确的值的问题。两种方法都是查看问​​题的有效方法,我认为两种方法在价值上存在足够的差异。 – femtoRgon 2013-04-24 15:43:18

0

你需要考虑两个方向的差异。

public static double bearingDiff(double a, double b) { 
    double maxBearing = Math.max(a, b); 
    double minBearing = Math.min(a, b); 
    double antiClockwiseDiff = maxBearing - minBearing; 
    double clockwiseDiff = minBearing + 360 - maxBearing; 
    return Math.min(antiClockwiseDiff, clockwiseDiff); 
} 
10

我结束了使用上this message board发现了以下公式,因为我所需要的结果基于所述方向(顺时针或逆时针),以进行签名。它对发生了什么有一个很好的解释。

((((bearing - heading) % 360) + 540) % 360) - 180 
0

如果需要的角度方向,那么这将工作:

int maxBearing = Math.max(bearing0, bearing1); 
    int minBearing = Math.min(bearing0, bearing1); 
    int firstDir = maxBearing - minBearing; 
    int secondDir = minBearing + 360 - maxBearing; 
    int diff = Math.min(firstDir, secondDir); 

    boolean anticlock_dir = false; 

    int anticlock = bearing1 + diff; 
    if (anticlock >= 360) 
     anticlock = anticlock - 360; 

    if (anticlock == bearing0) 
     anticlock_dir = true;