import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Wedge
from matplotlib.animation import FuncAnimation
# ===================== 配置参数 =====================
# 雷达参数
radar_x, radar_y = 0, 0 # 雷达位置
radar_range = 80 # 雷达最大探测距离
scan_start_angle = 30 # 扫描起始角(度)
scan_end_angle = 120 # 扫描终止角(度)
scan_speed = 2 # 每帧转动角度
# 航迹参数
total_points = 50
# 模拟飞行器航迹(平滑曲线)
t = np.linspace(0, 4 * np.pi, total_points)
track_x = 20 + 12 * t * np.cos(t)
track_y = 20 + 12 * t * np.sin(t)
# ===================== 创建画布 =====================
fig, ax = plt.subplots(figsize=(8, 8))
ax.set_xlim(-100, 100)
ax.set_ylim(-100, 100)
ax.set_aspect("equal")
ax.grid(True, alpha=0.3)
ax.set_title("航迹与雷达覆盖动态展示")
ax.set_xlabel("X")
ax.set_ylabel("Y")
# 绘制雷达站点
radar_point, = ax.plot(radar_x, radar_y, "ro", markersize=8, label="雷达站")
# 航迹:完整轨迹线 + 当前位置点
track_line, = ax.plot([], [], "b-", linewidth=1.5, label="历史航迹")
track_now, = ax.plot([], [], "go", markersize=6, label="当前位置")
# 雷达扇形覆盖(Wedge楔形)
wedge = Wedge((radar_x, radar_y), radar_range, scan_start_angle, scan_start_angle,
width=radar_range, color="orange", alpha=0.3)
ax.add_patch(wedge)
ax.legend(loc="upper right")
# ===================== 动画更新函数 =====================
current_scan_angle = scan_start_angle
def update(frame):
global current_scan_angle
# 1. 更新雷达扫描扇形结束角度
current_scan_angle += scan_speed
# 扫描到头后折返
if current_scan_angle > scan_end_angle:
current_scan_angle = scan_start_angle
wedge.set_theta1(scan_start_angle)
wedge.set_theta2(current_scan_angle)
# 2. 更新航迹:绘制到当前帧为止的轨迹
idx = min(frame, total_points - 1)
track_line.set_data(track_x[:idx+1], track_y[:idx+1])
track_now.set_data(track_x[idx], track_y[idx])
return track_line, track_now, wedge
# ===================== 启动动画 =====================
ani = FuncAnimation(
fig, update, frames=150, interval=50, blit=True
)
plt.show()
# 如果需要保存视频,取消下面注释(需要ffmpeg)
# ani.save("radar_track.gif", writer="pillow", fps=20)
运行结果如下: