de Casteljau 構造 · 伯恩斯坦權重

貝茲曲線

在控制折線的每一段上取相同比例 t 的點,將它們連成較短的新折線,再逐層重複,直到只剩一點。當 t 從 0 走到 1,這一點畫出的就是貝茲曲線。

本頁視覺化中的貝茲曲線

n次貝茲曲線由n+1個控制點P0,…,PnP_0, \dots, P_n決定:兩個點是線段,三個點是二次曲線,四個點就是繪圖軟體裡的三次曲線。曲線上的點B(t)B(t)(畫面中的紅點),是在控制折線的每一邊上反覆取比例t得到的。在這裡,你可以移動控制點,讓t從0掃到1,看構造中的線段留下一根根線,勾勒出曲線。

構造顯示目前t值下每一層的折線,每層比上一層少一條邊。掃描讓t從0走到1,以相等的t間距留下構造線,並依t上色。曲線本身是那條細線。

將構造寫成式子,就是一層層的加權平均,也就是 de Casteljau 演算法:

Pi0=Pi,Pik(t)=(1−t) Pik−1(t)+t Pi+1k−1(t),B(t)=P0n(t).P_i^0 = P_i, \qquad P_i^k(t) = (1 - t)\,P_i^{k-1}(t) + t\,P_{i+1}^{k-1}(t), \qquad B(t) = P_0^n(t) .

把這一層層的計算展開,每個控制點的係數就是若干個乘積的和,每個乘積有n個因子,而每個因子是1−t或t。對PiP_i來說,每個乘積恰好含有i個t,這樣的乘積共有(ni)\binom{n}{i}個,所以

B(t)=∑i=0nbi,n(t) Pi,bi,n(t)=(ni)ti(1−t)n−i.B(t) = \sum_{i=0}^{n} b_{i,n}(t)\, P_i, \qquad b_{i,n}(t) = \binom{n}{i} t^{i} (1 - t)^{n-i} .

這些權重是伯恩斯坦多項式,小圖畫的就是它們。0≤t≤10 \le t \le 1時,權重都不為負,加起來等於1,因此B(t)B(t)是控制點的加權平均,曲線不會跑出它們的凸包。把一個點PiP_i移動向量Δ,曲線上的每個點都會移動bi,n(t) Δb_{i,n}(t)\,\Delta,在t=i/nt = i/n附近移得最多。這一段不一定是離該控制點最近的一段。

t=0時,每一層都從P0P_0開始,所以B(0)=P0B(0) = P_0;同樣地,B(1)=PnB(1) = P_n。曲線通過兩個端點,通常不通過其餘的點。構造的最後一層只有一條線段,只要沒有縮成一個點,就位於曲線的切線上:

B′(t)=n(P1n−1(t)−P0n−1(t)),B′(0)=n (P1−P0),B′(1)=n (Pn−Pn−1).B'(t) = n \bigl(P_1^{n-1}(t) - P_0^{n-1}(t)\bigr), \qquad B'(0) = n\,(P_1 - P_0), \qquad B'(1) = n\,(P_n - P_{n-1}) .

因此曲線從P0P_0出發時朝向P1P_1,到達PnP_n時則從Pn−1P_{n-1}的方向過來,除非那一端的兩個點重合。這就是繪圖軟體把三次曲線中間的兩個點,顯示成從兩端伸出之控制把手的原因。

最後一層留下的線,只要不是單一點,就會在它所帶的那個點與曲線相切。低一層的線也以同樣的方式,與較少相鄰點所決定的曲線相切。因此每一族線都勾勒出自己的曲線,次數較低的曲線便出現在折線內部。勾勒不等於從一側包住:曲線在反曲點會穿過自己的切線,線會分布在兩側。三個控制點不共線時,二次曲線的線就像是在兩排直線排列的釘子間繞線做成的弦線畫,它們勾勒出的是拋物線。

t=s時的構造也能把曲線切成兩段。各層的第一個點,是0到s那一段的控制點;各層的最後一個點,則是s到1那一段的控制點,切開顯示的就是這兩組。一次次對半切下去,各段的控制折線會越來越貼近曲線。升階則往另一個方向:多一個控制點,曲線不變,折線更靠近曲線。而在畫面上按下新增的點,則會改變曲線。

雪鐵龍的保羅・德卡斯特里奧在1959年提出這個構造;雷諾的皮耶・貝茲獨立得到相同的曲線,並在1960年代發表。

值得留意的地方

  • t的步長相等,沿曲線走過的距離不一定相等。
  • 顏色最濃的地方不是曲線,而是線重疊最多的地方,可能稍微偏離曲線。

相關概念