找到两个轴承之间的角度

Posted

技术标签:

【中文标题】找到两个轴承之间的角度【英文标题】:Find the Angle between two Bearings 【发布时间】:2013-04-17 07:57:22 【问题描述】:

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

例如,如果第一个航向是 340 度,第二个是 10 度,那么最小的角度就是 30 度。

我附上了一张图片来说明我的意思。我试过从另一个中减去一个,但由于圆圈的环绕效果,这不起作用。我也尝试过使用负度数(180 - 359 是 -180 到 0),但是在尝试计算正数和负数之间的角度时会搞砸。

我确信一定有一种更简单的方法来处理大量 if 语句。

感谢您的帮助。 亚当

顺便说一句。这是一个导航问题,所以圆的半径是未知的。

【问题讨论】:

mod 操作员将在这里为您提供帮助。很多。 【参考方案1】:

我最终使用了this message board 上的以下公式,因为我需要根据方向(顺时针或逆时针)对结果进行签名。它很好地解释了到底发生了什么。

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

【讨论】:

如果|bearing - heading| 则不需要初始% 360 【参考方案2】:
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)

【讨论】:

感谢您的款待。我已经尝试解决这个问题了 6 个小时! 等价于:Math.min((a1 - a2 + 360) % 360, (a2 - a1 + 360) % 360)(使用fmodIEERemainder等,用于%不支持浮点值的其他语言。) 太棒了,你成就了我的一天。【参考方案3】:

怎么样:

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

你提到了一个关于正数和负数的问题,所以也许我在这里没有考虑到一些事情......

【讨论】:

我相信你的答案和我的一样,虽然可能更容易理解。另一个看起来像是我们已经拥有的两者之间的交叉的选项是Math.min(Math.abs(a1-a2), 360 - Math.abs(a1-a2)); 它们在正确和有效的意义上是等价的。在我看来,您的实现将问题视为 OP 算法的正确性问题,而我认为这是格式化已经正确值的问题。两者都是看待问题的有效方法,而且我认为方法有足够的差异,两者都是有价值的。【参考方案4】:

对于导航,你可能想知道 b1 是在 b2 的左边还是右边,所以这里是一个很好的函数。 (假设正好 0 不是用例)

function isBearing1LeftOrRightOfBearing2 (b1, b2) 
  if (Math.sign(((b1 - b2 + 540) % 360) - 180) > 0) 
    return 'left'
   else 
    return 'right'
  

【讨论】:

【参考方案5】:

如果需要角度方向,那么这将起作用:

    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;

【讨论】:

【参考方案6】:

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

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);

【讨论】:

以上是关于找到两个轴承之间的角度的主要内容,如果未能解决你的问题,请参考以下文章

两个轴承之间的差异(角度)

OSMnx:节点之间的角度

如何计算两个轴承之间的最小旋转

找到两个位置之间的角度

如何找到两个角度之间的差异?

ActionScript 3 AS3找到两个角度之间的最短旋转角度