Encontrar el ángulo firmado entre vectores

¿Cómo encontrarías el ángulo theta firmado del vector a a b?

Y sí, sé que theta = arccos ((ab) / (| 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 indicarme el ángulo mínimo para rotar de a a b. Un signo positivo indica una rotación desde el eje + x hacia el eje + y. A la inversa, un signo negativo indica una rotación desde el eje + x hacia el eje -y.

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

    Related of "Encontrar el ángulo firmado entre vectores"

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

     signed_angle = atan2(by,bx) - atan2(ay,ax) 

    Lo que quiere usar a menudo se denomina “producto de punto perp”, es decir, busque el vector perpendicular a uno de los vectores y luego encuentre el producto de punto con el otro vector.

     if(ax*by - ay*bx < 0) angle = -angle; 

    También puedes hacer esto:

     angle = atan2( ax*by - ay*bx, ax*bx + ay*by );