Java 找出两个轴承之间的角度

Java 找出两个轴承之间的角度,java,math,navigation,trigonometry,Java,Math,Navigation,Trigonometry,给定两个方位,如何找到它们之间的最小角度 例如,如果一个航向为340度,第二个航向为10度,最小角度为30度 我附上一张照片来说明我的意思。我试着从另一个中减去一个,但由于一个圆的环绕效果,这不起作用。我也尝试过使用负度数(180-359是-180比0),但当我试图计算正负数之间的角度时,这就搞砸了 我相信一定有一种更简单的方法可以让你拥有大量的if语句 谢谢你的帮助。 亚当 顺便说一句,这是一个导航问题,所以圆的半径是未知的 float getDifference(float a1, floa

给定两个方位,如何找到它们之间的最小角度

例如,如果一个航向为340度,第二个航向为10度,最小角度为30度

我附上一张照片来说明我的意思。我试着从另一个中减去一个,但由于一个圆的环绕效果,这不起作用。我也尝试过使用负度数(180-359是-180比0),但当我试图计算正负数之间的角度时,这就搞砸了

我相信一定有一种更简单的方法可以让你拥有大量的
if
语句

谢谢你的帮助。 亚当

顺便说一句,这是一个导航问题,所以圆的半径是未知的

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)
}

float-getDifference(浮点a1、浮点a2){
返回Math.min((a1-a2)关于:

angle = Math.abs(a1-a2);
if (angle > 180)
    angle = 360 - angle;

你提到了一个关于正数和负数的问题,所以也许我在这里没有考虑到……

< P>你需要考虑两个方向上的差异。

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);
}

我最终使用了在上找到的以下公式,因为我需要根据方向(顺时针或逆时针)对结果进行签名。它很好地解释了到底发生了什么

((((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;

对于导航,您可能想知道b1是b2的左边还是右边,所以这里它是在一个很好的函数中


mod操作符会在这里帮助你。很多。谢谢你的帮助。我已经试着解决这个问题6个小时了!等价地:
Math.min((a1-a2+360)%360,(a2-a1+360)%360)
(对于
%
不支持浮点值的其他语言,使用
fmod
IEERemainder
等。)太棒了,你让我开心了。我相信你的答案和我的一样,虽然可能更容易理解。另一个看起来像是我们已经得到的两者交叉的选项是
Math.min(Math.abs(a1-a2),360-Math.abs(a1-a2))
它们在正确和有效的意义上是等价的。在我看来,您的实现将此问题视为OP算法的正确性问题,而我将其视为格式化已正确的值的问题。这两种方法都是看待此问题的有效方法,并且我认为在方法上有足够的差异h这两者都有价值。如果|方位-航向,则不需要初始的
%360
|
function isBearing1LeftOrRightOfBearing2 (b1, b2) {
  if (Math.sign(((b1 - b2 + 540) % 360) - 180) > 0) {
    return 'left'
  } else {
    return 'right'
  }
}