Найти угол между двумя подшипниками
Учитывая два подшипника, как мне найти наименьший угол между ними?
Так, например, если 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);
}