给定两个轴承,我如何找到它们之间的最小角度?找到两个轴承之间的夹角
因此,例如,如果1航向是340度,第二个是10度,最小角度将是30度。
我附上了一张图片来展示我的意思。我试过从另一个中减去一个,但由于环绕的效果而无法工作。我也尝试过使用负度数(180 - 359为-180到0),但是当试图计算正数和负数之间的角度时,这会变得混乱。
我敢肯定,必须有一个更简单的方法,有很多if
陈述。
感谢您的帮助。 Adam
BTW。这是一个导航问题,因此圆的半径是未知的。
给定两个轴承,我如何找到它们之间的最小角度?找到两个轴承之间的夹角
因此,例如,如果1航向是340度,第二个是10度,最小角度将是30度。
我附上了一张图片来展示我的意思。我试过从另一个中减去一个,但由于环绕的效果而无法工作。我也尝试过使用负度数(180 - 359为-180到0),但是当试图计算正数和负数之间的角度时,这会变得混乱。
我敢肯定,必须有一个更简单的方法,有很多if
陈述。
感谢您的帮助。 Adam
BTW。这是一个导航问题,因此圆的半径是未知的。
float getDifference(float a1, float a2) {
return Math.min((a1-a2)<0?a1-a2+360:a1-a2, (a2-a1)<0?a2-a1+360:a2-a1)
}
谢谢你的工作。我一直试图解决这个问题6个小时! – 2013-04-23 23:25:04
等价:'Math.min((a1 - a2 + 360)%360,(a2 - a1 + 360)%360)'(使用'fmod','IEERemainder'等等,不支持浮点值。) – 2015-11-27 17:55:48
太棒了,你让我的一天。 – FerDensetsu 2017-07-06 17:56:42
什么:
angle = Math.abs(a1-a2);
if (angle > 180)
angle = 360 - angle;
你提到关于正负数的问题,所以可能有一些东西我不考虑在这里......
我相信你的答案与我的答案相同,但也许更容易理解。 看起来像我们已经得到的两者之间的交叉的另一种选择是'Math.min(Math.abs(a1-a2),360 - Math.abs(a1-a2));' – 2013-04-24 15:24:06
它们在他们都是正确和有效的感觉。在我看来,你的实现将该问题视为OP算法正确性的问题,而我认为这是一个格式化已经正确的值的问题。两种方法都是查看问题的有效方法,我认为两种方法在价值上存在足够的差异。 – femtoRgon 2013-04-24 15:43:18
你需要考虑两个方向的差异。
public static double bearingDiff(double a, double b) {
double maxBearing = Math.max(a, b);
double minBearing = Math.min(a, b);
double antiClockwiseDiff = maxBearing - minBearing;
double clockwiseDiff = minBearing + 360 - maxBearing;
return Math.min(antiClockwiseDiff, clockwiseDiff);
}
我结束了使用上this message board发现了以下公式,因为我所需要的结果基于所述方向(顺时针或逆时针),以进行签名。它对发生了什么有一个很好的解释。
((((bearing - heading) % 360) + 540) % 360) - 180
如果需要的角度方向,那么这将工作:
int maxBearing = Math.max(bearing0, bearing1);
int minBearing = Math.min(bearing0, bearing1);
int firstDir = maxBearing - minBearing;
int secondDir = minBearing + 360 - maxBearing;
int diff = Math.min(firstDir, secondDir);
boolean anticlock_dir = false;
int anticlock = bearing1 + diff;
if (anticlock >= 360)
anticlock = anticlock - 360;
if (anticlock == bearing0)
anticlock_dir = true;
Mod运算符将帮助你在这里。很多。 – 2013-04-23 23:04:13
ooops!修复! – 2013-04-23 23:08:52