計算兩個向量的逆時針夾角

大多數的時候,計算兩個向量或者直線的夾角就可以,通常在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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章