python 求兩個(gè)向量的順時(shí)針夾角操作

以上述圖片舉例,要求
相對
的順時(shí)針夾角。注意:這里使用圖像坐標(biāo)系
1 定義求順時(shí)針角度的函數(shù)
import numpy as npdef 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

補(bǔ)充:求2個(gè)向量順逆時(shí)針(最小角度)旋轉(zhuǎn)角度 Python
求向量 a 旋轉(zhuǎn)到向量 b 的順時(shí)針(逆時(shí)針)最小角度。
正常求2個(gè)向量夾角用內(nèi)積公式就可以計(jì)算,然而求得的結(jié)果不包含方向信息。
如果需要方向信息的話需要引入向量的外積來幫助我們判斷。

theta是兩個(gè)向量的夾角,n是垂直與2維平面的方向向量,由右手定則可以判斷方向。
根據(jù)定義可以通過向量的坐標(biāo)計(jì)算外積

這里面由于u,v是二維平面上的向量, u3 v3 都為0。 所以 u叉乘v = (u1v2 - u2v1)*K。
所以等式兩邊的標(biāo)量相等可以求夾角rho。
rho 是帶正負(fù)號的和旋轉(zhuǎn)方向有關(guān),但是范圍在 -90 ~ 90度。
可以通過rho正負(fù)號,結(jié)合向量的點(diǎn)乘重新計(jì)算帶方向的夾角。
這里面順時(shí)針旋轉(zhuǎn)為負(fù),逆時(shí)針旋轉(zhuǎn)為正。
def GetClockAngle(v1, v2): # 2個(gè)向量模的乘積 TheNorm = np.linalg.norm(v1)*np.linalg.norm(v2) # 叉乘 rho = np.rad2deg(np.arcsin(np.cross(v1, v2)/TheNorm)) # 點(diǎn)乘 theta = np.rad2deg(np.arccos(np.dot(v1,v2)/TheNorm)) if rho < 0: return - theta else: return thetaa = [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))’’’結(jié)果(-45.00000000000001, -90.0, -135.0, 180.0, 135.0, 90.0, 45.00000000000001)’’’

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章:
1. python文件處理--文件讀寫詳解2. 新手學(xué)python應(yīng)該下哪個(gè)版本3. 詳細(xì)總結(jié)Java for循環(huán)的那些坑4. Python通過format函數(shù)格式化顯示值5. python對批量WAV音頻進(jìn)行等長分割的方法實(shí)現(xiàn)6. jsp文件下載功能實(shí)現(xiàn)代碼7. uni-app結(jié)合PHP實(shí)現(xiàn)單用戶登陸demo及解析8. 如何利用Python matplotlib繪制雷達(dá)圖9. ajax實(shí)現(xiàn)頁面的局部加載10. 詳解CSS偽元素的妙用單標(biāo)簽之美

網(wǎng)公網(wǎng)安備