跳转至

Lec05 Bezier曲线 B样条曲线

建模的两种形式

\[ f(t) = at^2 + bt + c \]

重建(Reconstruction)

  • 逆向工程:形状已有,将其“猜”出
  • 采样→拟合:需要函数空间足够丰富(表达能力够)
  • 代数观点\(\{a,b,c\}\)作为基函数的组合权系数

设计(Design)

  • 自由设计:凭空产生,或从一个简单形状编辑得到
  • 交互式编辑:几何直观性要好
  • 几何观点:基函数\(\{t^2,t,1\}\)作为控制点的组合权系数

Bernstein基函数

  • n次(n + 1阶)Bernstein基函数:\(B=\{B_{0}^{(n)},B_{1}^{(n)},...,B_{n}^{(n)}\}\)
\[ B_{i}^{n}(t) = \tbinom{n}{i} t^i (1-t)^{n-i} = B_{i-th \space basis \space function}^{(degree)} \\ \space \\ \tbinom{n}{i} = \begin{cases} \frac{n!}{(n-i)!i!} \ for \ 0 \leq i \leq n \\ 0 \qquad otherwise \end{cases} \]
  • 对称性:\(B_{i}^n(t) = B_{n-i}^n(1-t)\)
  • \(B_{i}^{(n)}(t)\)\(t = \frac{i}{n}\) 达到最大值

用Bernstein基函数所表达的曲线具有非常好的几何意义

性质

性质1. 正权性

正性(非负性) + 权性

  • \(B_{i}^{(n)}(t) \geq 0,\ \forall t \in [0,1]\)
  • \(\sum\nolimits^{n}_{i=1} B_{i}^{(n)}(t) = 1, \ \forall t \in [0,1]\)

可由该性质得到Bezier曲线的 凸包性

(用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点)

性质2. 基性

  • \(B={B_0^{(n)}, B_1^{(n)},...,B_n^{(n)}}\)是次数不高于n的多项式集合(空间)的一组基
  • 与幂基可以相互线性表达:
\[ \left[\begin{matrix} B_{0,n}(t) & B_{1,n}(t) & ... & B_{n,n}(t) \end{matrix}\right] = \left[\begin{matrix} 1 & t & t^2 & \dots & t^n \end{matrix}\right] \left[\begin{matrix} b_{0,0} & 0 & 0 & \dots & 0 \\ b_{1,0} & b_{1,1} & 0 & \dots & 0 \\ b_{2,0} & b_{2,1} & b_{2,2} & \dots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ b_{n,0} & b_{n,1} & b_{n,2} & ... & b_{n,n} \end{matrix}\right] \]

性质3. 递推公式

  • 基函数的递推公式 $$ B_i^{n}(t) = (1-t)B_i^{(n-1)}(t) + tB_{i-1}^{(n-1)}(t) \ with B_0^{0}(t) = 1, B_i^{n}(t) = 0 for i \notin {0 \dots n} $$

  • \(\tbinom{n-1}{i} + \tbinom{n-1}{i-1} = \tbinom{n}{i}\)可推导得到

  • 高阶的基函数由2个低阶的基函数“升阶”得到,利于保持一些良好性质

性质4. 端点插值性

  • \(B_0^{n}(0) = 1, B_1^{n}(0) = \dots = B_n^{n}(0) = 0\)
  • \(B_0^{n}(1) = \dots = B_{n-1}^{n}(1) = 0, B_n^{n}(1) = 1\)

可由该性质得出Bezier曲线经过首末两个控制顶点 \(\boldsymbol{p_0}, \boldsymbol{p_1}\)

性质5. 导数

  • \(\frac{d}{dt}B_i^{(n)}(t) = n[B_{i-1}^{(n-1)}(t) - B_i^{(n-1)}(t)]\)
  • \(\frac{d^2}{dt^2}B_i^{(n)}(t) = n(n-1)[B_{i-2}^{(n-2)}(t) - 2B_{i-1}^{(n-2)}(t) + B_i^{(n-2)}(t)]\)

性质6. 升阶

\[ (1-t)B_i^{n}(t) = (1 - \frac{i}{n+1})B_i^{n+1}(t) \\ \space \\ tB_i^{n}(t) = \frac{i+1}{n+1} B_i^{n+1}(t) \]
  • Bezier曲线的升阶由上述公式推出 $$ \boldsymbol{f}(t) = \sum_{i=0}^{n+1} B_i^{n+1}(t)[\frac{n+1-i}{n+1}\boldsymbol{P_i} + \frac{i}{n+1}\boldsymbol{P_{i-1}}] $$

Bezier曲线

  • n次Bezier曲线:\(n+1\) 个控制顶点
\[ x(t) = \sum_{i=0}^n B_{i}^n (t) \cdot b_i \]

由控制顶点\(b_i\)来控制多边形

Bezier曲线的性质来源于Bernstein基函数的性质(曲线是控制顶点的线性组合构成的,基函数提供了组合系数)

  • Bezier曲线端点的切线方向与边相同

De Casteljau algorithm

算法描述

  • 输入:点 \(\boldsymbol{b_0,b_1,\dots,b_n} \in \mathbb{R}^{3}\)
  • 输出:曲线 \(\boldsymbol{x}(t), \ t \in [0, 1]\)
\[ \boldsymbol{b}_i^{0}(t) = \boldsymbol{b}_i, \quad i = 0, \dots, n \\ \boldsymbol{b}_i^{r}(t) = (1-t)\boldsymbol{b}_i^{r-1}(t) + t\boldsymbol{b}^{r-1}_{i+1}(t) \\ r = 1, \dots, n \qquad i = 0, \dots, n - r \]

算法伪代码如下:

  • 计算Bezier曲线 \(\boldsymbol{x}(t)\) 上参数为 \(t\) 的点
  • 良好的几何意义:该点将曲线一分两条子Bezier曲线,其控制顶点是中间生成的点
  • 可用于Bezier曲线的离散及求根等许多应用