python 求两个向量的顺时针夹角操作
这篇文章主要介绍了python 求两个向量的顺时针夹角操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
以上述图片举例,要求 相对 的顺时针夹角。注意:这里使用图像坐标系
1 定义求顺时针角度的函数
1 2 3 4 5 6 7 8 9 | 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 求 , 然后求夹角
1 2 3 4 | 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正负号,结合向量的点乘重新计算带方向的夹角。
这里面顺时针旋转为负,逆时针旋转为正。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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) ''' |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家