验证3D直线A对齐至平行于直线B的夹角计算代码正确性
3D直线平行对齐与夹角计算验证
需求与疑问
- 需求:将由3D起点(S)和终点(E)定义的直线A(蓝色)对齐至固定的3D直线B(红色),使A与B平行(可同时移动直线A的S和E端点,初始位置不限)。已知两条直线长度相等。
- 疑问:编写了计算两条直线夹角的Python代码,不确定计算步骤是否正确;按认知两条平行直线的夹角应为0,需要验证代码逻辑。
编写的Python代码
import numpy as np def calcAngleBtw2Lines(self, vec1S, vec1E, vec2S, vec2E): # 计算直线的方向向量(终点减起点) vec1 = np.subtract(vec1E, vec1S) vec2 = np.subtract(vec2E, vec2S) # 计算向量点积,用于求夹角余弦值 dotProduct = np.dot(vec1, vec2) # 计算向量的模长 vec1Unit = np.linalg.norm(vec1) vec2Unit = np.linalg.norm(vec2) # 计算向量夹角并转为角度制 angle = np.degrees(np.arccos(dotProduct / (vec1Unit * vec2Unit))) print("angle: ", angle) return np.round(angle, 1)
代码正确性分析
核心逻辑正确
直线的方向由端点差向量(E-S)唯一确定,代码通过计算两条直线的方向向量夹角来得到直线夹角,这个思路完全符合3D直线夹角的定义。步骤细节验证
- 方向向量计算:
np.subtract(vec1E, vec1S)正确提取了直线A的方向向量,vec2同理提取直线B的方向向量,这是计算夹角的基础。 - 点积与模长:点积计算
np.dot(vec1, vec2)和向量模长np.linalg.norm的调用均正确,两者的比值就是夹角的余弦值,符合向量夹角的数学公式。 - 角度转换:通过
np.arccos得到弧度制夹角,再用np.degrees转为角度制,最后四舍五入保留一位小数,步骤无错误。
- 方向向量计算:
平行情况的结果说明
当两条直线平行时,会出现两种情况:- 方向完全相同:此时方向向量的点积等于两者模长的乘积,
dotProduct/(vec1Unit*vec2Unit) = 1,arccos(1)=0,代码返回0.0,符合预期。 - 方向完全相反:此时点积等于负的模长乘积,
dotProduct/(vec1Unit*vec2Unit) = -1,arccos(-1)=180,代码返回180.0,这也是平行的一种(共线反向),如果需求要求必须同向平行,需要额外判断方向向量的符号一致性。
- 方向完全相同:此时方向向量的点积等于两者模长的乘积,
内容的提问来源于stack exchange,提问作者mystic.06
相关产品推荐
相关产品推荐

