2011-09-27 11 views
16

¿Cómo puedo calcular la diferencia de dos medidas de ángulo (en grados) en Java por lo que el resultado está en el rango [0 °, 180 °]?¿Cómo calculo la diferencia de dos medidas de ángulo?

Por ejemplo:

350° to 15° = 25° 
250° to 190° = 60° 
+1

Si está calculando la distancia, ¿por qué el resultado es en grados? –

+0

¿Puedes aclarar si estás buscando algo integrado o solo estás pidiendo un método? también debe tener en cuenta la dirección? Su primer ejemplo es 25 grados en el sentido de las agujas del reloj y el segundo 60 grados en el sentido contrario a las agujas del reloj. Si solo quiere la distancia más corta, sus resultados deberían ser de 0 a 180 (o -180 a 180 si desea mostrar la dirección). – Chris

+0

Por cierto, no debe permitir 360 porque 360 ​​= 0. El dominio de los argumentos de entrada debe ser [0, 360). – m0skit0

Respuesta

34
/** 
    * Length (angular) of a shortest way between two angles. 
    * It will be in range [0, 180]. 
    */ 
    private int distance(int alpha, int beta) { 
     int phi = Math.abs(beta - alpha) % 360;  // This is either the distance or 360 - distance 
     int distance = phi > 180 ? 360 - phi : phi; 
     return distance; 
    } 
+3

y para "Diferencia con signo", añada el siguiente código ... int sign = (a - b> = 0 && a - b <= 180) || (a - b <= -180 && a- b> = -360)? 1: -1; r * = signo; – usman

+0

Esto realmente me ayudó, gracias. – super

4

Sólo haz

(15 - 350) % 360 

Si la dirección no importa (desea que el que se obtiene el valor más pequeño), y luego hacer la resta inversa (mod 360) y calcule el valor más pequeño de los dos (por ejemplo, con Math.min).

+0

¿Puedes explicar un poco más? no te entiendo "luego haz la resta inversa (mod 360) y calcula el valor más pequeño". – NullPointerException

+0

@Y me refiero a hacer también (350 - 15)% 360. – Artefacto

+0

min ((ab)% 360, (ba)% 360) @ AndroidUser99 – squid

3

Cómo sobre lo siguiente:

dist = (a - b + 360) % 360; 
if (dist > 180) dist = 360 - dist; 
6

acaba de tomar el valor absoluto de su diferencia, entonces, si es mayor que 180, restar 360 ° y tomar el valor absoluto del resultado.

0

diff = MAX (ángulo1, ángulo2) - MIN (ángulo1, ángulo2);
if (diff> 180) diff = 360 - diff; "Firmado diferencia"

10

Además de respuesta Nickes, si quieres

int d = Math.abs(a - b) % 360; 
int r = d > 180 ? 360 - d : d; 

//calculate sign 
int sign = (a - b >= 0 && a - b <= 180) || (a - b <=-180 && a- b>= -360) ? 1 : -1; 
r *= sign; 

EDITADO:

Donde 'a' y 'b' son dos ángulos para hallar la diferencia de.

'd' es la diferencia. 'r' es resultado/diferencia final.

+1

¿Qué representan 'd' y' r' en este contexto? Diferencia y rotación? –

+1

Supongo que 'a' y' b' representan 'targetAngle' y' currentAngle' respectivamente. –

+0

@StevenVascellaro sí, eso es correcto – usman

Cuestiones relacionadas