1. 定義
貝塞爾曲線(Bezier curve),又稱貝茲曲線或貝濟埃曲線,是應用於二維圖形應用程序的數學曲線。一般的矢量圖形軟件通過它來精確畫出曲線,貝茲曲線由線段與節點組成,節點是可拖動的支點,線段像可伸縮的皮筋,我們在繪圖工具上看到的鋼筆工具就是來做這種矢量曲線的。貝塞爾曲線是計算機圖形學中相當重要的參數曲線,在一些比較成熟的位圖軟件中也有貝塞爾曲線工具,如PhotoShop等。
貝塞爾曲線的一些特性:
- 使用n個控制點{P1,P2,...,Pn}來控制曲線的形狀
- 曲線通過起始點P1和終止點Pn,接近但不通過中間點P2~Pn−1
2. 直觀理解
Step 1. 在二維平面內選三個不同的點並依次用線段連接
Step 2. 在線段AB和BC上找到D、E兩點,使得DBAD=ECBE
Step 3. 連接DE,並在DE上找到F點,使其滿足FEDF=DBAD=ECBE(拋物線的三切線定理)
Step 4. 找出符合上述條件的所有點
上述爲一個二階貝塞爾曲線。同樣的有n階貝塞爾曲線:
3. 公式推導
3.1 一次貝塞爾曲線(線性公式)
定義:給定點P0、P1,線性貝塞爾曲線只是一條兩點之間的直線,這條線由下式給出,且其等同於線性插值:
B(t)=P0+(P1−P0)t=(1−t)P0+tP1, t∈[0,1]
其中,公式裏的P0、P1同步表示爲其x或y軸座標。
假設P0座標爲(a,b),P1座標爲(c,d),P2座標爲(x,y),則有:
c−xx−a=1−tt⇒x=(1−t)a+tc(3-1)
同理有:
d−yy−b=1−tt⇒x=(1−t)b+td(3-2)
於是可將(3−1)(3−2)簡寫爲:
B(t)=(1−t)P0+tP1, t∈[0,1](3-3)
3.2 二次貝塞爾曲線(二次方公式)
定義:二次貝塞爾曲線的路徑由給定點P0、P1、P2的函數B(t)給出:
B(t)=(1−t)2P0+2t(1−t)P1+t2P2, t∈[0,1]
假設P0P1上的點爲A,P1P2上的點爲B,AB上的點爲C(也即C爲曲線上的點。則根據一次貝塞爾曲線公式有:
A=(1−t)P0+tP1B=(1−t)P1+tP2C=(1−t)A+tB(3-4)
將上式中A、B帶入C中,即可得到二次貝塞爾曲線的公式:
B(t)=(1−t)2P0+2t(1−t)P1+t2P2, t∈[0,1](3-5)
3.3 三次貝塞爾曲線(三次方公式)
同理可得三次貝塞爾曲線公式:
B(t)=(1−t)3P0+3t(1−t)2P1+3t2(1−t)P2+t3P3, t∈[0,1](3-6)
3.4 n次貝塞爾曲線(一般參數公式)
定義:給定點P0,P1,...,Pn,則n次貝塞爾曲線由下式給出:
n次貝塞爾曲線的公式可由如下遞歸表達:
P0n=(1−t)P0n−1+tP1n−1, t∈[0,1](3-7)
進一步可以得到貝塞爾曲線的遞推計算公式:
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