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

大多数的时候,计算两个向量或者直线的夹角就可以,通常在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

你可能感兴趣的:(Math,MATLAB)