Python计算两个向量顺时针夹角的方法与实现
本文介绍如何在Python中计算两个向量的顺时针夹角。通过结合内积公式与外积(叉乘)判断方向,利用numpy库实现角度计算。文章提供了完整的代码示例,解析了带符号角度的处理逻辑,并对比了不同旋转方向下的角度结果,适用于需要精确方向信息的几何计算场景。

图像坐标系下的向量顺时针夹角定义
参考上述图片示例,目标是计算向量
相对于向量
的顺时针夹角。请注意,此处采用的是图像坐标系。
定义顺时针角度计算函数
第一步:定义计算顺时针角度的函数。
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
第二步:求解向量
,随后计算夹角
。
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

向量顺逆时针最小旋转角度计算原理
补充内容:使用Python计算两个向量之间顺逆时针的最小旋转角度。
我们需要求向量 a 旋转到向量 b 时的顺时针(或逆时针)最小角度。
通常计算两个向量的夹角可以直接使用内积公式,但该方法求得的结果不包含方向信息。
若需获取方向信息,则必须引入向量的外积(叉乘)来进行辅助判断。

设 theta 为两个向量的夹角,n 为垂直于二维平面的方向向量,其方向可通过右手定则确定。
根据定义,可以通过向量的坐标直接计算外积。

由于 u 和 v 是二维平面上的向量,它们的 z 分量 u3 和 v3 均为 0。因此,u 叉乘 v 的结果为 (u1v2 - u2v1)*K。
基于等式两边标量相等的原理,可以求解夹角 rho。
rho 是一个带正负号的值,与旋转方向相关,但其数值范围限制在 -90 到 90 度之间。
可以通过判断 rho 的正负号,并结合向量的点乘结果,重新计算带有方向信息的完整夹角。
在此约定中,顺时针旋转标记为负值,逆时针旋转标记为正值。
Python完整代码实现与测试
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)
'''

以上为个人经验分享,希望能为大家提供参考。欢迎大家多多支持本站。如有错误或未考虑周全之处,敬请指正。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













