图形学笔记(五)——曲线

时间:2024-04-04 09:03:54
  • 参数化:为了方便表示和计算,常使用参数方程的形式表示曲线,即P(u)=(x(u),y(u),z(u))P(u)=(x(u),y(u),z(u))表示曲线上某点的位置矢量,u[u1,u2]u\in [u_1,u_2]表示参数区间。
  • 奇点:如果曲线中存在闭环,则可能出现多个参数对应同一点的情况。
  • 方向:曲线的方向即参数增加的方向。曲线上一点的方向即该点切向矢量的方向,且和曲线方向一致。
  • 样条曲线:样条曲线由给定的若干数据点,由低次多项式曲线连接而成。在边界点处满足特定的连续条件。
  • 参数样条:使用参数方程表示的样条曲线,如三次样条曲线横坐标:x(u)=axu3+bxu2+cxu+dxx(u)=a_xu^3+b_xu^2+c_xu+d_x
    • 参数样条具有矩阵表示法:X(u)=UCX(u)=UC,其中UU为参数uu幂次的行矩阵[u3,u2,u,1][u^3,u^2,u,1]CC为系数列矩阵[ax,bx,cx,dx]T[a_x,b_x,c_x,d_x]^T
    • 更具一般性的,n次参数样条可以表示为X(u)=UMsplineMgeomX(u)=UM_{spline}M_{geom},其中MsplineM_{spline}为几何约束条件的n+1阶列矩阵,MgeomM_{geom}为n+1阶方阵,将几何约束转化为参数的线性函数。
  • 样条连续性:样条连续性分为参数连续性和几何连续性:
    • n阶参数连续性(Cn)(C^n):相邻曲线段在公共点处具有相同的n阶以下导数,其中0阶导数定义为坐标值。
    • 几何连续性(Gn)(G^n):相邻曲线段在公共点处具有成比例的n阶以下导数。
  • 曲线生成
    • 插值:使曲线曲面按要求通过已知的点,且具有一定的光滑流畅程度。
    • 逼近:使曲线曲面不一定通过给定的点,但充分靠近各点(每个点都有某种看不见的吸引力)。
    • 设计:已知点太少,需要根据实际情况增加一些点,然后用插值或逼近生成曲线曲面。

插值

在实际应用中一般采用三次插值,即对于n段曲线共有n+1个数据点,使用一组三次多项式作为参数方程,即x(u)=axu3+bxu2+cxu+dx(u)=a_xu^3+b_xu^2+c_xu+d,每段曲线需要四个系数定义,则共需要4n个系数规定完整曲线。

自然三次插值样条

自然三次样条具有C2C^2连续性(2n+2(n-1)=4n-2个参数),对于曲线两端点,其二阶导数为0(两个参数)。

  • 也可以为两端点增加两个“隐含”控制点使得两端点满足C2C^2连续性。

自然曲线一个控制点的改变会影响整个曲线。

Hermite插值

埃尔米特插值的输入除了n+1个控制点外还有在没一点的导数值。即每段曲线要满足两个端点的坐标和导数两对条件。

不过由于在计算机中很难直接给出曲线控制点导数的估计值,因此使用两种改良方法:

  • Cardinal样条:每一点的导数由两个相邻点坐标计算,即Pk=(1t)(PK+1Pk1)/2P_k'=(1-t)(P_{K+1}-P_{k-1})/2,其中t为决定曲线尖锐程度的张量参数。
  • Kocanek-Bartels样条:对Cardinal样条的拓展,Pk=(1t)/2[(1+b)(1c)(pkpk1)+(1b)(1+c)(pk1pk)]P_k'=(1-t)/2[(1+b)(1-c)(p_k-p_{k-1})+(1-b)(1+c)(p_{k-1}-p_k)],其中b为调整端点处偏向的偏离参量,c为控制导数连续性的参数。

Bézier曲线

Bernstein基函数

定义Bernstein基函数多项式为BEZi,n(u)=C(n,i)ui(1u)niBEZ_{i,n}(u)=C(n,i)u^i(1-u)^{n-i},其中C为组合数,等价于n次独立重复实验的成功次数为i时的概率(成功概率为u)Pr[i,n]Pr[i,n](每次实验结果为1时成功)。

  • 降阶公式:BEZi,n(u)=(1u)BEZi,n1(u)+uBEZi1,n1(u)BEZ_{i,n}(u)=(1-u)BEZ_{i,n-1}(u)+uBEZ_{i-1,n-1}(u),可以看作Pr[n1=0]Pr[i,n1]+Pr[n1=1]Pr[i1,n1]Pr[n_1=0]Pr[i,n-1]+Pr[n_1=1]Pr[i-1,n-1],即单独讨论第一次的成功情况。
  • 升阶公式:同理可看作n+1次实验第一次即失败的条件概率。
  • 导数:BEZi,n=n[BEZi1,n1(u)BEZi,n1(u)]BEZ_{i,n}''=n[BEZ_{i-1,n-1}(u)-BEZ_{i,n-1}(u)],直接求导即可。
  • 最值:u=i/nu=i/n时取得最大值。
  • 积分uBEZ(u)du=1n+1\int\limits_{u} BEZ(u)du=\frac{1}{n+1}
  • 线性无关性:{BEZi,n(u)}i,i{0,1,2,...,n}}\{BEZ_{i,n}(u)\}_i, i\in\{0,1,2,...,n\}\}为n次多项式空间的一组正交基。

贝塞尔曲线生成

n次贝塞尔曲线是对n+1个控制点的逼近曲线,由Bernstein函数生成:P(u)=kPkBEZk,n(u)P(u)=\sum\limits_{k}P_kBEZ_{k,n}(u),其中PkP_k表示第k个控制点,u[0,1]u\in[0,1]

利用降阶公式可以递归的计算出曲线上的点。

​ n次贝塞尔曲线上的点可以理解为n+1个控制点的加权和,权重即为BEZ函数。

贝塞尔曲线具有如下特性:

  • 端点位置:贝塞尔的起点和终点为第一个和最后一个控制点。
  • 端点切矢量:贝塞尔曲线的起点和终点切线方向为控制多边形第一条和最后一条边的方向。
  • 对称性:颠倒控制点次序不会影响曲线生成,这是由BEZ函数对称性决定的。
  • 仿射不变性:仿射变换前后曲线表示形式不变(因为实际是控制多边形进行了仿射变换)。
  • 凸包性:贝塞尔曲线位于控制点的凸包内。
  • 直线再生性:控制点在同一直线上时,贝塞尔曲线可以完美还原直线。
  • 拟局部性:由于权重函数最值在i/ni/n处,并为钟形曲线,因此较远控制点的影响非常小,曲线具有拟局部性。

几何意义

贝塞尔曲线的集合意义可以看作是按参数u对控制多边形进行降维度最后获得一个点的过程:

图形学笔记(五)——曲线

优化算法

在生成贝塞尔曲线时常使用德卡斯特里奥(de Casteljau)算法(其实就是BEZ的递归算法):

{Pir=Pir=0(1u)Pir1+uPi+1r1o.w.\left\{P^r_i=\begin{array}{cc}P_i & r=0\\(1-u)P_i^{r-1}+uP_{i+1}^{r-1} & o.w. \end{array} \right .,其中PiP_i为第i个控制点。

贝塞尔曲线拼接

由于贝塞尔曲线实际上为n阶多项式曲线,因此其栈深度为n,当控制点较多时开销过大。因此可以通过多个低次贝塞尔曲线拼接成复杂的曲线。

  • C0C^0连续拼接:由于贝塞尔曲线过两端点,因此任意划分可以直接完成C0C^0拼接。
  • C1C^1连续拼接:如果要求拼接处一阶导数连续,可以利用贝塞尔曲线的端点切矢量特点,在划分后的后一个控制点集中加入新的控制点,即假设pip_i为两段的公共点,则为后一段增加p=2pipi1p'=2p_i-p_{i-1},使得pip_i为成中点。
  • C2C^2连续拼接:和C1C^1连续拼接思想类似,通过前一段最后三个控制点定位新的控制点P=Pn2+4(PnPn1)P'=P_{n-2}+4(P_n-P_{n-1}),使得拼接处二阶导数连续。

柔性优化

由于贝塞尔曲线受每一个控制点影响,因此当控制点较少时,每一控制点的变化对曲线整体的影响都较大。因此常通过升阶加点增加曲线“柔性”:

  • 贝塞尔曲线升阶:在原有的控制多边形边上加入新的控制点。由于控制多边形不发生变化,因此曲线形状不变。

B样条曲线

​ 贝塞尔曲线之所以具有整体性,是由于其权重Bernstein基函数的非零区间(支撑区间)为[0,1][0,1],因此无论在参数轴上那个位置的点都要受到所有控制点的影响。为了增加局部性,基本思想为限制权重函数的支撑区间,使得参数轴上的每一个点只受附近控制点的影响,即距离较远控制点的权重为0。

​ B样条是对贝塞尔曲线的一种一般化,当节点数和多项式次数相等时支撑区间为[0,1][0,1],B样条即退化为贝塞尔曲线。

B样条基函数

​ 对于k阶B样条,需要给定参数u轴上的一种分割:Un,k+1={uii=0,1,2,...,n+k+1}U_{n,k+1}=\{u_i|i=0,1,2,...,n+k+1\},其中u0=0,u1=1u_0=0, u_1=1。常称uu为节点,UU为节点向量。

​ 如果uj1<uj=uj+1=...=uj+r1<uj+ru_{j-1}<u_j=u_{j+1}=...=u_{j+r-1}<u_{j+r},即连续r个节点重合,则称每个节点为r重节点。

B样条曲线采用deBoox-Cox公式递归定义的基函数:
Bi,k+1(u)=uuiui+kuiBi,k(u)+ui+k+1uui+k+1ui+1Bi+1,k(u)           i=0,1,2,...,n B_{i,k+1}(u)=\frac{u-u_i}{u_{i+k}-u_i}B_{i,k}(u)+\frac{u_{i+k+1}-u}{u_{i+k+1}-u_{i+1}}B_{i+1,k}(u)\ \ \ \ \ \ \ \ \ \ \ i=0,1,2,...,n
特殊的,当u[ui,ui+1]u\in [u_i,u_{i+1}]时,Bi,1(u)=1B_{i,1}(u)=1,否则Bi,1=0B_{i,1}=0(这就是限制支撑区间的基础);当系数出现00\frac{0}{0}时规定值为0。

​ 易知k次B样条为k+1阶多项式。0次B样条为1次多项式,为常函数。

  • 局部性,可以证明Bi,k(u)B_{i,k}(u)只在区间(ui,ui+k+1)(u_i,u_{i+k+1})间取值为正,否则取值为0(对于参数i的递归树宽度每层加1,即{i}->{i,i+1}->{{i,i+1},{i+1,i+2}}…)。
  • 权性:B可以作为权函数,iBi,k+1(u)=1\sum\limits_{i}B_{i,k+1}(u)=1
  • 连续性:B在r重节点处至少保持CkrC^{k-r}连续。
  • 线性无关性:{Bi,k+1(u)i=0,1,...,n}\{B_{i,k+1}(u)|i=0,1,...,n\}为n维多项式空间的一组正交基。
  • 分段:每个长度非零的[ui,ui+1)[u_i,u_{i+1})参数区间都对应一段k次多项式(曲线)。

B样条曲线生成

对于给定的n+1个控制点{Pi}\{P_i\}和n+k+2维控制节点向量Un,k+1U_{n,k+1},k+1阶(k次)B样条曲线定义如下:
P(u)=iPiBi,k+1(u),u[uk,un+1] P(u)=\sum\limits_{i}P_iB_{i,k+1}(u),u\in[u_k,u_{n+1}]

  • (1)由局部性可知,对于u[ui,ui+k+1]u\notin [u_i,u_{i+k+1}]中的权值Bi,k(u)=0B_{i,k}(u)=0,因此对于某一分段j中的参数u[uj,uj+1]u\in[u_j,u_{j+1}],只有Bjk,k,...,Bj,kB_{j-k,k},...,B_{j,k}的全值非零,即只有Pjk,...,PjP_{j-k},...,P_{j}这k+1个控制点对此段样条有影响。
  • (2)如果反过来考虑,PjP_j的影响区间为uj,uj+k+1u_j,u_{j+k+1},即PjP_j点只对[uj,uj+1,[uj+1,uj+2),...,[uj+k,uj+k+1)[u_j,u_{j+1},[u_{j+1},u_{j+2}),...,[u_{j+k},u_{j+k+1})这k+1段样条产生影响。

参数有效范围

下列论述建立在没有重节点基础上

而由于样条需要满足k阶多项式,因此当矩阵正定时需要k+1个条件,因此只有受到k+1个控制点限制的参数区间才可以产生k次样条。根据(1)可知,满足条件的参数区间jk0j-k\geq 0,即jkj\geq k,这就是参数下界。

又由于当j>nj>n时,Pjk,...,PjP_{j-k},...,P_{j}中后半部分的控制点下标超过n(如PjP_j一定不存在),即不存在这样的控制点,因此同样无法构成k次样条曲线。这也是参数上界,即jnj\leq n,最后一个参数区间为[un,un+1)[u_n,u_{n+1})

综上,B样条曲线参数有效区间为[uk,un+1][u_k,u_{n+1}],共由n-k+1段k次曲线拼接而成。

重节点性质

  • 重节点重复度加一(从0开始),则样条中曲线数量减一(此段曲线长度为0),且在该处的连续性降一。
    • k次B样条在r重节点处的连续性我Ck1rC^{k-1-r}
    • 构造尖角:随着连续性的下降,最终r重节点会具有C0C^0连续性