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. 在二维平面内选三个不同的点并依次用线段连接

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_二维

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

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_贝塞尔曲线_02

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(抛物线的三切线定理)

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_贝济埃曲线_03


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

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_ios 贝塞尔曲线实现_04


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

曲线

图示

一阶

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_贝塞尔曲线_05

三阶

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_ios 贝塞尔曲线实现_06

四阶

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_ios 贝塞尔曲线实现_07

五阶

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_贝塞尔曲线_08

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]

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_ios 贝塞尔曲线实现_09

其中,公式里的 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),则有:

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_贝济埃曲线_10同理有:

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_贝塞尔曲线_11于是可将 ( 3 − 1 ) ( 3 − 2 ) (3-1) (3-2) (3−1)(3−2)简写为:

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_贝济埃曲线_123.2 二次贝塞尔曲线(二次方公式)

定义:二次贝塞尔曲线的路径由给定点 P 0 P_0 P0、 P 1 P_1 P1、 P 2 P_2 P2的函数 B ( t ) B(t) B(t)给出:
ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_贝济埃曲线_13

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_ios 贝塞尔曲线实现_04

假设 P 0 P 1 P_0P_1 P0P1上的点为 A A A, P 1 P 2 P_1P_2 P1P2上的点为 B B B, A B AB AB上的点为 C C C(也即 C C C为曲线上的点。则根据一次贝塞尔曲线公式有:

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_贝济埃曲线_15A=(1−t)P0+tP1B=(1−t)P1+tP2C=(1−t)A+tB

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_贝塞尔曲线_16将上式中 A A A、 B B B带入 C C C中,即可得到二次贝塞尔曲线的公式:

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_贝济埃曲线_17

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

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

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_ios 贝塞尔曲线实现_18

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

定义:给定点 P 0 , P 1 , . . . , P n P_0,P_1,...,P_n P0,P1,...,Pn,则 n n n次贝塞尔曲线由下式给出:

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_二维_19

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

ios 贝塞尔曲线实现 贝塞尔曲线绘制原理_ios 贝塞尔曲线实现_20进一步可以得到贝塞尔曲线的递推计算公式:

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

{Pi, k=0(1−t)Pk−1i+tPk−1i+1, k=1,2,...,n; i=0,1,...,n−k

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