更快求解直线交点、计算直线夹角及判断点是否在多边形内的方法
几何计算高性能解决方案(替代SymPy)
1 两直线交点与夹角计算
SymPy属于符号计算库,做数值几何计算时会产生大量不必要的符号解析开销,直接用数值解析公式实现性能可提升100倍以上,以下是可直接使用的实现方案:
1.1 单组计算纯Python实现
import math def line_intersection_and_angle(p1, p2, p3, p4): # p1,p2为第一条直线的两个端点;p3,p4为第二条直线的两个端点 x1, y1 = p1 x2, y2 = p2 x3, y3 = p3 x4, y4 = p4 # 计算分母,判断是否平行 den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4) if abs(den) < 1e-12: # 平行/重合判定阈值可根据精度需求调整 return None, 0.0 # 平行无交点,夹角为0度 # 计算交点坐标 t_num = (x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4) t = t_num / den x = x1 + t * (x2 - x1) y = y1 + t * (y2 - y1) # 计算夹角(角度制) dx1, dy1 = x2 - x1, y2 - y1 dx2, dy2 = x4 - x3, y4 - y3 dot_product = dx1 * dx2 + dy1 * dy2 cross_product = dx1 * dy2 - dy1 * dx2 angle_rad = math.atan2(abs(cross_product), dot_product) angle_deg = math.degrees(angle_rad) return (x, y), angle_deg # 调用示例 p1 = (1,4) p2 = (8,8) p3 = (10,10) p4 = (16,16) inter_point, angle = line_intersection_and_angle(p1,p2,p3,p4) print(f"交点坐标:{inter_point}, 夹角:{angle}度")
1.2 批量计算优化
如果需要同时处理上千对直线的计算,可改用NumPy向量化实现,性能还能再提升一个数量级。
2 点在四边形内部判断
推荐使用Shapely库,这是专门处理2D几何计算的高性能库,原生支持批量点判断,用法如下:
2.1 依赖安装
pip install shapely
2.2 示例代码
from shapely.geometry import Polygon, Point # 定义四边形顶点,按顺时针/逆时针顺序排列即可 quad = Polygon([(0,0), (0,5), (5,5), (5,0)]) # 单点判断 single_point = Point(2,2) print(single_point.within(quad)) # 输出True,代表点在四边形内部 # 批量点判断 point_list = [Point(1,1), Point(6,6), Point(2,5)] result = [pt.within(quad) for pt in point_list] print(result) # 输出[True, False, False]
说明:如果需要将边界上的点也判定为内部,可将
within方法替换为intersects,也可根据业务需求调整判定阈值。如果不想引入第三方依赖,也可以手动实现射线法判断逻辑,性能对于普通场景也足够使用。
内容的提问来源于stack exchange,提问作者Abstractor
相关产品推荐
相关产品推荐

