Нахождение подписанного угла между векторами - PullRequest
26 голосов
/ 27 января 2010

Как бы вы нашли подписанный угол тета от вектора a до b?

И да, я знаю, что theta = arccos ((a.b) / (| a || b |)).

Однако, он не содержит знака (то есть он не различает вращение по часовой стрелке или против часовой стрелки).

Мне нужно что-то, что может сказать мне минимальный угол поворота от a до b. Положительный знак указывает на поворот от оси + x к оси + y. И наоборот, отрицательный знак указывает на поворот от оси + x к оси -y.

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

Ответы [ 2 ]

51 голосов
/ 28 января 2010

То, что вы хотите использовать, часто называют «продуктом точки perp», то есть найдите вектор, перпендикулярный одному из векторов, а затем найдите произведение точки с другим вектором.

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 );
33 голосов
/ 27 января 2010

Если в выбранной вами математической библиотеке есть функция atan2 ():

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