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
    
    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 or math.isnan(m1) or math.isnan(m2):  # 检查斜率是否为NaN
        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

问题分析

原代码的问题在于,当其中一条线段的斜率为无穷大时,判断逻辑存在错误。例如,当一条线段垂直于 x 轴,而另一条线段不垂直于 x 轴时,原代码会错误地判断这两条线段不相交。

代码优化

为了解决这个问题,我们可以添加以下代码来判断斜率是否为无穷大:

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 math.isnan(m1) or math.isnan(m2):  # 检查斜率是否为NaN
        return False
    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:
        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

# 测试
print(intersect(((-1,0),(1,0)), ((0,-1),(0,1))))  # True
print(intersect(((-1,0),(1,0)), ((-2,0),(0,0))))  # True
print(intersect(((-1,0),(1,0)), ((2,0),(3,0))))  # False
print(intersect(((-1,0),(1,0)), ((0,1),(0,2))))  # False
print(intersect(((-1,0),(1,0)), ((0,-2),(0,-1))))  # False

代码解释

  1. 计算斜率和截距:首先,计算两条线段的斜率和截距。如果斜率为无穷大,则将 m 赋值为 float('inf')
  2. 判断斜率是否为 NaN:如果斜率为 NaN,则说明两条线段平行,因此不相交。
  3. 判断斜率是否相等:如果斜率相等,则需要进一步判断两条线段是否重合。如果截距不相等,则两条线段平行且不相交。如果截距相等,则两条线段重合,需要判断线段的端点是否在另一条线段上。
  4. 计算交点:如果斜率不相等,则计算两条直线的交点坐标。
  5. 判断交点是否在线段上:最后,判断交点坐标是否在两条线段的范围内。如果交点在两条线段的范围内,则说明两条线段相交。

总结

通过添加斜率为无穷大的判断逻辑,我们修正了原代码的错误,使得该函数能够正确判断两条线段是否相交。

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

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

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