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

如何限制matplotlib.pyplot.axline绘制的过同一点多条直线的长度

axline 接口本身设计就是绘制无限长直线,无法直接限制长度,你可以通过计算直线与椭圆的交点,直接绘制两点间线段实现需求,具体实现方案如下:

你需要先明确椭圆的参数,下述代码以示例椭圆参数(中心(60, 450),水平半轴长度100,垂直半轴长度80)为例,你可以根据实际需求调整对应参数。

import matplotlib.pyplot as plt
import math

def seq(start, stop, step=1):
    n = int(round((stop - start)/float(step)))
    if n > 1:
        a = [start + step*i for i in range(n+1)]
        round_a = [round(num, 2) for num in a]
        return round_a
    elif n == 1:
        return [start]
    else:
        return []

# 固定发射点坐标
px, py = 55.0, 450.1
# 椭圆参数:中心坐标(xc, yc),水平半轴a,垂直半轴b,可根据实际需求修改
xc, yc = 60, 450
a, b = 100, 80

c = seq(-50, 50, 5)

# 先画固定点
plt.scatter(px, py, color='black', s=500)
# 可选:绘制椭圆边界方便对照,不需要可以删除本段
theta = [i/100*2*math.pi for i in range(100)]
ex = [xc + a*math.cos(t) for t in theta]
ey = [yc + b*math.sin(t) for t in theta]
plt.plot(ex, ey, color='gray', linestyle='--')

for k in c:
    # 直线方程 y = k*(x - px) + py,代入椭圆方程 ((x-xc)/a)^2 + ((y-yc)/b)^2 = 1
    A = (1/a**2) + (k**2)/(b**2)
    B = 2*((px - xc)/a**2 + k*(k*px + (py - yc))/b**2)
    C = ((px - xc)**2)/a**2 + ((k*px + (py - yc))**2)/b**2 - 1
    # 解一元二次方程求x坐标
    delta = B**2 - 4*A*C
    if delta < 0:
        continue  # 无交点直接跳过
    x1 = (-B + math.sqrt(delta))/(2*A)
    x2 = (-B - math.sqrt(delta))/(2*A)
    # 取离发射点更远的交点作为线段端点
    x_end = x1 if abs(x1 - px) > abs(x2 - px) else x2
    y_end = k*(x_end - px) + py
    # 绘制限定长度的线段
    plt.plot([px, x_end], [py, y_end], color='red')

plt.axis('equal')
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:18:02