前言
贝塞尔曲线一直是计算机绘图中的重点,我们常见的PhotoShop和Svg图片等和网页上的图片啊之类的就大量使用了贝塞尔曲线。该文使用html5中的Canvas标签,由特点、原理、实例等各个方面深入研究了贝塞尔曲线的应用与意义。
一、基本简介
贝塞尔曲线是应用于二维图形应用程序的数学曲线。曲线的定义有四个点:起始点、终止点(也称锚点)以及两个相互分离的中间点。滑动两个中间点,贝塞尔曲线的形状会发生变化。二十世纪六十年代晚期,PierreBézier应用数学方法为雷诺公司的汽车制造业描绘出了贝塞尔曲线。
二、一些特点
- 有起始点;
- 由连续的控制点{P0,P1,…Pn-1}控制曲线的形状;
- 描绘的线段一般不经过控制点。
三、一个例子
二次贝塞尔曲线
起始点坐标P1(50,50),P2(50,200)
控制点坐标P3(200,200)
该曲线整体划分为200(随机个数)个点,当前图片取得是第80个点
在线段P1P2和P2P3上取得D和F点,使得:
P
1
D
P
1
P
2
=
P
2
F
P
2
P
3
,
{P_1D \over P_1P_2} = {P_2F \over P_2P_3} \,,
P1P2P1D=P2P3P2F, 在链接DF,并在线段DF上找到H点,使得:
D
H
D
F
=
P
1
D
P
1
P
2
=
P
2
F
P
2
P
3
。
{ DH \over DF } = { P_1D \over P_1P_2 } = {P_2F \over P_2P_3}\,。
DFDH=P1P2P1D=P2P3P2F。
=>D(50,110),F(110,200),H(74,146)
H点即是第80个点的坐标,根据上述关系,找到所有200个点,就得到下图。
=>得到了一条曲线
=>贝塞尔曲线其实就是一系列点的集合(只要点够多,就越趋近线段)
下面展示一下一个一次,三次,四次,五次贝塞尔曲线的例子:
贝塞尔曲线 | 示例 |
---|---|
一 | ![]() |
三 | ![]() |
四 | ![]() |
五 | ![]() |
相应推导过程与上面二次贝塞尔的一样,只是需要更多步骤。
四、公式推导
给定一一个系数 t ∈ [ 0 , 1 ] t \in [0,1] t∈[0,1]。
1、一次贝塞尔曲线
设P1坐标为(a,b),P2坐标为(c,d)
在线段P1P2上取得一点H(e,f),使得:
t
=
P
1
H
P
1
P
2
=
(
e
−
a
,
f
−
b
)
(
c
−
a
,
d
−
b
)
t={P_1H \over P_1P_2} = {(e-a,f-b) \over (c-a,d-b)} \,
t=P1P2P1H=(c−a,d−b)(e−a,f−b)。
=>
{
e
=
t
(
c
−
a
)
+
a
=
t
c
+
(
1
−
t
)
a
f
=
t
(
d
−
b
)
+
b
=
t
d
+
(
1
−
t
)
b
\begin{cases} e=t(c-a)+a=tc+(1-t)a \\ f=t(d-b)+b=td+(1-t)b \end{cases}
{e=t(c−a)+a=tc+(1−t)af=t(d−b)+b=td+(1−t)b
=>
B
(
t
)
=
(
P
2
−
P
1
)
∗
t
+
P
1
=
(
1
−
t
)
P
1
+
t
P
2
B(t)=(P_2-P_1)*t+P_1=(1-t)P_1+tP_2
B(t)=(P2−P1)∗t+P1=(1−t)P1+tP2。
所以一次贝塞尔曲线中各点
B
(
t
)
B(t)
B(t)为:
(
P
2
−
P
1
)
∗
t
+
P
1
=
(
1
−
t
)
P
1
+
t
P
2
(P_2-P_1)*t+P_1=(1-t)P_1+tP_2
(P2−P1)∗t+P1=(1−t)P1+tP2。
2、二次贝塞尔曲线
由例子部分内容及一次贝塞尔曲线公式:
=>
{
D
=
(
1
−
t
)
P
1
+
t
P
2
F
=
(
1
−
t
)
P
2
+
t
P
3
H
=
(
1
−
t
)
D
+
t
F
\begin{cases} D=(1-t)P_1+tP_2 \\ F=(1-t)P_2+tP_3 \\ H=(1-t)D+tF \end{cases}
⎩⎪⎨⎪⎧D=(1−t)P1+tP2F=(1−t)P2+tP3H=(1−t)D+tF
=>
B
(
t
)
=
H
=
(
1
−
t
)
2
p
1
+
2
t
(
1
−
t
)
P
2
+
t
2
P
3
B(t)=H=(1-t)^2p_1+2t(1-t)P_2+t^2P_3
B(t)=H=(1−t)2p1+2t(1−t)P2+t2P3。
同理可得三次,四次,五次贝塞尔曲线公式:
3、三次贝塞尔曲线
B ( t ) = ( 1 − t ) 3 P 1 + 3 t ( 1 − t ) 2 P 2 + 3 t 2 ( 1 − t ) P 3 + t 3 P 4 B(t)=(1-t)^3P_1+3t(1-t)^2P_2+3t^2(1-t)P_3+t^3P_4 B(t)=(1−t)3P1+3t(1−t)2P2+3t2(1−t)P3+t3P4。
4、四次贝塞尔曲线
B ( t ) = ( 1 − t ) 4 P 1 + 4 t ( 1 − t ) 3 P 2 + 6 t 2 ( 1 − t ) 2 P 3 + 4 t 3 ( 1 − t ) P 4 + t 4 P 5 B(t)=(1-t)^4P_1+4t(1-t)^3P_2+6t^2(1-t)^2P_3+4t^3(1-t)P_4+t^4P_5 B(t)=(1−t)4P1+4t(1−t)3P2+6t2(1−t)2P3+4t3(1−t)P4+t4P5。
5、五次贝塞尔曲线
B
(
t
)
=
(
1
−
t
)
5
P
1
+
5
t
(
1
−
t
)
4
P
2
+
10
t
2
(
1
−
t
)
3
P
3
+
10
t
3
(
1
−
t
)
2
P
4
+
5
t
4
(
1
−
t
)
P
5
+
t
5
P
6
B(t)=(1-t)^5P_1+5t(1-t)^4P_2+10t^2(1-t)^3P_3+10t^3(1-t)^2P_4+5t^4(1-t)P_5+t^5P_6
B(t)=(1−t)5P1+5t(1−t)4P2+10t2(1−t)3P3+10t3(1−t)2P4+5t4(1−t)P5+t5P6。
由上述几个公式,研究规律,可以发现:
常数项 C = n ! i ! ( n − i ) ! , t ∈ [ 0 , n ] C={n! \over i!(n-i)!} ,t\in[0,n]\, C=i!(n−i)!n!,t∈[0,n](杨辉三角);
指数项 E t = i , i ∈ [ 0 , n ] E_t=i,i\in[0,n] Et=i,i∈[0,n];
指数项 E 1 − t = n − i , i ∈ [ 0 , 1 ] E_{1-t}=n-i,i \in[0,1] E1−t=n−i,i∈[0,1]。
由上述规律,我们得到n阶贝塞尔曲线公式:
一般公式
B
(
t
)
=
∑
i
=
0
n
n
!
i
!
(
n
−
i
)
!
t
i
(
1
−
t
)
n
−
i
P
i
=
(
1
−
t
)
n
P
0
+
n
!
(
n
−
i
)
!
t
(
1
−
t
)
n
−
1
P
1
+
.
.
.
+
t
P
n
B(t)=\sum_{\mathclap{i=0}}^n {n! \over i!(n-i)!}t^i(1-t)^{n-i}P_i=(1-t)^nP_0+{n! \over (n-i)!}t(1-t)^{n-1}P_1+...+tP_n
B(t)=i=0∑ni!(n−i)!n!ti(1−t)n−iPi=(1−t)nP0+(n−i)!n!t(1−t)n−1P1+...+tPn
由上述推导过程,可知不管几阶公式都是由一阶公式推导出来的:所以我们可以得到一个递推公式:
P
i
k
{
P
i
,
k
=
0
(
1
−
t
)
P
i
k
−
1
+
t
P
i
+
1
k
−
1
,
k
∈
[
1
,
n
−
k
]
P_i^k\begin{cases} P_i,k=0 \\ (1-t)P_i^{k-1}+tP_{i+1}^{k-1},k \in [1,n-k] \end{cases}
Pik{Pi,k=0(1−t)Pik−1+tPi+1k−1,k∈[1,n−k]
五、一些实例
由公式推导的递推公式可知,不管多复杂的贝塞尔曲线,我们都可以拆分成一阶贝塞尔曲线。由此关系,我们在canvas中的曲线逻辑就有一个眉目了,下面是两个用贝塞尔曲线绘制的示意图片(canvas以为我们内置了两个函数quadraticCurveTo和bezierCurveTo,分别代表二次贝塞尔曲线和三次贝塞尔曲线)。
类别 | 示例 |
---|---|
头像 | ![]() |
小孩 | ![]() |
由此可见,贝塞尔曲线的功能是很强大的,而他的应用也特别广泛,例如PhotoShop软件,SVG图片等等,我们都能看见他们的身影。
上述所有图片项目地址:贝塞尔曲线Demo
一些建议
- 平常绘图等尽量使用2-3阶贝塞尔曲线;
- 超过3阶的曲线尽量降阶为2-3阶贝塞尔曲线;
- 贝塞尔曲线本质上是一系列点的集合,需要大量的计算。
总结
贝塞尔曲线功能强大,应用广泛。我们不仅可以使用它绘制图片,还能应用与各个领域,例如激光切割啊等等。就像实例中展示的那样,使用贝塞尔曲线,我们可以绘制各种各样的图形,为计算机的图形图像技术产生了深远意义上的影响。基于此,贝塞尔曲线具有很高的研究意义,为我们的社会进步和发展注入了一针强心剂。