2010-01-27 11 views
25

¿Cómo encontraría el ángulo theta con signo del vector a a b?Encontrar el ángulo firmado entre los vectores

Y sí, sé que theta = arccos ((a.b)/(| a || b |)).

Sin embargo, esto no contiene un signo (es decir, no distingue entre una rotación hacia la derecha o hacia la izquierda).

Necesito algo que pueda decirme el ángulo mínimo para girar de a a b. Un signo positivo indica una rotación desde el eje + x hacia el eje + y. Por el contrario, un signo negativo indica una rotación desde + x-axis hacia -y-axis.

assert angle((1,0),(0,1)) == pi/2. 
assert angle((0,1),(1,0)) == -pi/2. 

Respuesta

30

Si usted tiene una función atan2() en la biblioteca de matemáticas de elección:

signed_angle = atan2(b.y,b.x) - atan2(a.y,a.x) 
+0

perfecto, gracias. – Cerin

+9

¿Qué pasa con a = (-1,1) y b = (-1, -1), donde la respuesta debería ser pi/2? Debería verificar si el valor absoluto es mayor que pi, y luego sumar o restar 2 * pi si es así. –

+0

@Derek Buena captura. De hecho, descubrí esto al implementar la solución. – Cerin

50

Lo que se quiere utilizar a menudo se llama el “producto punto perp”, es decir, encontrar el vector perpendicular a uno de los vectores, y luego encuentra el producto de puntos con el otro vector.

if(a.x*b.y - a.y*b.x < 0) 
    angle = -angle; 

También puede hacer esto:

angle = atan2(a.x*b.y - a.y*b.x, a.x*b.x + a.y*b.y); 
+0

¿sabes si la segunda ecuación siempre devuelve ángulos menores de 180º? – rraallvv

+2

El ángulo estará entre -pi y pi radianes, inclusive. –

+0

genial que resuelve el problema cuando a = (-1,1) y b = (-1, -1) apuntan por encima de – rraallvv

Cuestiones relacionadas