获得两个标题之间的区别

我有这种方法来计算2 0-360指南针标题之间的区别。

虽然这可以用来确定我的绝对距离(例如,总是正输出),但我无法弄清楚要将标志引入输出需要做些什么。

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

一些期望的输入/输出的例子

initialfinalerror

0 ……………….. 30 ………. 30

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

360 ……………….. 1 ………. 1

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

码:

  ///  /// Calculate the error from a given initial heading to a final heading ///  ///  ///  ///  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; } 

编辑:添加检查差异恰好是180度。 以前这是返回180或-180,这取决于final是大于还是小于initial。 我修改了它,以便在两种情况下都返回正值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; } } 

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

 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之间。

我认为你想要的结果表不正确。 这是我笨重的方式:

 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; } 
 Degree_Diff = (MIN(ABS(ENDCOMPASS-STARTCOMPASS),ABS(360-ENDCOMPASS+STARTCOMPASS),ABS(360-STARTCOMPASS+ENDCOMPASS))) 
Interesting Posts