欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算两个向量的逆时针夹角

程序员文章站 2022-03-31 23:02:01
...

大多数的时候,计算两个向量或者直线的夹角就可以,通常在0~180°。然而,有的时候,需要知道向量到另一个向量按某一种旋转的角度,即0~360°,比如polygon的计算。

MATLAB Code

计算OA向量到OB向量的逆时针夹角:

A = [1,0];
B = [0,1];
O = [0,0];
OA = A - O;
OB = B - O;
plot([O(1),A(1)],[O(2),A(2)],'r');
hold on;
plot([O(1),B(1)],[O(2),B(2)],'r');
axis([-0.2,1.2,-0.2,1.2]);
OA_dot_OB = OA(1)*OB(1) + OA(2)*OB(2);
OA_cross_OB = OA(1)*OB(2) - OA(2)*OB(1);
angle = atan2(OA_cross_OB, OA_dot_OB);
display(angle*180/pi);

angle为90°。

如果A和B点调换,

A = [0,1];
B = [1,0];

angle为-90°。

解释

为什么能够这样计算呢?
dot 运算其实是与cosine成比例,而cross运算则是和sine成比例,那么

dot = x1*x2 + y1*y2      # dot 运算 [x1, y1] 和 [x2, y2]
cross = x1*y2 - y1*x2      # cross运算
angle = atan2(cross, dot)  # atan2(y, x) 或者 atan2(sin, cos)

Reference

  1. Angle between 3 points?
  2. Direct way of computing clockwise angle between 2 vectors
相关标签: MATLAB Math