python 求兩個向量的順時針夾角操作
以上述圖片舉例,要求 相對 的順時針夾角。註意:這裡使用圖像坐標系
1 定義求順時針角度的函數
import numpy as np def clockwise_angle(v1, v2): x1,y1 = v1 x2,y2 = v2 dot = x1*x2+y1*y2 det = x1*y2-y1*x2 theta = np.arctan2(det, dot) theta = theta if theta>0 else 2*np.pi+theta return theta
2 求 , 然後求夾角
v1 = [2-0, 1-0] = [2,1] v2 = [4-0, 5-0] = [4,5] theta = clockwise_angle(v1,v2) print(theta*180/np.pi) # 24.77
補充:求2個向量順逆時針(最小角度)旋轉角度 Python
求向量 a 旋轉到向量 b 的順時針(逆時針)最小角度。
正常求2個向量夾角用內積公式就可以計算,然而求得的結果不包含方向信息。
如果需要方向信息的話需要引入向量的外積來幫助我們判斷。
theta是兩個向量的夾角,n是垂直與2維平面的方向向量,由右手定則可以判斷方向。
根據定義可以通過向量的坐標計算外積
這裡面由於u,v是二維平面上的向量, u3 v3 都為0。 所以 u叉乘v = (u1v2 – u2v1)*K。
所以等式兩邊的標量相等可以求夾角rho。
rho 是帶正負號的和旋轉方向有關,但是范圍在 -90 ~ 90度。
可以通過rho正負號,結合向量的點乘重新計算帶方向的夾角。
這裡面順時針旋轉為負,逆時針旋轉為正。
def GetClockAngle(v1, v2): # 2個向量模的乘積 TheNorm = np.linalg.norm(v1)*np.linalg.norm(v2) # 叉乘 rho = np.rad2deg(np.arcsin(np.cross(v1, v2)/TheNorm)) # 點乘 theta = np.rad2deg(np.arccos(np.dot(v1,v2)/TheNorm)) if rho < 0: return - theta else: return theta a = [0,1] b = [1,0] c = [-1,0] d = [0, -1] e = [-1, -1] f = [1, -1] g = [1, 1] h = [-1, 1] print(GetClockAngle(a,g), GetClockAngle(a,b), GetClockAngle(a,f), GetClockAngle(a,d), \ GetClockAngle(a,e), GetClockAngle(a,c), GetClockAngle(a,h)) ''' 結果 (-45.00000000000001, -90.0, -135.0, 180.0, 135.0, 90.0, 45.00000000000001) '''
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Python光學仿真教程實現光線追蹤
- Python中np.linalg.norm()用法實例總結
- 初識python的numpy模塊
- Python實現仿真雙徑效應的方法
- 如何利用Pytorch計算三角函數