貝塞爾曲線(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

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