Ответ 1
Если у вас есть функция atan2() в вашей математической библиотеке по выбору:
signed_angle = atan2(b.y,b.x) - atan2(a.y,a.x)
Как бы вы нашли подписанный угол theta от вектора a до b?
И да, я знаю, что theta = arccos ((a.b)/(| a || b |)).
Однако это не содержит знака (т.е. он не различает вращение по часовой стрелке или против часовой стрелки).
Мне нужно что-то, что может сказать мне минимальный угол поворота от a до b. Положительный знак указывает на поворот от + оси x к оси + y. И наоборот, отрицательный знак указывает на поворот от оси + к оси -y.
assert angle((1,0),(0,1)) == pi/2.
assert angle((0,1),(1,0)) == -pi/2.
Если у вас есть функция atan2() в вашей математической библиотеке по выбору:
signed_angle = atan2(b.y,b.x) - atan2(a.y,a.x)
То, что вы хотите использовать, часто называют "продуктом точка-точка", т.е. найти вектор, перпендикулярный одному из векторов, а затем найти точечный продукт с другим вектором.
if(a.x*b.y - a.y*b.x < 0)
angle = -angle;
Вы также можете сделать это:
angle = atan2( a.x*b.y - a.y*b.x, a.x*b.x + a.y*b.y );