我有这种方法可以找出 2 0-360 罗盘航向之间的差异。
虽然这有助于确定我的绝对偏差(例如,始终为正输出),但我无法确定需要做什么才能将符号引入输出。
理想情况下,如果从初始航向到最终航向的最短距离是顺时针方向,我希望 error
具有正号,如果航向之间的最短距离涉及逆时针旋转,我希望 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;
}
最佳答案
编辑:添加了对差值恰好为 180 度的检查。以前这是返回 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;
}
}
关于c# - 获取两个标题之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5024375/