java - round - Encuentra el ángulo entre dos rodamientos
math round en java (5)
Qué pasa:
angle = Math.abs(a1-a2);
if (angle > 180)
angle = 360 - angle;
Mencionas un problema con los números positivos y negativos, así que tal vez hay algo que no estoy considerando aquí ...
Dado dos cojinetes, ¿cómo encuentro el ángulo más pequeño entre ellos?
Entonces, por ejemplo, si 1 rumbo es 340 grados y el segundo es 10 grados, el ángulo más pequeño será 30 grados.
He adjuntado una imagen para mostrar lo que quiero decir. Intenté restar uno del otro, pero eso no funcionó debido al efecto de envoltura de un círculo. También he intentado usar grados negativos (180 - 359 siendo -180 a 0) pero eso se estropeó al tratar de calcular el ángulo entre el número positivo y el negativo.
Estoy seguro de que debe haber una forma más fácil de tener muchas declaraciones if
.
Gracias por tu ayuda. Adán
Por cierto. Esta es una pregunta de navegación por lo que el radio del círculo es desconocido.
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)
}
Debes considerar la diferencia en ambas direcciones.
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);
}
Terminé usando la siguiente fórmula que encontré en este tablero de mensajes porque necesitaba que el resultado se firmara según la dirección (en sentido horario o antihorario). Tiene una buena explicación de lo que está pasando exactamente.
((((bearing - heading) % 360) + 540) % 360) - 180
Si se necesita la dirección del ángulo, entonces esto funcionará:
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;