寻找向量之间的有符号角度

39 投票
2 回答
40756 浏览
提问于 2025-04-15 18:33

你怎么才能找到从向量a到向量b的带符号角度theta呢?

我知道theta可以用这个公式算: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 个回答

76

你想要使用的通常被称为“垂直点积”,也就是说,先找出一个向量的垂直向量,然后再和另一个向量计算点积。

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 );
38

如果你在自己选择的数学库中有一个叫做atan2()的函数:

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

撰写回答