Найти угол между двумя подшипниками

Учитывая два подшипника, как мне найти наименьший угол между ними?

Так, например, если 1 курс составляет 340 градусов, а второй - 10 градусов, наименьший угол будет 30 градусов.

Я приложил картинку, чтобы показать, что я имею в виду. Я пытался вычесть одно из другого, но это не сработало из-за эффекта окружения. Я также пытался использовать отрицательные градусы (180 - 359 от -180 до 0), но это испортилось при попытке вычислить угол между положительным и отрицательным числом.

Я уверен, что должен быть более простой способ if заявления.

Спасибо за помощь. Адам

КСТАТИ. Это вопрос навигации, поэтому радиус круга неизвестен.

Нахождение угла между двумя заголовками

5 ответов

Решение
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)
}

В итоге я использовал следующую формулу, найденную на этой доске объявлений, потому что мне нужно было подписать результат в зависимости от направления (по часовой стрелке или против часовой стрелки). Это хорошее объяснение того, что происходит.

((((bearing - heading) % 360) + 540) % 360) - 180

Как насчет:

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

Вы упоминаете проблему, касающуюся положительных и отрицательных чисел, поэтому, возможно, здесь есть кое-что, чего я не рассматриваю...

Для навигации вы можете узнать, является ли b1 левым или правым от b2, так что здесь это хорошая функция. (Предполагается, что 0 - это не случай использования)

function isBearing1LeftOrRightOfBearing2 (b1, b2) {
  if (Math.sign(((b1 - b2 + 540) % 360) - 180) > 0) {
    return 'left'
  } else {
    return 'right'
  }
}

Если необходимо направление угла, то это будет работать:

    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;

Вам необходимо учитывать разницу в обоих направлениях.

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);
}
Другие вопросы по тегам