Для правильного определения угла необходимо использовать как точечные, так и перекрестные произведения.
Угол между векторами u и v равен
||atan2(s,c)||
where `s = ||u X v||` (magnitude of the cross product)
and `c = u.v` (dot product)
и atan2
- 4-квадрантная обратная функция загара
и ||*||
обозначает величину (норма).
Это всегда будет возвращать угол от 0 до 180 градусов.