Antes de leer esta respuesta - Imagina tu ángulo en un espacio 3D - puedes verlo desde el "frente" y desde la "parte de atrás" (el frente y la parte de atrás están definidos por ti). El ángulo desde el frente será lo opuesto al ángulo que ves desde la parte de atrás. Por lo tanto, no tiene sentido real un valor en un rango mayor que $[0,180]$.
Si aún quieres seguir leyendo, disfruta
En el caso 3D, tus dos vectores estarían en algún plano (el plano del cual puedes obtener su normal a partir del producto cruz de los dos vectores). Obtener un ángulo de $[0,180]$ grados es posible por supuesto calculando $arccos(\frac{\vec{a}*\vec{b}}{|\vec{a}| *|\vec{b}|})$.
Creo que lo que puedes hacer es fijar el eje Z, de manera que los dos vectores solo difieran en X y Y. Luego resuelves un problema de geometría 2D. Deberías ser capaz de fijar el eje Z dividiendo los dos vectores por su componente Z. Dado que la componente Z es solo un escalar, las direcciones de los vectores seguirán siendo las mismas (aunque la tendencia podría cambiar si este escalar es negativo). Debes recordar si ambos escalares eran positivos, ambos negativos o uno positivo y otro negativo. En el último caso, ¡tus resultados finales se invertirán!
Si la componente Z de los dos vectores es $0$, entonces este paso puede (y de hecho debe) omitirse. Sin embargo, si solo uno de ellos tiene $0$ en su componente Z, entonces probablemente sea imposible calcular el ángulo muy preciso, pero aún puedes calcular una aproximación, dividiendo el otro vector por un número muy grande.
Teniendo eso, puedes restar el vector $\vec{a}$ de ambos vectores $\vec{a}$ y $\vec{b}$ y luego agregar el vector $(1, 0, 0)$ a ambos. Así, el vector $\vec{a}$ será $(1, 0, 0)$, mientras que el vector $\vec{b}$ será $(b_x, b_y, 0)$.
Ahora, si $b_y$ es positivo, entonces tu ángulo es $arccos(\frac{\vec{a}*\vec{b}}{|\vec{a}| *|\vec{b}|})$. De lo contrario, es $360 - arccos(\frac{\vec{a}*\vec{b}}{|\vec{a}| *|\vec{b}|})$. ¡Recuerda usar el resultado opuesto si solo uno de los valores Z originales era negativo, como se describió anteriormente!
1 votos
¿Significa que estás buscando una fórmula matemática para algo similar a la función "atan2" en C++?
7 votos
Dos vectores forman dos ángulos que suman $360^\circ$. El "ángulo entre vectores" se define como el más pequeño de los dos, por lo tanto no mayor a $180^\circ. Aparentemente, a veces quieres el más grande en su lugar. Tendrás que aclarar tu definición de "ángulo entre vectores".
2 votos
Podrías verificar en qué cuadrantes estaban tus vectores originales para ver si necesitas sumarle los 180.