傅里叶画图机器 — 算法说明文档

← 返回模拟器   |   ← 返回首页

1. 概述

傅里叶级数是数学中最美妙的思想之一:任何周期函数都可以表示为一系列正弦波(或旋转圆)的叠加

这个模拟器将这个思想直观化:你随手画一个图案,系统通过离散傅里叶变换(DFT)将其分解为一组旋转的圆(epicycles)——这些圆首尾相连旋转时,最末端的运动轨迹恰好复现你画的图案。正如 3Blue1Brown 所说:"任何图案都可以用旋转的圆画出来"。


2. 数学原理

2.1 路径的复函数表示

将绘制的路径看作一个关于时间 \(t\) 的复值函数。路径上每个点 \((x(t), y(t))\) 对应复平面上的一个点:

\[ f(t) = x(t) + i\,y(t), \qquad t \in [0, 2\pi) \]

\(f(t)\) 是一个周期复函数——因为路径是闭合的,\(f(0) = f(2\pi)\)。

2.2 傅里叶级数展开

傅里叶告诉我们,任何周期复函数都可以写成旋转向量的和:

\[ \boxed{ f(t) = \sum_{n=-\infty}^{\infty} c_n \, e^{i n t} } \]

其中每一项 \(c_n e^{i n t}\) 代表一个旋转的圆

符号物理含义
\(c_n\)复数系数,决定圆的半径(\(|c_n|\))和初始相位(\(\arg(c_n)\))
\(n\)频率,决定圆的旋转速度(负频率对应反向旋转)
\(e^{i n t}\)单位复指数,表示以角速度 \(n\) 旋转的单位向量

2.3 傅里叶系数公式

系数 \(c_n\) 可通过内积求得:

\[ c_n = \frac{1}{2\pi} \int_0^{2\pi} f(t) \, e^{-i n t} \, dt \]

在离散情况下(我们将路径采样为 \(N\) 个点 \(f_k = f(2\pi k / N)\)),用 DFT 计算:

\[ \boxed{ c_n = \frac{1}{N} \sum_{k=0}^{N-1} f_k \, e^{-2\pi i n k / N} } \]

展开为实部和虚部(便于编程):

\[ \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\)。

2.4 旋转圆(Epicycle)的几何解释

每个傅里叶分量 \(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)\),恰好落在原始路径上。


3. 使用指南

3.1 基本操作

功能操作说明
绘制路径在画布上按住鼠标拖动绘制任意闭合图案,系统会自动将其分解为旋转圆的叠加
调整精度拖动"圆盘数量"滑块(2~300)更少的圆 → 更粗糙的近似;更多的圆 → 更精细的还原。理解"低频分量勾勒轮廓,高频分量补充细节"
调速速度滑块(0.1x ~ 4x)慢速观察每个圆如何旋转配合,快速预览整体绘图效果
预设图案点击预设按钮心形、蝴蝶、花瓣、方形——展示不同形状对应不同的频谱分布
导出 SVG点击导出按钮将绘制路径导出为标准 SVG 文件
重置重置按钮清空画布,重新绘制

3.2 实验探索


4. 算法原理与流程

4.1 路径预处理

  1. 记录笔迹:鼠标拖拽产生一系列稀疏点
  2. 均匀重采样:沿路径弧长等距采样 \(N=400\) 个点,确保 DFT 的均匀时间步假设成立
  3. 闭合路径:DFT 假设周期函数,自然将起点和终点连接

4.2 DFT 计算与排序

  1. 对 \(n = -\frac{N}{2}\) 到 \(\frac{N}{2}\) 计算 \(c_n\)
  2. 按幅度 \(|c_n|\) 降序排列——这样最大的圆(贡献最多的分量)排在最前面,视觉效果最好
  3. 用户可通过滑块控制实际使用的圆盘数量 \(M\)(2 ~ 300)

4.3 动画循环

每一帧:

  1. \(t\) 按速度参数递增
  2. 对前 \(M\) 个系数,计算旋转向量 \(c_n e^{i n t}\)
  3. 从原点出发,逐个叠加向量,画出圆和半径线
  4. 记录最后一个向量的尖端位置,写入轨迹缓冲区
  5. 渲染:原始路径(淡灰虚线)+ 旋转圆组(蓝色)+ 尖端轨迹(品红)

4.4 复杂度分析


5. 交互设计

功能操作
绘制路径在画布上按住鼠标拖动绘制闭合图案
调整精度滑块控制圆盘数量(2~300),更少的圆 → 更粗糙的近似 → 理解"低频分量勾勒轮廓,高频分量补充细节"
调速0.1x ~ 4x,慢速观察每个圆如何旋转配合
预设图案心形、蝴蝶、花瓣、方形,展示不同形状对应不同频谱
导出 SVG将绘制的路径导出为标准 SVG 文件

6. 教学价值

  1. 傅里叶级数的几何直觉:抽象公式变成可见的旋转圆,理解"基函数叠加"
  2. 频域与空间域的对偶:平滑曲线 = 低频为主,尖锐转角 = 需要高频分量
  3. 信息压缩:用前 20 个分量就能大致还原路径,看到"有损压缩"的直观效果
  4. 复数的几何意义:\(a+bi\) 不只是代数符号,而是平面上的旋转和缩放
  5. 从离散回到连续:增加圆盘数量,轨迹越来越贴近原始路径——极限过程的可视化