如何限制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
相关产品推荐
相关产品推荐

