Python线段相交检测程序运行异常:返回错误相交判断结果
问题出在哪
你写的line_intersection根本不是线段相交检测函数,它只判断两条线段所在的无限长直线平不平行,完全没管线段自身的长度范围。
为啥你的测试返回了错误的True
你代码里算的div是两个线段方向向量的行列式:
div == 0只代表两条所在直线是平行/共线的,无限延长都碰不上div != 0只代表两条无限延长的直线肯定能找到交点,但这个交点大概率落在两条线段的端点外面,根本不属于任何一段实际的线段
你给的那组测试参数里,line1的斜率约为0.297,line2的斜率约为0.423,方向明显不平行,所以行列式算出来肯定不是0,函数想都不想就返回True了。但实际算坐标就能验证:
- 在line2左端点x=120的位置,line1对应的y值约为206,而line2的y值是256,差了近50个单位
- 在line2右端点x≈166.05的位置,line1对应的y值约为219.6,而line2的y值是275.47,又差了近56个单位
两条实际的线段根本挨不上,自然不存在相交的情况。
要做正确的线段相交判断,必须补的逻辑
排除平行场景后,还得做跨立校验:
- 算line1的两个端点对line2所在直线的叉乘,看两个端点是不是分别在直线两边
- 算line2的两个端点对line1所在直线的叉乘,看两个端点是不是也分别在直线两边
- 碰到共线的特殊情况,还要额外判断端点是不是落在对方线段的坐标区间里,不然碰到共线不重叠、端点刚好碰到这类边界场景,判断肯定不准
内容的提问来源于stack exchange,提问作者hidden layer
相关产品推荐
相关产品推荐

