求助:基于Manim实现傅里叶级数可视化(周转圆绘制)
实现周转圆绘制正弦波的Manim代码
from manim import * class FourierCircleToSine(Scene): def construct(self): # 基础参数设置 circle_radius = 2 circle_center = LEFT * 4 # 创建固定的周转参考圆 circle = Circle(radius=circle_radius, color=BLUE).move_to(circle_center) self.add(circle) # 旋转向量及其末端跟踪点 radius_vector = Line(circle_center, circle_center + RIGHT * circle_radius, color=YELLOW) circle_point = Dot(radius_vector.get_end(), color=RED) self.add(radius_vector, circle_point) # 正弦波轨迹相关元素 # 初始位置与周转圆顶端对齐的正弦跟踪点 sine_point = Dot(circle_center + RIGHT * 8 + UP * circle_radius, color=GREEN) # 记录跟踪点运动轨迹的曲线 sine_trajectory = TracedPath(sine_point.get_center, stroke_color=GREEN, stroke_width=2) # 连接周转圆点与正弦跟踪点的水平辅助线 connecting_line = Line(circle_point.get_center(), sine_point.get_center(), color=WHITE, stroke_opacity=0.5) self.add(sine_point, sine_trajectory, connecting_line) # 实时更新辅助线的函数 def update_connecting_line(line): line.become(Line(circle_point.get_center(), sine_point.get_center(), color=WHITE, stroke_opacity=0.5)) return line # 同步执行所有动画 self.play( Rotate(radius_vector, angle=TAU, about_point=circle_center, rate_func=linear), MoveAlongPath(sine_point, Line(sine_point.get_center(), sine_point.get_center() + RIGHT * 4 * PI, color=INVISIBLE), rate_func=linear), UpdateFromFunc(connecting_line, update_connecting_line), run_time=4 ) self.wait()
关键逻辑说明
元素对应关系:
- 蓝色周转圆:提供正弦波的振幅参考,半径等于正弦波的振幅
- 黄色旋转向量:绕圆心匀速旋转,末端红点的y坐标直接对应正弦波的瞬时幅值
- 绿色跟踪点:沿水平方向匀速移动,y坐标同步红点的y值,其运动轨迹就是标准正弦波
- 半透明白线:直观展示周转圆点与正弦跟踪点的y坐标关联
动画同步细节:
- 旋转向量用
Rotate做一圈匀速旋转(TAU代表2π弧度) - 正弦跟踪点用
MoveAlongPath做水平匀速移动,移动距离设为4*PI,刚好匹配旋转一圈的周期,生成完整正弦波 - 用
UpdateFromFunc实时更新辅助线位置,保证始终连接两个跟踪点
- 旋转向量用
可调参数提示:
- 修改
circle_radius改变正弦波振幅,调整run_time控制动画快慢 - 修改
circle_center和sine_point的初始x坐标,可调整周转圆与正弦波的间距
- 修改
内容的提问来源于stack exchange,提问作者Kebab Sharif
相关产品推荐
相关产品推荐

