傅里叶级数是数学中最美妙的思想之一:任何周期函数都可以表示为一系列正弦波(或旋转圆)的叠加。
这个模拟器将这个思想直观化:你随手画一个图案,系统通过离散傅里叶变换(DFT)将其分解为一组旋转的圆(epicycles)——这些圆首尾相连旋转时,最末端的运动轨迹恰好复现你画的图案。正如 3Blue1Brown 所说:"任何图案都可以用旋转的圆画出来"。
将绘制的路径看作一个关于时间 \(t\) 的复值函数。路径上每个点 \((x(t), y(t))\) 对应复平面上的一个点:
\(f(t)\) 是一个周期复函数——因为路径是闭合的,\(f(0) = f(2\pi)\)。
傅里叶告诉我们,任何周期复函数都可以写成旋转向量的和:
其中每一项 \(c_n e^{i n t}\) 代表一个旋转的圆:
| 符号 | 物理含义 |
|---|---|
| \(c_n\) | 复数系数,决定圆的半径(\(|c_n|\))和初始相位(\(\arg(c_n)\)) |
| \(n\) | 频率,决定圆的旋转速度(负频率对应反向旋转) |
| \(e^{i n t}\) | 单位复指数,表示以角速度 \(n\) 旋转的单位向量 |
系数 \(c_n\) 可通过内积求得:
在离散情况下(我们将路径采样为 \(N\) 个点 \(f_k = f(2\pi k / N)\)),用 DFT 计算:
展开为实部和虚部(便于编程):
\[ \begin{aligned} \operatorname{Re}(c_n) &= \frac{1}{N} \sum_{k=0}^{N-1} \Big(x_k \cos\theta_{n,k} + y_k \sin\theta_{n,k}\Big) \\[4pt] \operatorname{Im}(c_n) &= \frac{1}{N} \sum_{k=0}^{N-1} \Big(y_k \cos\theta_{n,k} - x_k \sin\theta_{n,k}\Big) \end{aligned} \]其中 \(\theta_{n,k} = 2\pi n k / N\)。
每个傅里叶分量 \(c_n e^{i n t}\) 在几何上是一个以 \(c_n\) 为半径、以角速度 \(n\) 旋转的向量:
\[ c_n e^{i n t} = |c_n| \cdot e^{i(n t + \arg(c_n))} \]模拟器中的可视化就是将这些旋转向量首尾相连:
第一个圆的中心在原点,半径 \(|c_0|\),箭头指向随 \(t\) 缓慢旋转(\(n=0\) 时不旋转); 第二个圆的中心在第一个圆的箭头尖端,半径 \(|c_1|\),以角速度 \(1\) 旋转; 第三个圆的中心在第二个圆的箭头尖端,半径 \(|c_2|\),以角速度 \(2\) 旋转……
最后一个圆的箭头尖端——所有这些重叠旋转的终点——就是 \(f(t)\),恰好落在原始路径上。
| 功能 | 操作 | 说明 |
|---|---|---|
| 绘制路径 | 在画布上按住鼠标拖动 | 绘制任意闭合图案,系统会自动将其分解为旋转圆的叠加 |
| 调整精度 | 拖动"圆盘数量"滑块(2~300) | 更少的圆 → 更粗糙的近似;更多的圆 → 更精细的还原。理解"低频分量勾勒轮廓,高频分量补充细节" |
| 调速 | 速度滑块(0.1x ~ 4x) | 慢速观察每个圆如何旋转配合,快速预览整体绘图效果 |
| 预设图案 | 点击预设按钮 | 心形、蝴蝶、花瓣、方形——展示不同形状对应不同的频谱分布 |
| 导出 SVG | 点击导出按钮 | 将绘制路径导出为标准 SVG 文件 |
| 重置 | 重置按钮 | 清空画布,重新绘制 |
每一帧:
| 功能 | 操作 |
|---|---|
| 绘制路径 | 在画布上按住鼠标拖动绘制闭合图案 |
| 调整精度 | 滑块控制圆盘数量(2~300),更少的圆 → 更粗糙的近似 → 理解"低频分量勾勒轮廓,高频分量补充细节" |
| 调速 | 0.1x ~ 4x,慢速观察每个圆如何旋转配合 |
| 预设图案 | 心形、蝴蝶、花瓣、方形,展示不同形状对应不同频谱 |
| 导出 SVG | 将绘制的路径导出为标准 SVG 文件 |