如何实现3D参数曲线的动态绘制及周期性循环运动?
动态循环3D参数曲线实现方案
针对需求,修改后的代码实现了逐点绘制曲线、phi持续旋转+theta简谐摆动、循环运动不停止三个核心功能:
import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from mpl_toolkits.mplot3d import Axes3D # 参数定义 r = 20 h = 1.7 max_frames = 1000 # 控制动画步长数量 t_step = 0.05 # 时间步长,调节运动速度 # 初始化画布和3D轴 fig = plt.figure('Parametric pancake') ax = fig.add_subplot(111, projection='3d') ax.set_xlabel('X', fontweight='bold', fontsize=14) ax.set_ylabel('Y', fontweight='bold', fontsize=14) ax.set_zlabel('Z', fontweight='bold', fontsize=14) ax.set_title('Parametric pancake', fontweight='bold', fontsize=16) # 固定坐标轴范围,避免画面抖动 ax.set_xlim(-r-5, r+5) ax.set_ylim(-r-5, r+5) ax.set_zlim(-r-5, r+5) # 初始化曲线、点对象和数据存储数组 line, = ax.plot([], [], [], '-r', linewidth=3) point, = ax.plot([], [], [], 'bo', markersize=8) x_data, y_data, z_data = [], [], [] def update(frame): # 计算当前时间参数 t = frame * t_step # theta做简谐运动,范围锁定-π/2到π/2(对应-90°到90°) theta = (np.pi / 2) * np.sin(t) # phi持续旋转,取模实现循环,避免数值溢出 phi = t % (2 * np.pi) # 计算当前点的三维坐标 x = r * np.cos(phi) y = r * np.sin(phi) * np.cos(theta) - h * np.sin(theta) z = r * np.sin(phi) * np.sin(theta) + h * np.cos(theta) # 累积曲线数据,实现逐点绘制 x_data.append(x) y_data.append(y) z_data.append(z) # 更新曲线和移动点的显示 line.set_data_3d(x_data, y_data, z_data) point.set_data_3d(x, y, z) return line, point # 创建循环动画,interval控制每帧间隔(毫秒),blit优化绘制效率 ani = FuncAnimation(fig, update, frames=max_frames, interval=20, blit=True, repeat=True) plt.show()
关键修改说明
- 逐点绘制:通过
x_data、y_data、z_data数组累积每帧的点坐标,逐步更新曲线数据,实现从无到有的绘制过程 - 周期性运动:
theta使用正弦函数实现简谐摆动,(np.pi/2)*np.sin(t)确保角度范围严格在-90°到90°之间phi通过t % (2*np.pi)实现无限循环旋转,避免数值溢出同时保证持续转动
- 循环不停止:
FuncAnimation设置repeat=True,动画播放完指定帧数后自动重复,实现无限运动
内容的提问来源于stack exchange,提问作者SvylantisCPU
相关产品推荐
相关产品推荐

