贝塞尔曲线(Bezier Curve)原理及公式推导

1. 定义

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

贝塞尔曲线的一些特性:

  • 使用nn个控制点{P1,P2,...,Pn}\{P_1,P_2,...,P_n\}来控制曲线的形状
  • 曲线通过起始点P1P_1和终止点PnP_n,接近但不通过中间点P2P_2~Pn1P_{n-1}

2. 直观理解

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

在这里插入图片描述

Step 2. 在线段ABABBCBC上找到DDEE两点,使得ADDB=BEEC\frac{AD}{DB}=\frac{BE}{EC}

在这里插入图片描述

Step 3. 连接DEDE,并在DEDE上找到FF点,使其满足DFFE=ADDB=BEEC\frac{DF}{FE}=\frac{AD}{DB}=\frac{BE}{EC}(抛物线的三切线定理)

在这里插入图片描述
Step 4. 找出符合上述条件的所有点

在这里插入图片描述
上述为一个二阶贝塞尔曲线。同样的有nn阶贝塞尔曲线:

曲线 图示
一阶 在这里插入图片描述
三阶 在这里插入图片描述
四阶 在这里插入图片描述
五阶 在这里插入图片描述

3. 公式推导

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

定义:给定点P0P_0P1P_1,线性贝塞尔曲线只是一条两点之间的直线,这条线由下式给出,且其等同于线性插值:
B(t)=P0+(P1P0)t=(1t)P0+tP1, t[0,1] B(t)=P_0+(P_1-P_0)t=(1-t)P_0+tP_1,\text{ } t\in[0,1]

在这里插入图片描述

其中,公式里的P0P_0P1P_1同步表示为其xxyy轴座标。

假设P0P_0座标为(a,b)(a,b)P1P_1座标为(c,d)(c,d)P2P_2座标为(x,y)(x,y),则有:

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

同理有:

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

于是可将(31)(32)(3-1) (3-2)简写为:

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

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

定义:二次贝塞尔曲线的路径由给定点P0P_0P1P_1P2P_2的函数B(t)B(t)给出:
B(t)=(1t)2P0+2t(1t)P1+t2P2, t[0,1] B(t)=(1-t)^{2} P_0+2t(1-t)P_1+t^2P_2,\text{ } t\in [0,1]

在这里插入图片描述

假设P0P1P_0P_1上的点为AAP1P2P_1P_2上的点为BBABAB上的点为CC(也即CC为曲线上的点。则根据一次贝塞尔曲线公式有:

A=(1t)P0+tP1B=(1t)P1+tP2C=(1t)A+tB(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}

将上式中AABB带入CC中,即可得到二次贝塞尔曲线的公式:

B(t)=(1t)2P0+2t(1t)P1+t2P2, 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}

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

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

B(t)=(1t)3P0+3t(1t)2P1+3t2(1t)P2+t3P3, 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}

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

定义:给定点P0,P1,...,PnP_0,P_1,...,P_n,则nn次贝塞尔曲线由下式给出:
在这里插入图片描述

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

P0n=(1t)P0n1+tP1n1, 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}

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

Pik{Pi, k=0(1t)Pik1+tPi+1k1, k=1,2,...,n; i=0,1,...,nk 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}

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

参考

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章