Matplotlib 是一个 Python 的 2D 绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形
首先假设飞机飞行在某一高度位置,飞行高度不会发生变化,这样就可以在二维平面内表示飞机的飞行轨迹,让我们先把飞机飞行的平面确立下来吧。
假定这就是飞机飞行的平面区域,在位置为 x ∈ [ 0 , 80 ] , y ∈ [ 0 , 40 ] x∈[0,80],y∈[0,40] x∈[0,80],y∈[0,40]的平面飞行,这里为表示完全,在 x , y x,y x,y坐标轴范围左右分别延伸 1 1 1。我们以飞机的初始坐标 ( 0 , 20 ) (0,20) (0,20)为例,向东方向输出一张静态的飞机飞行轨迹。
散点图用 ∗ * ∗符号表示,这样输出的就是五角星的散点图。
import matplotlib.pyplot as plt
plane_xcoordinate = list(range(0, 84, 4)) # 起始0,终止84,步长为4
plane_ycoordinate = [20] * len(plane_xcoordinate) # 保证对应数组一致
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.title('轨迹图') # 图标题
plt.xlim(-1, 81) # x轴范围(0,80)比范围稍微多出一丢丢
plt.ylim(-1, 41) # y轴范围(0,40)比范围稍微多出一丢丢
plt.xlabel('$x/km$') # x轴坐标轴标注
plt.ylabel('$y/km$') # y轴坐标轴标注
plt.scatter(plane_xcoordinate, plane_ycoordinate, marker='*', s=40, cmap='b')
plt.show()
动态图就是静态图一帧一帧输出,需要用到 p l t . i o n ( ) plt.ion() plt.ion()与 p l t . s l e e p ( ) plt.sleep() plt.sleep()两个函数,这样才能出现如下的效果,关于函数的具体用法,请看 p l t . i o n ( ) plt.ion() plt.ion()
无人机在二维平面的起始位置为 ( 0 , 20 ) (0,20) (0,20),终点位置为 ( 80 , 20 ) (80,20) (80,20),飞机飞行速度为 5 k m / s 5km/s 5km/s
,每隔1s输出一帧图像。
import matplotlib.pyplot as plt
x_scope = [0, 80] # x范围
y_scope = [0, 40] # y范围
plane_coordinate = [0, y_scope[1] / 2] # 初始坐标(0,40)
plane_v = 5 # 飞机速度为5
t_ = 1 # 每隔1s输出一帧图像
plt.ion()
plt.title('轨迹图') # 图标题
plt.xlabel('$x/km$') # x轴坐标轴标注
plt.ylabel('$y/km$') # y轴坐标轴标注
plt.xlim(-1, 81) # x轴范围(0,80)比范围稍微多出一丢丢
plt.ylim(-1, 41) # y轴范围(0,40)比范围稍微多出一丢丢
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
while plane_coordinate[0] <= x_scope[1]:
list_xc = [plane_coordinate[0]] # 点坐标转换为列表放入scatter函数中
list_yc = [plane_coordinate[1]]
plt.scatter(list_xc, list_yc, marker='*', s=40, c='b')
plt.pause(1)
plane_coordinate[0] = plane_coordinate[0] + plane_v * t_ # 飞机每隔1s下一时刻的x坐标位置
plt.ioff()
plt.show()
在上图中,蓝色飞机为逃跑机,红色飞机为追击机,红色飞机的速度朝向角度为 α \alpha α
α = ∣ a t a n y r − y b x r − x b ∣ \alpha=|atan\frac{y_r-y_b}{x_r-x_b}| α=∣atanxr−xbyr−yb∣
红色飞机下一时刻的坐标动态的变化公式为:
{ x r = x 0 − v r t c o s α y r = y 0 − v r t s i n α \left\{\begin{array}{l} x_r=x_0-v_rtcos\alpha \\ y_r=y_0-v_rtsin\alpha \end{array}\right. {xr=x0−vrtcosαyr=y0−vrtsinα
假设红色飞机的速度为 6 k m / s 6km/s 6km/s,蓝色飞机的速度为 4 k m / s 4km/s 4km/s。
import matplotlib.pyplot as plt
import math
def flee(A, v_A): # 经过t时间改变A的坐标 A逃跑
A[0] = A[0] + v_A * t_ # 飞机每隔1s下一时刻的x坐标位置
def followrealtime_coordinate(A, B, v_B): # 经过t时间改变B的坐标 B追A
tanα = abs((A[1] - B[1]) / (A[0] - B[0]))
α = math.atan(tanα)
if B[1] > A[1] and B[0] > A[0]: # 追击机在逃跑机右上方
B[1] = B[1] - v_B * t_ * math.sin(α)
B[0] = B[0] - v_B * t_ * math.cos(α)
elif B[1] < A[1] and B[0] > A[0]: # 追击机在逃跑机右下方
B[1] = B[1] + v_B * t_ * math.sin(α)
B[0] = B[0] - v_B * t_ * math.cos(α)
elif B[1] > A[1] and B[0] < A[0]: # 追击机在逃跑机左上方
B[1] = B[1] - v_B * t_ * math.sin(α)
B[0] = B[0] + v_B * t_ * math.cos(α)
else: # 追击机在逃跑机左下方
B[1] = B[1] + v_B * t_ * math.sin(α)
B[0] = B[0] + v_B * t_ * math.cos(α)
x_scope = [0, 80] # x范围
y_scope = [0, 40] # y范围
plane_coordinateA = [x_scope[1] / 3, y_scope[1] / 2] # A初始坐标(80/3,20)
plane_coordinateB = [0, 0] # A初始坐标(0,0)
planeA_v = 4 # 飞机速度为4km/s
planeB_v = 6 # 飞机速度为6km/s
t_ = 0.5 # 每隔0.5s输出一帧图像
plt.ion()
plt.title('轨迹图') # 图标题
plt.xlabel('$x/km$') # x轴坐标轴标注
plt.ylabel('$y/km$') # y轴坐标轴标注
plt.xlim(-1, 81) # x轴范围(0,80)比范围稍微多出一丢丢
plt.ylim(-1, 41) # y轴范围(0,40)比范围稍微多出一丢丢
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
while plane_coordinateA[0] <= x_scope[1]:
# 下面三句代码输出逃跑无人机A的散点图
list_xc = [plane_coordinateA[0]] # 点坐标转换为列表放入scatter函数中
list_yc = [plane_coordinateA[1]] # 点坐标转换为列表放入scatter函数中
plt.scatter(list_xc, list_yc, marker='*', s=40, c='b')
# 下面三句代码输出追踪无人机B的散点图
list_xc = [plane_coordinateB[0]] # 点坐标转换为列表放入scatter函数中
list_yc = [plane_coordinateB[1]] # 点坐标转换为列表放入scatter函数中
plt.scatter(list_xc, list_yc, marker='*', s=40, c='r')
plt.pause(1) # 输出一帧停顿1s
flee(plane_coordinateA, planeA_v) # A机沿直线逃跑
followrealtime_coordinate(plane_coordinateA, plane_coordinateB, planeB_v) # B通过调转机头方向追击A机
plt.ioff()
plt.show()