贝塞尔曲线:优雅的数学艺术
贝塞尔曲线:优雅的数学艺术
1. 什么是贝塞尔曲线?
贝塞尔曲线(Bézier Curve)是一种由控制点定义的参数化曲线,广泛应用于计算机图形学、动画设计、字体渲染和工程建模中。它由法国工程师皮埃尔·贝塞尔(Pierre Bézier)在20世纪60年代提出,最初用于汽车车身设计。
核心特点
- 由控制点定义:曲线形状由一组控制点 P 0 , P 1 , … , P n P_0, P_1, \dots, P_n P0,P1,…,Pn 决定。
- 光滑性:曲线始终位于控制点的凸包内,且具有连续可微性( C ∞ C^\infty C∞ 光滑)。
- 递归定义:可通过德卡斯特里奥算法(De Casteljau’s algorithm)递归计算。
2. 贝塞尔曲线的数学表达
(1) 一般形式
n n n 阶贝塞尔曲线由 n + 1 n+1 n+1 个控制点定义,其参数方程如下:
B ( t ) = ∑ i = 0 n ( n i ) ( 1 − t ) n − i t i P i , t ∈ [ 0 , 1 ] \mathbf{B}(t) = \sum_{i=0}^n \binom{n}{i} (1-t)^{n-i} t^i \mathbf{P}_i, \quad t \in [0,1] B(t)=i=0∑n(in)(1−t)n−itiPi,t∈[0,1]
其中:
- P i \mathbf{P}_i Pi 是第 i i i 个控制点(向量)。
- ( n i ) \binom{n}{i} (in) 是二项式系数(组合数)。
(2) 常见贝塞尔曲线
阶数 | 名称 | 方程 |
---|---|---|
1阶 | 线性贝塞尔曲线 | B ( t ) = ( 1 − t ) P 0 + t P 1 \mathbf{B}(t) = (1-t)\mathbf{P}_0 + t\mathbf{P}_1 B(t)=(1−t)P0+tP1 |
2阶 | 二次贝塞尔曲线 | B ( t ) = ( 1 − t ) 2 P 0 + 2 ( 1 − t ) t P 1 + t 2 P 2 \mathbf{B}(t) = (1-t)^2 \mathbf{P}_0 + 2(1-t)t \mathbf{P}_1 + t^2 \mathbf{P}_2 B(t)=(1−t)2P0+2(1−t)tP1+t2P2 |
3阶 | 三次贝塞尔曲线 | B ( t ) = ( 1 − t ) 3 P 0 + 3 ( 1 − t ) 2 t P 1 + 3 ( 1 − t ) t 2 P 2 + t 3 P 3 \mathbf{B}(t) = (1-t)^3 \mathbf{P}_0 + 3(1-t)^2 t \mathbf{P}_1 + 3(1-t)t^2 \mathbf{P}_2 + t^3 \mathbf{P}_3 B(t)=(1−t)3P0+3(1−t)2tP1+3(1−t)t2P2+t3P3 |
注:高阶贝塞尔曲线计算复杂,实际应用中常使用分段低阶曲线(如三次贝塞尔曲线)。
3. MATLAB 实现
我们使用 MATLAB 绘制二次和三次贝塞尔曲线,并可视化控制点和曲线变化。
(1) 二次贝塞尔曲线
% 定义控制点
P0 = [0, 0];
P1 = [2, 3];
P2 = [4, 0];% 参数 t ∈ [0,1]
t = linspace(0, 1, 100);% 计算贝塞尔曲线
Bx = (1-t).^2 .* P0(1) + 2*(1-t).*t .* P1(1) + t.^2 .* P2(1);
By = (1-t).^2 .* P0(2) + 2*(1-t).*t .* P1(2) + t.^2 .* P2(2);% 绘制
figure;
plot([P0(1), P1(1), P2(1)], [P0(2), P1(2), P2(2)], 'ro--'); % 控制点连线
hold on;
plot(Bx, By, 'b-', 'LineWidth', 2); % 贝塞尔曲线
title('二次贝塞尔曲线');
legend('控制多边形', '贝塞尔曲线');
grid on;
运行结果:
(2) 三次贝塞尔曲线
% 定义控制点
P0 = [0, 0];
P1 = [1, 4];
P2 = [3, 4];
P3 = [4, 0];% 参数 t ∈ [0,1]
t = linspace(0, 1, 100)';% 计算贝塞尔曲线
B = (1-t).^3 .* P0 + 3*(1-t).^2 .* t .* P1 + 3*(1-t).*t.^2 .* P2 + t.^3 .* P3;% 绘制
figure;
plot([P0(1), P1(1), P2(1), P3(1)], [P0(2), P1(2), P2(2), P3(2)], 'ro--'); % 控制点连线
hold on;
plot(B(:,1), B(:,2), 'b-', 'LineWidth', 2); % 贝塞尔曲线
title('三次贝塞尔曲线');
legend('控制多边形', '贝塞尔曲线');
grid on;
运行结果:
4. 贝塞尔曲线的应用
- 计算机图形学:Photoshop 钢笔工具、SVG 路径、3D 建模。
- 动画设计:平滑关键帧插值(如 CSS
cubic-bezier
)。 - 字体设计:TrueType 字体使用二次贝塞尔曲线。
- 机器人路径规划:生成平滑运动轨迹。
5. 总结
- 贝塞尔曲线通过控制点定义,具有光滑性和凸包性。
- MATLAB 可轻松实现二次、三次贝塞尔曲线,并支持交互式调整。
- 广泛应用于图形学、动画、工程设计等领域。