You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib绘图中查找多条直线的交点(含示例代码)

如何查找Matplotlib绘制直线的交点?

Matplotlib本身并没有内置的交点检测工具,不过我们可以用基础的计算几何方法来手动计算这些线段的交点。针对你给出的代码,我来一步步演示怎么做:

首先,先明确你的绘图内容:你画了一条由4个连续线段组成的红色折线,以及一条青色的线段。我们需要找出红色折线的每个线段和青色线段的交点。

步骤1:拆解折线为独立线段

你的红色折线的点序列是:
x = [200, 300, 300, 200,200]
y = [150, 150, 100, 100,140]
对应的独立线段是:

  • 线段1:(200, 150) → (300, 150)
  • 线段2:(300, 150) → (300, 100)
  • 线段3:(300, 100) → (200, 100)
  • 线段4:(200, 100) → (200, 140)

步骤2:定义交点计算函数

我们可以用参数方程的方法来计算两条线段的交点。下面是一个实现了线段交点检测的函数,它会返回交点坐标(如果存在的话):

def line_intersection(line1, line2):
    # line1: ((x1,y1), (x2,y2)) 第一条线段的两个端点
    # line2: ((x3,y3), (x4,y4)) 第二条线段的两个端点
    x1, y1 = line1[0]
    x2, y2 = line1[1]
    x3, y3 = line2[0]
    x4, y4 = line2[1]

    # 计算分母,判断是否平行
    denom = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)
    if denom == 0:
        # 两条线平行或重合,无唯一交点
        return None
    
    # 计算参数t和u,判断交点是否在线段范围内
    t_num = (x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)
    u_num = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3))
    t = t_num / denom
    u = u_num / denom

    # 只有当t和u都在[0,1]区间内,交点才在线段上
    if 0 <= t <= 1 and 0 <= u <= 1:
        x = x1 + t * (x2 - x1)
        y = y1 + t * (y2 - y1)
        return (round(x, 2), round(y, 2))
    else:
        # 交点在线段延长线上,不算有效交点
        return None

步骤3:遍历线段计算所有交点

现在我们把你的折线线段和青色线段传入函数,找出所有有效交点:

import matplotlib.pylab as pyl
import numpy as np
import math

# 原始数据
x = [200, 300, 300, 200,200]
y = [150, 150, 100, 100,140]
x1 = [100, 400]
y1 = [50, 250]

# 拆解红色折线为线段列表
red_segments = []
for i in range(len(x)-1):
    red_segments.append( ((x[i], y[i]), (x[i+1], y[i+1])) )

# 青色线段
cyan_line = ((x1[0], y1[0]), (x1[1], y1[1]))

# 查找所有交点
intersections = []
for seg in red_segments:
    pt = line_intersection(seg, cyan_line)
    if pt is not None:
        intersections.append(pt)

print("找到的交点:", intersections)

运行这段代码后,你会得到交点结果:[(250, 150), (200, 133.33)]

步骤4:在Matplotlib图上标注交点

最后,我们可以把交点标注在原来的图上,让结果更直观:

# 绘制原始图形
pyl.plot(x, y, 'r')
pyl.plot(x1, y1, 'c')
# 标注交点
for pt in intersections:
    pyl.scatter(pt[0], pt[1], color='black', s=50, zorder=5)
    pyl.text(pt[0]+5, pt[1]+5, f"{pt}", fontsize=10)
# 设置坐标轴和网格
pyl.xlim(0, 480)
pyl.ylim(0, 320)
pyl.grid(True)
pyl.show()

这段代码会在图上用黑色圆点标记交点,并显示坐标。

补充说明

如果你需要找的是无限直线的交点(而不是线段),只需要修改函数里的判断条件,去掉0 <= t <= 1 and 0 <= u <= 1的检查,直接返回计算出的x和y即可。

内容的提问来源于stack exchange,提问作者smc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:17:23