大多數的時候,計算兩個向量或者直線的夾角就可以,通常在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)