簡介
bezierkit 是處理 Bézier 曲線的小型數學工具套件。它可由控制點或端點條件建構曲線,計算曲線值與導數,分割與截取曲線,將曲線擬合到函數、取樣點與等值線,並輸出為 JSON、SVG 路徑資料或 TikZ。套件本身不繪圖,繪圖交給 Matplotlib、mosaickit 或 LaTeX 文件等繪圖端,它們收到的是精確的三次控制點。
符號
點或向量位於某個維度 \(d \ge 1\) 的 \(\mathbb{R}^d\) 中;多數圖使用 \(d = 2\)。\(x \in \mathbb{R}^d\) 的歐氏範數為
\(\left\lVert x \right\rVert_\infty = \max_k |x_k|\) 為最大範數。集合 \(S \subseteq \mathbb{R}^d\) 若對所有 \(p, q \in S\) 與 \(\lambda \in [0, 1]\) 都有 \(\lambda p + (1 - \lambda) q \in S\),稱為凸集;有限個點的凸包是它們所有凸組合 \(\sum_i \lambda_i P_i\)(\(\lambda_i \ge 0\) 且 \(\sum_i \lambda_i = 1\))的集合。映射 \(A: \mathbb{R}^d \to \mathbb{R}^e\) 若可寫成 \(A(x) = M x + v\)(\(M\) 為矩陣,\(v\) 為向量),稱為仿射映射。函數若有直到 \(k\) 階的連續導數,稱為 \(C^k\)。
\(n\) 次 Bézier 曲線有 \(n + 1\) 個控制點 \(P_0, \ldots, P_n\),定義為映射
其中
為 Bernstein 多項式(詳見Bézier 曲線)。依序連接控制點即為控制多邊形。套件中每條曲線的參數範圍都是 \([0, 1]\);超出範圍的參數會拋出 ParameterOutOfDomain。符號 \(d\) 一律表示維度,容許誤差寫作 \(\epsilon\)。
數學與證明
各章先回顧所用的標準定義並附出處,再以編號的引理、命題、定理與推論陳述演算法所依據的性質:Bernstein 基底的保證、de Casteljau 演算法為何能計算並分割曲線、Hermite 插值最多偏離多少、匯出器因四捨五入損失多少精度。證明集中在證明,只想了解 API 時可略過。屬於本套件而不見於文獻的約定,稱為套件約定。標準參考書為 Farin (2002) 與 Prautzsch (2002);Bernstein 基底另見 Farouki (2012)。
閱讀指引
| 主題 | 內容 | 章節 |
|---|---|---|
| 點、向量、參數、例外 | 幾何數值物件 | Bernstein 基底、曲線、求值 |
| Bézier 曲線 | 導數、反轉、分割 | 導數、反轉與分割 |
| 三次線段與分段路徑 | 三次線段與路徑 | 建構與 Hermite 插值 |
| 建構與 Hermite 插值 | 擬合函數與折線 | 擬合 |
| 描繪等值線 | 等值線 | 取樣、JSON、SVG、TikZ、Matplotlib |
| 取樣與匯出 | 命令列 | 命令列介面 |
初次使用時,先讀快速開始與Bézier 曲線。本手冊的圖本身就是 bezierkit 的輸出:每條曲線都由取樣與匯出的 TikZ 匯出器寫出,再以 LaTeX 編譯。