获取两个标题之间的差异
Posted
技术标签:
【中文标题】获取两个标题之间的差异【英文标题】:Getting the difference between two headings 【发布时间】:2011-06-28 19:18:40 【问题描述】:我有这种方法可以找出 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;
【问题讨论】:
【参考方案1】:编辑:添加了检查差值何时恰好为 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;
【讨论】:
真的很有用:我已经为此苦苦挣扎了一段时间。 当标题接近 0 时,这对我不起作用。请参阅下面的解决方案,该解决方案基于 this avionics answer。【参考方案2】:这是一个简单的解决方案,尽管在 Dart 中的名称有所不同。基于this avionics answer。
/// 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;
编辑:有一个更简洁的答案here,但我自己没有尝试过:
double headingDiff(double h1, double h2) => (h2 - h1 + 540) % 360 - 180;
【讨论】:
【参考方案3】:如果我正确理解了这个问题,我认为下面的代码应该可以工作:
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 之间的值。
【讨论】:
【参考方案4】:我认为您的期望结果表不正确。这是我笨拙的方式:
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;
【讨论】:
【参考方案5】:Degree_Diff = (MIN(ABS(ENDCOMPASS-STARTCOMPASS),ABS(360-ENDCOMPASS+STARTCOMPASS),ABS(360-STARTCOMPASS+ENDCOMPASS)))
【讨论】:
欢迎来到***!最好为示例代码提供简短描述以提高发布准确性:)以上是关于获取两个标题之间的差异的主要内容,如果未能解决你的问题,请参考以下文章
获取 JavaScript 中两个日期之间的差异? [复制]