在數學的數值分析領域中，貝茲曲線是計算機圖形學中相當重要的引數曲線。更高維度的廣泛化貝茲曲線就稱作，其中是一種特殊的例項。 貝茲曲線於 1962 年，由法國工程師皮埃爾貝茲所廣泛發表，他運用貝茲曲線來為汽車的主體進行設計。貝茲曲線最初由於 1959 年運用德卡斯特里奧演演算法開發，以穩定數值的方法求出貝茲曲線。 例項說明 線性貝茲曲線 給定點 P0、P1，線性貝茲曲線只是一條兩點之間的直線。這條線由下式給出： mathbf Btmathbf P_0 mathbf P_1mathbf P_0 t1tmathbf P_0 tmathbf P_1 mbox t in 01 且其等同於線性插值。 二次方貝茲曲線 二次方貝茲曲線的路徑由給定點 P0、P1、P2 的函式 B（t）追蹤： mathbf Bt 1 t2mathbf P_0 2t 1 tmathbf P_1 t2mathbf P_2 mbox t in 01 TrueType 字型就運用了以貝茲樣條組成的二次貝茲曲線。 三次方貝茲曲線 P0、P1、P2、P3 四個點在平面或在三維空間中定義了三次方貝茲曲線。曲線起始於 P0 走向 P1，並從 P2 的方向來到 P3。一般不會經過 P1 或 P2；這兩個點只是在那裡提供方向資訊。P0 和 P1 之間的間距，決定了曲線在轉而趨進 P2 之前，走向 P1 方向的「長度有多長」。 曲線的引數形式為： mathbf Btmathbf P_0 1t33mathbf P_1t 1t23mathbf P_2t2 1tmathbf P_3t3 mbox t in 01 現代的成象系統，如 PostScript、Asymptote 和 Metafont，運用了以貝茲樣條組成的三次貝茲曲線，用來描繪曲線輪廓。 一般化 n 階貝茲曲線可如下推斷。給定點 P0、P1、、Pn，其貝茲曲線即 mathbf Btsum_i0n nchoose imathbf P_i 1tni ti nchoose 0mathbf P_0 1tnt0nchoose 1mathbf P_1 1tn1 t1cdotsnchoose n1mathbf P_n11t1 tn1nchoose nmathbf P_n 1t0 tn mbox t in 01。 例如 n5： mathbf Btmathbf P_0 1t55mathbf P_1t 1t410mathbf P_2t2 1t310mathbf P_3t3 1t25mathbf P_4t4 1tmathbf P_5t5 mbox t in 01。 如上公式可如下遞迴表達： 用 mathbf B_mathbf P_0mathbf P_1ldotsmathbf P_n 表示由點 P0、P1、、Pn 所決定的貝茲曲線。則 mathbf Bt mathbf B_mathbf P_0mathbf P_1ldotsmathbf P_nt 1tmathbf B_mathbf P_0mathbf P_1ldotsmathbf P_n1t tmathbf B_mathbf P_1mathbf P_2ldotsmathbf P_nt 用平常話來說，n 階的貝茲曲線，即雙 n1 階貝茲曲線之間的插值。 術語 一些關於引數曲線的術語，有 mathbf Bt sum_i0n mathbf P_imathbf b_intquad tin 01 即多項式 mathbf b_int nchoose i ti 1tniquad i0ldots n 又稱作 n 階的伯恩斯坦基底多項式，定義 00 1。 點 Pi 稱作貝茲曲線的控制點。多邊形以帶有線的貝茲點連線而成，起始於 P0 並以 Pn 終止，稱作貝茲多邊形（或控制多邊形）。貝茲多邊形的凸包（convex hull）包含有貝茲曲線。 註解 開始於 P0 並結束於 Pn 的曲線，即所謂的端點插值法屬性。 曲線是直線的充分必要條件是所有的控制點都在曲線上。同樣的，貝茲曲線是直線的充分必要條件是控制點共線。 曲線的起始點（結束點）相切於貝茲多邊形的第一節（最後一節）。 一條曲線可在任意點切割成兩條或任意多條子曲線，每一條子曲線仍是貝茲曲線。 一些看似簡單的曲線（如圓）無法以貝茲曲線精確的描述，或分段成貝茲曲線（雖然當每個內部控制點對單位圓上的外部控制點水平或垂直的的距離為 4left sqrt 2 1right3 時，分成四段的貝茲曲線，可以小於千分之一的最大半徑誤差近似於圓）。 位於固定偏移量的曲線（來自給定的貝茲曲線），又稱作偏移曲線（假平行於原來的曲線，如兩條鐵軌之間的偏移）無法以貝茲曲線精確的形成（某些平凡例項除外）。無論如何，現存的啟發法通常可為實際用途中給出近似值。 構建貝茲曲線 線性曲線 線性貝茲曲線演示動畫，t 在 01 區間 線性貝茲曲線函式中的 t 會經過由 P0 至 P1 的 B（t）所描述的曲線。例如當 t025 時，B（t）即一條由點 P0 至 P1 路徑的四分之一處。就像由 0 至 1 的連續 t，B（t）描述一條由 P0 至 P1 的直線。 二次曲線 為建構二次貝茲曲線，可以中介點 Q0 和 Q1 作為由 0 至 1 的 t： 由 P0 至 P1 的連續點 Q0，描述一條線性貝茲曲線。 由 P1 至 P2 的連續點 Q1，描述一條線性貝茲曲線。 由 Q0 至 Q1 的連續點 B（t），描述一條二次貝茲曲線。 styleborderbottom 1px solid 22ff22 二次貝茲曲線的結構 二次貝茲曲線演示動畫，t 在 01 區間 高階曲線 為建構高階曲線，便需要相應更多的中介點。對於三次曲線，可由線性貝茲曲線描述的中介點 Q0、Q1、Q2，和由二次曲線描述的點 R0、R1 所建構： styleborderbottom 1px solid 2222ff 三次貝茲曲線的結構 三次貝茲曲線演示動畫，t 在 01 區間 對於四次曲線，可由線性貝茲曲線描述的中介點 Q0、Q1、Q2、Q3，由二次貝茲曲線描述的點 R0、R1、R2，和由三次貝茲曲線描述的點 S0、S1 所建構： styleborderbottom 1px solid ff22ff 四次貝茲曲線的結構 四次貝茲曲線演示動畫，t 在 01 區間 還可參閱五階貝茲曲線的構成： 五次貝茲曲線演示動畫，t 在 01 區間 這些運動軌跡使用德卡斯特里奧演算法計算出貝塞爾曲線。 升階 n 次貝茲曲線可以轉換為一個形狀完全相同的 n1 次貝茲曲線。 這在軟體只支援特定階次的貝茲曲線時很有用。 例如，Cairo 只支援三次貝茲曲線，你就可以用升階的方法在 Cairo 畫出二次貝茲曲線。 我們利用 mathbf Bt 1tmathbf Bt tmathbf Bt 這個特性來做升階。我們把曲線方程式中每一項 mathbf b_intmathbf P_i 都乘上 1 t 或 t，讓每一項都往上升一階。以下是將二階升為三階的範例 begin align quad 1 t2mathbf P_0 2 1 t tmathbf P_1 t2mathbf P_2 1 t3mathbf P_0 1 t2 tmathbf P_0 2 1 t2 tmathbf P_1 qquad 2 1 t t2mathbf P_1 1 t t2mathbf P_2 t3mathbf P_2 1 t3mathbf P_0 3 1 t2 tfrac mathbf P_0 2mathbf P_13 3 1 t t2frac 2mathbf P_1 mathbf P_23 t3mathbf P_2 end align 對任何的 n 值，我們都可以使用以下等式 n1 choose i1tmathbf b_in n choose i mathbf b_in1 quad 1tmathbf b_in frac n1in1 mathbf b_in1 n1 choose i1 tmathbf b_in n choose i mathbf b_i1n1 quad tmathbf b_in frac i1n1 mathbf b_i1n1 begin align mathbf Bt 1tsum_i0n mathbf b_intmathbf P_i tsum_i0n mathbf b_intmathbf P_i sum_i0n frac n1in1mathbf b_in1tmathbf P_i sum_i0n frac i1n1mathbf b_i1n1tmathbf P_i sum_i0n1 left frac in1mathbf P_i1 frac n1in1mathbf P_iright mathbf b_in1t sum_i0n1 mathbf b_in1tmathbf P_i end align 式中 mathbf P_1 和 mathbf P_n1 可以任意挑選。 因此，新的控制點為 mathbf P_i frac in1mathbf P_i1 frac n1in1mathbf P_iquad i0ldots n1 應用 電腦繪圖 由於需要點陣化更精細的解析度時，重新插值（補點）的計算量較小，貝茲曲線被廣泛地在計算機圖形中用來為平滑曲線建立模型。貝茲曲線是向量圖形檔案和相應軟體（如 PostScript、PDF 等）能夠處理的唯一曲線，用於光滑地近似其他曲線。 二次和三次貝茲曲線最為常用。 程式範例 下列程式碼為一簡單的實際運用範例，展示如何使用 C 語言標出三次方貝茲曲線。注意，此處僅簡單的計算多項式係數，並讀盡一系列由 0 至 1 的 t 值；實踐中一般不會這麼做，遞迴求解通常會更快速 以更多的記憶體為代價，花費較少的處理器時間。不過直接的方法較易於理解並產生相同結果。以下程式碼已使運算更為清晰。實踐中的最佳化會先計算係數一次，並在實際計算曲線點的迴圈中反複使用。此處每次都會重新計算，損失了效率，但程式碼更清楚易讀。 曲線的計算可在曲線陣列上將相連點畫上直線 點越多，曲線越平滑。 在部分架構中，下以程式碼也可由動態規劃進行最佳化。舉例來說，dt 是一個常數，cx t 則等同於每次反覆就修改一次常數。經反覆應用這種最佳化後，迴圈可被重寫為沒有任何乘法（雖然這個過程不是穩定數值的）。 產生三次方貝茲曲線的程式碼 typedef struct float x float y Point2D cp 在此是四個元素的陣列 cp 0 為起始點，或上圖中的 P0 cp 1 為第一個控制點，或上圖中的 P1 cp 2 為第二個控制點，或上圖中的 P2 cp 3 為結束點，或上圖中的 P3 t 為引數值，0 t 1 Point2D PointOnCubicBezier Point2D cp float t float ax bx cx float ay by cy float tSquared tCubed Point2D result 計算多項式係數 cx 30 cp 1x cp 0x bx 30 cp 2x cp 1x cx ax cp 3x cp 0x cx bx cy 30 cp 1y cp 0y by 30 cp 2y cp 1y cy ay cp 3y cp 0y cy by 計算位於引數值 t 的曲線點 tSquared t t tCubed tSquared t resultx ax tCubed bx tSquared cx t cp 0x resulty ay tCubed by tSquared cy t cp 0y return result ComputeBezier 以控制點 cp 所產生的曲線點，填入 Point2D 結構的陣列。 呼叫者必須分配足夠的記憶體以供輸出結果，其為 sizeof Point2D numberOfPoints void ComputeBezier Point2D cp int numberOfPoints Point2D curve float dt int i dt 10 numberOfPoints 1 for i 0 i numberOfPoints i curve i PointOnCubicBezier cp idt 另一種貝茲曲線的應用是在動畫中，描述物件的運動路徑等等。此處，曲線的 x、y 位置不用來標示曲線，但用來表示圖形位置。當用在這種形式時，連續點之間的距離會變的更為重要，且大多不是平均比例。點將會串的更緊密，控制點更接近每一個點，而更為稀疏的控制點會散的更開。如果需要線性運動速度，進一步處理時就需要循所需路徑將點平均分散。 多項式表示法 有時我們可能想要把貝茲曲線表示為多項式，而非比較不直接的伯恩斯坦多項式。使用二項式定理和貝茲曲線的定義，重新整理後可以得到： mathbf Bt sum_j 0n tj mathbf C_j 此處 mathbf C_j frac nn j sum_i 0j frac 1i j mathbf P_ii j i prod_m 0j 1 n m sum_i 0j frac 1i j mathbf P_ii j i 計算曲線上的點時需要多次計算 mathbf Bt，因此事先計算好 mathbf C_j 會比較實際；然而要小心高階曲線可能會缺乏數值穩定性（需使用德卡斯特里奧演算法來處理）。注意其空積為 1。 有理貝茲曲線 有理貝茲增加可調節的權重，以提供更近似於隨意的形狀。分子是加權的伯恩斯坦形式貝茲曲線，而分母是加權的伯恩斯坦多項式的總和。 給定 n 1 控制點 Pi，有理貝茲曲線可如下描述： mathbf Bt frac sum_i0n b_int mathbf P_i w_i sum_i0n b_int w_i 或簡單的 mathbf Bt frac sum_i0n n choose i ti 1tnimathbf P_i w_i sum_i0n n choose i ti 1tni w_i 參閱 德卡斯特里奧演算法 樣條 貝茲樣條 貝茲曲面 貝茲三角 NURBS ，Bézier curves are also formed by many common forms of string art where strings are looped across a frame of nails 埃爾米特曲線 參考文獻 引用 來源 Paul Bourke Bézier curves httpswebarchiveorgweb20060708162825httpastronomyswineduau7Epbourkecurvesbezier Donald Knuth Metafont the Program AddisonWesley 1986 pp 123131 Excellent discussion of implementation details available for free as part of the TeX distribution Dr Thomas Sederberg BYU Bézier curves httpswebarchiveorgweb20060221000535httpwwwtsplinescomresourcesclass_notesBezier_curvespdf JD Foley et al Computer Graphics Principles and Practice in C 2nd ed Addison Wesley 1992 外部連結 三階貝茲曲線 applet 即時數學貝茲 applet 各種樣條型別的即時數學貝茲 applet，樣條的 JAVA 程式設計 在互動式介紹樣條 Hermite 與 Bezier 曲線繪製方法 北斗星君簡介貝茲曲線 貝茲曲線 Category 插值論