1. 定义

贝塞尔曲线(Bezier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如PhotoShop等。

贝塞尔曲线的一些特性:

使用

n

n

n个控制点

{

P

1

,

P

2

,

.

.

.

,

P

n

}

\{P_1,P_2,...,P_n\}

{P1​,P2​,...,Pn​}来控制曲线的形状曲线通过起始点

P

1

P_1

P1​和终止点

P

n

P_n

Pn​,接近但不通过中间点

P

2

P_2

P2​~

P

n

1

P_{n-1}

Pn−1​

2. 直观理解

Step 1. 在二维平面内选三个不同的点并依次用线段连接

Step 2. 在线段

A

B

AB

AB和

B

C

BC

BC上找到

D

D

D、

E

E

E两点,使得

A

D

D

B

=

B

E

E

C

\frac{AD}{DB}=\frac{BE}{EC}

DBAD​=ECBE​

Step 3. 连接

D

E

DE

DE,并在

D

E

DE

DE上找到

F

F

F点,使其满足

D

F

F

E

=

A

D

D

B

=

B

E

E

C

\frac{DF}{FE}=\frac{AD}{DB}=\frac{BE}{EC}

FEDF​=DBAD​=ECBE​(抛物线的三切线定理)

Step 4. 找出符合上述条件的所有点

上述为一个二阶贝塞尔曲线。同样的有

n

n

n阶贝塞尔曲线:

曲线图示一阶三阶四阶五阶

3. 公式推导

3.1 一次贝塞尔曲线(线性公式)

定义:给定点

P

0

P_0

P0​、

P

1

P_1

P1​,线性贝塞尔曲线只是一条两点之间的直线,这条线由下式给出,且其等同于线性插值:

B

(

t

)

=

P

0

+

(

P

1

P

0

)

t

=

(

1

t

)

P

0

+

t

P

1

,

t

[

0

,

1

]

B(t)=P_0+(P_1-P_0)t=(1-t)P_0+tP_1,\text{ } t\in[0,1]

B(t)=P0​+(P1​−P0​)t=(1−t)P0​+tP1​, t∈[0,1]

其中,公式里的

P

0

P_0

P0​、

P

1

P_1

P1​同步表示为其

x

x

x或

y

y

y轴坐标。

假设

P

0

P_0

P0​坐标为

(

a

,

b

)

(a,b)

(a,b),

P

1

P_1

P1​坐标为

(

c

,

d

)

(c,d)

(c,d),

P

2

P_2

P2​坐标为

(

x

,

y

)

(x,y)

(x,y),则有:

x

a

c

x

=

t

1

t

x

=

(

1

t

)

a

+

t

c

(3-1)

\frac{x-a}{c-x}=\frac{t}{1-t} \Rightarrow x=(1-t)a+tc \tag{3-1}

c−xx−a​=1−tt​⇒x=(1−t)a+tc(3-1)

同理有:

y

b

d

y

=

t

1

t

y

=

(

1

t

)

b

+

t

d

(3-2)

\frac{y-b}{d-y}=\frac{t}{1-t} \Rightarrow y=(1-t)b+td \tag{3-2}

d−yy−b​=1−tt​⇒y=(1−t)b+td(3-2)

于是可将

(

3

1

)

(

3

2

)

(3-1) (3-2)

(3−1)(3−2)简写为:

B

(

t

)

=

(

1

t

)

P

0

+

t

P

1

,

t

[

0

,

1

]

(3-3)

B(t)=(1-t)P_0+tP_1 ,\text{ } t\in[0,1] \tag{3-3}

B(t)=(1−t)P0​+tP1​, t∈[0,1](3-3)

3.2 二次贝塞尔曲线(二次方公式)

定义:二次贝塞尔曲线的路径由给定点

P

0

P_0

P0​、

P

1

P_1

P1​、

P

2

P_2

P2​的函数

B

(

t

)

B(t)

B(t)给出:

B

(

t

)

=

(

1

t

)

2

P

0

+

2

t

(

1

t

)

P

1

+

t

2

P

2

,

t

[

0

,

1

]

B(t)=(1-t)^{2} P_0+2t(1-t)P_1+t^2P_2,\text{ } t\in [0,1]

B(t)=(1−t)2P0​+2t(1−t)P1​+t2P2​, t∈[0,1]

假设

P

0

P

1

P_0P_1

P0​P1​上的点为

A

A

A,

P

1

P

2

P_1P_2

P1​P2​上的点为

B

B

B,

A

B

AB

AB上的点为

C

C

C(也即

C

C

C为曲线上的点。则根据一次贝塞尔曲线公式有:

A

=

(

1

t

)

P

0

+

t

P

1

B

=

(

1

t

)

P

1

+

t

P

2

C

=

(

1

t

)

A

+

t

B

(3-4)

\begin{array}{l} A=(1-t)P_0+tP_1 \\ B=(1-t)P_1+tP_2 \\ C=(1-t)A+tB \end{array} \tag{3-4}

A=(1−t)P0​+tP1​B=(1−t)P1​+tP2​C=(1−t)A+tB​(3-4)

将上式中

A

A

A、

B

B

B带入

C

C

C中,即可得到二次贝塞尔曲线的公式:

B

(

t

)

=

(

1

t

)

2

P

0

+

2

t

(

1

t

)

P

1

+

t

2

P

2

,

t

[

0

,

1

]

(3-5)

B(t)=(1-t)^{2} P_0+2t(1-t)P_1+t^2P_2,\text{ } t\in [0,1] \tag{3-5}

B(t)=(1−t)2P0​+2t(1−t)P1​+t2P2​, t∈[0,1](3-5)

3.3 三次贝塞尔曲线(三次方公式)

同理可得三次贝塞尔曲线公式:

B

(

t

)

=

(

1

t

)

3

P

0

+

3

t

(

1

t

)

2

P

1

+

3

t

2

(

1

t

)

P

2

+

t

3

P

3

,

t

[

0

,

1

]

(3-6)

B(t)=(1-t)^{3} P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+t^3P_3,\text{ } t\in [0,1] \tag{3-6}

B(t)=(1−t)3P0​+3t(1−t)2P1​+3t2(1−t)P2​+t3P3​, t∈[0,1](3-6)

3.4

n

n

n次贝塞尔曲线(一般参数公式)

定义:给定点

P

0

,

P

1

,

.

.

.

,

P

n

P_0,P_1,...,P_n

P0​,P1​,...,Pn​,则

n

n

n次贝塞尔曲线由下式给出:

n

n

n次贝塞尔曲线的公式可由如下递归表达:

P

0

n

=

(

1

t

)

P

0

n

1

+

t

P

1

n

1

,

t

[

0

,

1

]

(3-7)

P_0^n=(1-t)P_0^{n-1}+tP_1^{n-1},\text{ }t\in[0,1] \tag{3-7}

P0n​=(1−t)P0n−1​+tP1n−1​, t∈[0,1](3-7)

进一步可以得到贝塞尔曲线的递推计算公式:

P

i

k

{

P

i

,

k

=

0

(

1

t

)

P

i

k

1

+

t

P

i

+

1

k

1

,

k

=

1

,

2

,

.

.

.

,

n

;

i

=

0

,

1

,

.

.

.

,

n

k

P_i^k \begin{cases} P_i , \text{ } k=0 \\ (1-t)P_i^{k-1}+tP_{i+1}^{k-1} , \text{ } k=1,2,...,n; \text{ } i=0,1,...,n-k \end{cases}

Pik​{Pi​, k=0(1−t)Pik−1​+tPi+1k−1​, k=1,2,...,n; i=0,1,...,n−k​

这就是德卡斯特里奥算法(De Casteljau’s algorithm)

参考

[1] https://www.jianshu.com/p/0c9b4b681724 [2] https://www.jianshu.com/p/8f82db9556d2