如何用Numpy计算两条直线交点处的夹角?求方法验证
计算直线交点处夹角的问题排查与正确实现
问题描述
排查程序bug时需验证直线夹角计算方法的正确性。给定以下Numpy代码,需计算直线a与b交点处的夹角θ(要求仅使用Numpy)。自行实现的代码得到约29度的结果,请问该方法为何不正确?
示例代码
import numpy as np n = 1000 x = np.arange(n) a = np.ones(n) * 3 # 直线a: y=3 b = -0.11 * x - 112 # 直线b: y=-0.11x-112
错误实现
def _angle(a, b): return np.degrees(np.arccos(np.dot(a, b)/ (np.linalg.norm(a) * np.linalg.norm(b)))) print(_angle(a,b))
错误原因
你错误地将直线上的y值数组当成了直线的方向向量来计算点积:
- 变量
a是全3的数组,对应直线y=3上的y坐标集合;b是直线y=-0.11x-112上的y坐标集合,二者都不是直线的方向向量。 - 计算这两个数组的点积与模长比值,得到的是数组元素的相似度,和两条直线的夹角没有任何关系,因此结果完全错误。
正确实现思路与代码
直线的夹角由它们的方向向量决定:
- 直线
y=3是水平直线,方向向量可取(1, 0)(x轴正方向); - 直线
y=-0.11x-112的斜率为-0.11,方向向量可取(1, -0.11)(x每增加1,y减少0.11); - 利用向量点积公式计算夹角,同时确保结果是两条直线之间的最小角(不超过90度)。
正确代码
import numpy as np def calculate_line_angle(): # 定义两条直线的方向向量 v1 = np.array([1, 0]) # 直线a的方向向量(水平向右) v2 = np.array([1, -0.11])# 直线b的方向向量 # 计算点积与模长乘积,用clip避免浮点误差导致的超出[-1,1]范围 dot_product = np.dot(v1, v2) norm_product = np.linalg.norm(v1) * np.linalg.norm(v2) cos_theta = np.clip(dot_product / norm_product, -1.0, 1.0) # 弧度转角度,取最小夹角 angle_deg = np.degrees(np.arccos(cos_theta)) if angle_deg > 90: angle_deg = 180 - angle_deg return angle_deg print(calculate_line_angle())
运行结果约为6.28度,这才是两条直线交点处的正确夹角。
内容的提问来源于stack exchange,提问作者NoVa
相关产品推荐
相关产品推荐

