10

我有这种方法可以找出 2 0-360 罗盘方向之间的差异。

尽管这可以确定我离我有多远(如始终为正输出),但我无法确定需要做什么才能将符号引入输出。

理想情况下,如果从初始航向到最终航向的最短距离是顺时针方向,我希望error有一个正号,如果航向之间的最短距离涉及逆时针方向,我希望error有一个负号。

所需输入/输出的一些示例

initial-- final--error

0 .................... 30 .... 30

30 .................... 0 .... -30

360 ……………………………………1

1 .................... 360 .... -1

代码:

    /// <summary>
    /// Calculate the error from a given initial heading to a final heading
    /// </summary>
    /// <param name="inital"></param>
    /// <param name="final"></param>
    /// <returns></returns>
    private double GetHeadingError(double initial, double final)
    {
        double directionA = final - initial;
        double directionB = 360 - (final + initial);
        double error = 0;

        if (Math.Abs(directionA) < Math.Abs(directionB))
        {
            error = directionA;
        }
        else
        {
            error = directionB;
        }

        return error;
    }
4

5 回答 5

16

编辑:添加了检查差异何时恰好为 180 度。以前,这将返回 180 或 -180,具体取决于 final 是否大于或低于初始值。我已经对其进行了修改,使其在两种情况下都返回正值 180。


所以这是我的尝试...

private static double GetHeadingError(double initial, double final)
        {
            if (initial > 360 || initial < 0 || final > 360 || final < 0)
            {
                //throw some error
            }

            var diff = final - initial;
            var absDiff = Math.Abs(diff);

            if (absDiff <= 180)
            {
                //Edit 1:27pm
                return absDiff == 180 ? absDiff : diff;
            }

            else if (final > initial)
            {
                return absDiff - 360;
            }

            else
            {
                return 360 - absDiff;
            }
        }
于 2011-02-17T03:07:45.517 回答
4

这是一个简单的解决方案,尽管在 Dart 中的名称有所不同。基于这个航空电子设备的答案

/// The difference of two headings in degrees such that it is always in the range
/// (-180, 180]. A negative number indicates [h2] is to the left of [h1].
double headingDiff(double h1, double h2) {
  double left = h1 - h2;
  double right = h2 - h1;
  if (left < 0) left += 360;
  if (right < 0) right += 360;
  return left < right ? -left : right;
}

编辑:这里有一个更简洁的答案,但我自己没有尝试过:

double headingDiff(double h1, double h2) => (h2 - h1 + 540) % 360 - 180;
于 2019-02-22T04:55:11.797 回答
2

如果我正确理解了这个问题,我认为以下代码应该可以工作:

private double GetHeadingError(double initial, double final)
{
            if(initial == 360) initial = 0;
            if(final == 360) final = 0;
            double clockWise = (final - initial);
            double counterClockWise = (360 - final + initial);
            return (Math.Abs(clockWise) <= Math.Abs(counterClockWise)) ? clockWise : -counterClockWise;
}

基本上我将 360 度视为 0,我认为这是可以的。此代码将产生与上表中列出的相同的结果。代码不做边界检查,它需要 0 到 360 之间的值。

于 2011-02-17T03:13:47.333 回答
1

我认为您的期望结果表不正确。这是我笨拙的方式:

private double MyGetHeadingError(double initial, double final)
{
    initial += 1000;
    final += 1000;

    bool flipped = false;
    if (initial > final)
    {
        double temp;
        temp = final;
        final = initial;
        initial = temp;
        flipped = true;
    }
    double error;
    if (final - initial > 180)
        final = final - 360;

    error = final - initial;

    if (flipped == true)
        error = -error;
    return error;
}
于 2011-02-17T02:39:38.783 回答
1
Degree_Diff = (MIN(ABS(ENDCOMPASS-STARTCOMPASS),ABS(360-ENDCOMPASS+STARTCOMPASS),ABS(360-STARTCOMPASS+ENDCOMPASS))) 
于 2012-02-28T03:13:59.650 回答