Python 线段相交判断算法优化:解决垂直线段判断问题

本文介绍了 Python 线段相交判断算法的优化方法,重点解决当两个线段的直线是垂直时判断错误的问题。

原始代码:

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  #截距
    if math.isnan(b1):
        b1 = 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 math.isnan(b2):
        b2 = x3
    
    # 检查是否有交点
    if m1 == m2:  # 检查斜率是否相等
        if b1 != b2:
            return False
        else:  #是否重叠
            if x1 <= x3 <= x2 or x2 <= x3 <= x1 or x3 <= x1 <= x4 or x4 <= x1 <= x3:
                return True
            else:
                return False
    else:
        print(m1,m2,b1,b2)
        x = (b2 - b1) / (m1 - m2)  #交点
        print(x)
        if x < min(x1, x2) or x > max(x1, x2) or x < min(x3, x4) or x > max(x3, x4):
            return False
        else:
            return True

问题分析:

当两个线段的直线是垂直的时候,斜率为无穷大,会进入第一个if语句块。这时需要判断两个线段是否有重叠部分,但是当前的判断条件只判断了x坐标是否有重叠,没有判断y坐标是否有重叠。

解决方案:

修改判断条件,将x坐标和y坐标的判断条件合并起来,如下所示:

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  #截距
    if math.isnan(b1):
        b1 = 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 math.isnan(b2):
        b2 = x3
    
    # 检查是否有交点
    if x1 == x2 and x3 == x4:  # 两个线段都垂直x轴
        if x1 != x3:  # 不在同一条直线上
            return False
        else:  # 在同一条直线上
            if y1 <= y3 <= y2 or y2 <= y3 <= y1 or y3 <= y1 <= y4 or y4 <= y1 <= y3:
                return True
            else:
                return False
    elif x1 == x2:  # 第一个线段垂直x轴
        y = m2 * x1 + b2
        if y < min(y1, y2) or y > max(y1, y2) or y < min(y3, y4) or y > max(y3, y4):
            return False
        else:
            return True
    elif x3 == x4:  # 第二个线段垂直x轴
        y = m1 * x3 + b1
        if y < min(y1, y2) or y > max(y1, y2) or y < min(y3, y4) or y > max(y3, y4):
            return False
        else:
            return True
    else:  # 两个线段都不垂直x轴
        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
        else:
            return True

这样修改后,即使两个线段的直线是垂直的,也能够正确判断它们是否相交。

Python 线段相交判断算法优化:解决垂直线段判断问题

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

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