寻找矢量之间的符号角

Cer*_*rin 27 python java math trigonometry angle

你怎么能找到从矢量a到b的有角度θ?

是的,我知道theta = arccos((ab)/(| a || b |)).

但是,这不包含符号(即它不区分顺时针或逆时针旋转).

我需要能告诉我从a到b旋转的最小角度.正号表示从+ x轴向+ y轴的旋转.相反,负号表示从+ x轴向-y轴的旋转.

assert angle((1,0),(0,1)) == pi/2.
assert angle((0,1),(1,0)) == -pi/2.
Run Code Online (Sandbox Code Playgroud)

Der*_*ter 53

您想要使用的通常称为"perp点积",即找到垂直于其中一个向量的向量,然后找到带有另一个向量的点积.

if(a.x*b.y - a.y*b.x < 0)
    angle = -angle;
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

angle = atan2( a.x*b.y - a.y*b.x, a.x*b.x + a.y*b.y );
Run Code Online (Sandbox Code Playgroud)

  • 角度将介于-pi和pi弧度之间. (2认同)
  • 所有其他重复的问题应该链接到这个问题和这个答案; 这是如此稀少的文件(甚至没有维基百科文章) (2认同)
  • 你能详细说明第二版的工作原理吗?特别是你传入atan2的计算. (2认同)
  • @Tara 第一个参数是行列式,第二个参数是点积。另请参阅[此答案](/sf/answers/1158103131/)。 (2认同)

Spa*_*arr 33

如果您选择的数学库中有atan2()函数:

signed_angle = atan2(b.y,b.x) - atan2(a.y,a.x)
Run Code Online (Sandbox Code Playgroud)

  • 怎么样的=(-1,1)和b =( - 1,-1),答案应该是pi/2?您应检查绝对值是否大于pi,然后加上或减去2*pi(如果是). (9认同)