10

2 つの 0 ~ 360 のコンパス方位の違いを把握するために、この方法があります。

これは、私がどれだけ絶対的に(常に正の出力のように)離れているかを把握するのに役立ちますが、符号を出力に導入するために何をする必要があるかを理解するのに苦労しています。

理想的には、最初の見出しから最後の見出しまでの最短距離が時計回りであるerror場合、正の符号が必要です。見出し間の最短距離が反時計回りである場合は、error負の符号を持つこと。

望ましい入出力の例

initial-- final--error

0 .... 30 .... 30

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

360 ……………… 1 ……………… 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度であるときのチェックを追加しました。以前は、final が initial よりも大きいか小さいかに応じて、180 または -180 が返されていました。どちらの場合も正の 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
Degree_Diff = (MIN(ABS(ENDCOMPASS-STARTCOMPASS),ABS(360-ENDCOMPASS+STARTCOMPASS),ABS(360-STARTCOMPASS+ENDCOMPASS))) 
于 2012-02-28T03:13:59.650 に答える