跳轉到

簡介

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 = \sqrt{x_1^2 + \ldots + x_d^2}, \]

\(\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\),定義為映射

\[ B(t) = \sum_{i=0}^n b_{i,n}(t) P_i, \quad t \in [0, 1], \]

其中

\[ b_{i,n}(t) = \binom{n}{i} t^i (1-t)^{n-i} \]

為 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 編譯。

留言