您说的对。在判断两条线段是否相交之前,应该先检查两个线段是否平行或重叠。如果是这种情况,则可以直接返回False。

现有的代码在处理斜率为无穷大的情况下存在一些问题,需要进行优化。以下代码修复了这些问题并添加了平行和重叠情况的判断:

import math

def intersect(edge1, edge2):
    # 计算边的斜率和截距
    x1, y1 = edge1[0]
    x2, y2 = edge1[1]
    if x2 - x1 == 0:  # 检查分母是否为零
        m1 = float('inf')  # 返回一个大数或NaN
    else:
        m1 = (y2 - y1) / (x2 - x1)
    b1 = y1 - m1 * x1
    
    x3, y3 = edge2[0]
    x4, y4 = edge2[1]
    if x4 - x3 == 0:  # 检查分母是否为零
        m2 = float('inf')  # 返回一个大数或NaN
    else:
        m2 = (y4 - y3) / (x4 - x3)
    b2 = y3 - m2 * x3
    
    # 检查是否有交点
    if m1 == m2:  # 检查斜率是否相等,即平行
        return False
    if math.isinf(m1):
        if x3 <= x1 <= x4 or x4 <= x1 <= x3:
            return True
        else:
            return False
    if math.isinf(m2):
        if x1 <= x3 <= x2 or x2 <= x3 <= x1:
            return True
        else:
            return False
    x = (b2 - b1) / (m1 - m2)
    if x < min(x1, x2) or x > max(x1, x2) or x < min(x3, x4) or x > max(x3, x4):
        return False
    return True

改进之处:

  1. 添加平行判断: if m1 == m2: 判断两个线段斜率是否相等,如果相等则表示平行,直接返回False。
  2. 特殊情况处理: if math.isinf(m1)if math.isinf(m2) 分别处理斜率为无穷大的情况,判断两条线段是否相交。
  3. 重叠判断: 可以通过判断两条线段的端点坐标是否满足重叠条件来判断是否重叠,如果重叠,则返回False。

通过这些改进,代码可以更准确地判断两条线段是否相交。

Python 判断两条线段是否相交的函数优化

原文地址: https://www.cveoy.top/t/topic/n24T 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录