Bezier curve & B-spline

1 Bezier曲线

1.1背景及意义

  参数n次曲线

p(t)=i=0naifi,n(t)0t1

其中,系数矢量ai(i=0,1,2,,n)顺序首尾相接,a0an连成的折线称为控制多边形(Bezier多边形)。

  Bezier基函数

fi,n={ 1,i=0(t)i(i1)idi1di1[(1t)n11t]

可以化成伯恩斯坦函数

Bi,n=Cniti(1t)n1=n!i!(ni)!ti(1t)n1(i=0,1,2,,n)


1.2 定义

  针对Bezier曲线,给定空间n+1个点的位置矢量Pi(i=0,1,2,,n),则Bezier曲线段的参数方程表示如下:

p(t)=i=0nPiBi,n(t)t[0,1]

其中,pi(xi,yi,zi),i=0,1,2,,n是控制多边形的n+1个顶点,即构成该曲线的特征多边形;Bi,n(t)Bernstein基函数,有如下形式:

Bi,n=n!i!(ni)!ti(1t)ni=Cniti(1t)ni(i=0,1,2,,n)

二项式定理(牛顿二项式定理),给出两数之和的整数次幂的恒等式,i=0nBi,n(t)恰好为二项式[t+(1t)]n的展开式 (注:当i=0,t=0时,ti=1,i!=1,即:00=1,0!=1

  Pi代表空间中的很多点,把t代入可以得到平面或空间内的一个点,当t从0变化到1时,就可以得到空间内的一个图形,即Bezier曲线。


一次Bezier曲线

p(t)=i=0nPiBi,n(t)t[0,1]

n=1时,有2个控制点p0p1,Bezier多项式是一次多项式:

p(t)=i=01PiBi,n(t)=P0B0,1(t)+P1B1,1(t)

其中,

B0,1(t)=n!i!(ni)!ti(1t)ni=1!0!(10)!t0(1t)10=(1t) B1,1(t)=n!i!(ni)!ti(1t)ni=1!1!(10)!t1(1t)11=t

所以

p(t)=i=0nPiBi,1(t)=P0B0,1(t)+P1B1,1(t)=(1t)P0+tP1

恰好为连接起点p0和终点p1直线段


二次Bezier曲线

p(t)=i=0nPiBi,n(t)t[0,1]

n=2时,有3个控制点p0p1p2,Bezier多项式是二次多项式:

p(t)=i=02PiBi,2(t)=P0B0,2(t)+P1B1,2(t)+P2B2,2(t)

其中,

B0,2(t)=n!i!(ni)!ti(1t)ni=2!0!(20)!t0(1t)20=(1t)2 B1,2(t)=n!i!(ni)!ti(1t)ni=2!1!(21)!t1(1t)21=2t(it) B2,2(t)=n!i!(ni)!ti(1t)ni=2!1!(22)!t2(1t)22=t2

所以

p(t)=i=02PiBi,2(t)=(1t)2P0+2t(1t)P1+t2P2=(P22P1+P0)t2+2(P1P0)t+P0

抛物线,其矩阵形式为:

p(t)=[t2t1][121220100][P0P1P2]

三次Bezier曲线

p(t)=i=0nPiBi,n(t)t[0,1]

n=3时,有4个控制点p0p1p2p3,Bezier多项式是三次多项式:

p(t)=i=03PiBi,3(t)=P0B0,3(t)+P1B1,3(t)+P2B2,3(t)+P3B3,3(t)

其中,

B0,3(t)=n!i!(ni)!ti(1t)ni=3!0!(30)!t0(1t)30=(1t)3 B1,3(t)=n!i!(ni)!ti(1t)ni=3!1!(31)!t1(1t)31=3t(it)2 B2,3(t)=n!i!(ni)!ti(1t)ni=3!1!(32)!t2(1t)32=3t2(it) B3,3(t)=n!i!(ni)!ti(1t)ni=3!1!(33)!t3(1t)33=t3

所以

p(t)=i=03PiBi,3(t)=(1t)3P0+3t(1t)2P1+3t2(1t)P1+t3P3=(P33P2+3P1P+0)t3+3(P22P1+P0)t2+3(P1P0)t+P0

其中,B0,3(t)B1,3(t)B2,3(t)B3,3(t)为三次Bezier曲线的基函数,均为三次曲线,任何三次Bezier曲线都是这四条曲线的线性组合。

Bezier曲线不能对曲线形状进行局部控制,如果改变任一控制点位置,整个曲线都会受到影响。

  三次Bezier曲线的矩阵形式为:

p(t)=[t3t2t1][1331363033001000][P0P1P2P3]t[0,1]=TMbeGbe

其中,Mbe是三次Bezier曲线系数矩阵(常数),Gbe是4个控制点位置矢量。


1.3 性质

1.3.1 Bernstein基函数的性质

Bi,n=Cniti(1t)n1=n!i!(ni)!ti(1t)n1(i=0,1,2,,n)

1.正性(非负性)

Bi,n(t)={=0t=0,1>0t(0,1),i=1,2,,n1

2.权性
  基函数有n+1项,其和正好为1,即 i=0nBi,n(t)1t(0,1)

3.端点性质

Bi,n(0)={1(i=0)0otherwise Bi,n(1)={1(i=n)0otherwise

4.对称性

Bi,n(t)=Bni,n(1t)

将n次Bezier曲线控制多边形顶点位置不变、次序颠倒,则曲线保持不变,但是走向相反。

5.递推性

Bi,n(t)=(1t)Bi,n1(t)+tBi1,n1(t)(i=0,1,,n)

即n次Bernstein基函数可由两个n-1次Bernstein基函数线性组合而成。

6.导函数

Bi,n(t)=n[Bi1,n1(t)Bi,n1(t)](i=0,1,,n)

7.最大值

  在t=in处取到最大值。

8.积分

01Bi,n(t)=1n+1

9.降阶公式

Bi,n(u)=(1u)Bi,n1(u)+uBi1,n1(t)

即一个n次Bernstein基函数能表示成两个n-1次基函数的线性和。

1.3.2 Bezier曲线的性质

1.端点性质
  顶点p0pn分别位于实际曲线段的起点和终点上,把t=0和1代入可以得到p0pn

2.一阶导数

p(t)=ni=1n(pipi1)Bi1,n1(t)

t=0时,p(0)=n(p1p0)
t=1时,p(1)=n(pnpn1)

3.几何不变性

4.变差缩减性
  若Bezier曲线的特征多边形是一个平面图形, 则平面内任意直线与p(t)的交点个数不多于该直线与其特征多边形的交点个数。此性质表明Bezier曲线比特征多边形的折线更光顺。


1.4 Bezier曲线生成算法

1.4.1 根据定义

p(t)=i=0nPiBi,n(t)t[0,1] Bi,n=n!i!(ni)!ti(1t)ni=Cniti(1t)ni(i=0,1,2,,n)

1.给出Cni的递归计算式:

Cni=n!i!(ni)!=ni+1iCn1ni

2.将p(t)=i=0nPiBi,n(t)表示成分量坐标形式:

{x(t)=i=0nxiBi,n(t)y(t)=i=0nyiBi,n(t)t[0,1]z(t)=i=0nziBi,n(t)

1.4.2 递推算法(de Casteljau)

由n+1个控制点Pi(i=0,1,,n)定义的n次Bezier曲线P0n可被定义为分别由前后n个控制点定义的两条n-1次Bezier曲线P0n1P1n1的线性组合:

P0n=(1t)P0n1+tP1n1t[0,1]

由此得到Bezier曲线的递推计算公式

Pik={Pik=0(1t)Pik1+tPi+ik1k=1,2,,n,i=0,1,,nk

利用递推公式,在给定参数下,求Bezier曲线上一点P(t)非常有效


1.5 Bezier曲线的拼接及升降阶

1.5.1 Bezier曲线的拼接

p(t)=i=0nPiBi,n(t)t[0,1] Bi,n=Cniti(1t)ni(i=0,1,2,,n)

  增加特征多边形的顶点数会引起Bezier曲线次数的提高,高次多项式会导致计算困难,所以需要采用分段设计,将各段曲线连接起来,并在接合处保持一定的连续条件。

  给定两条Bezier曲线P(t)Q(t),相应控制点为Pi(i=0,1,,n)Qi(i=0,1,,m)

(1)G0连续,则:Pn=Q0

(2)G0连续,只要保证Pn1Pn=Q0,Q1三点共线即可(Bezier曲线的起点(终点)处的切线方向和特征多边形的第一条边(最后一条边)的走向一致)

1.5.2 Bezier曲线的升阶与降阶

升阶:保证曲线的形状和方向保持不变,但是增加定义它的顶点个数,即提高该Bezier曲线的次数。

  设给定原始控制顶点p0,p1,pn,定义一条n次Bezier曲线,增加一个顶点后,仍定义同一条曲线的新控制顶点为p0,p1,pn,则有

i=0nCniPiti(1t)ni=i=0n+1Cn+1iPiti(1t)ni PiCn+1i=PiCni+Pn1Cnj1

化简得: Pi=in+1Pi1+(1in+1)Pi(i=0,1,,n+1)

升阶后的多边形更加靠近曲线,如果一直升阶下去,控制多边形收敛于这条曲线。

降阶:升阶的逆过程

  假定Pi是由Pi升阶得到,则由升阶公式有:

Pi=ninPi+inPi1

由该方程可以导出两个递推公式:

Pi=nPiiPi1ni(i=0,1,,n1) Pi1=nPi(ni)Pii(i=0=n,n1,,1)

可利用以上两个式子进行降阶,但不精确。


2 B样条曲线

2.1背景

  Bezier曲线存在不足:
(1)一旦确定了特征多边形的顶点数,也就确定了曲线的阶次;
(2)Bezier曲线或曲面的拼接比较复杂
(3)Bezier曲线或曲面不能作局部修改

  样条(spline):分段连续多项式

如何分段?
  现有n+1个点,每两点之间构造一条多项式,n+1个点有n个小区间,
每个小区间构造一条三次多项式,变成了n段的三次多项式拼接在一起,段与段之间满足两次连续,这就是三次样条


2.2 B样条的递推定义和性质

  B样条曲线的数学表达式为:

P(u)=i=0nPiBi,k(u)u[uk1,un+1]

其中,Pi(i=0,1,,n)是控制多边形的顶点,Bi,k(u)称为k阶(k-1次)B样条基函数,k可以是2到控制点个数n+1之间的任意整数。

  对于Bezier曲线来说,阶次和次数是一样的;但对于B样条,阶数是次数加1。

  B样条基函数是一个称为节点矢量的非递减的参数u的序列所决定的k阶分段多项式,这个序列称为节点向量

de Boor-Cox递推定义

约定:0/0=0

Bi,1(u)={1ui<ui+10Otherwise Bi,k(u)=uuiui+k1uiBi,k1(u)+ui+kuui+kui+1Bi+1,k1(u)

该递推公式表明:若确定第i个k阶B样条Bi,k(u),需要用到ui,ui+1,,ui+k共k+1个节点,称区间[ui,ui+k]Bi,k(u)的支撑区间。


2.3 B样条基函数定义区间及节点向量

2.3.1 k阶B样条对应节点向量数

Bi,1(u)={1ui<ui+10OtherwiseBi,k(u)=uuiui+k1uiBi,k1(u)+ui+kuui+kui+1Bi+1,k1(u)

对于Bi,k(k阶k-1次基函数)来说,涉及k个区间、k+1个节点。

2.3.2 B样条函数定义区间

P(u)=i=0nPiBi,k(u)u[uk1,un+1] "阶数+顶点"=节点向量的个数

区间要合法,区间里必须要有足够的基函数与顶点匹配,B样条基函数严重依赖于节点向量的分布。


2.4 B样条曲线定义

P(u)=i=0nPiBi,k(u)u[uk1,un+1] Bi,1(u)={1ui<ui+10OtherwiseBi,k(u)=uuiui+k1uiBi,k1(u)+ui+kuui+kui+1Bi+1,k1(u)

其中,Ui是节点值,U=(u0,u1,,un+k)构成了k阶(k-1)次B样条函数的节点矢量,B样条曲线对应的节点向量区间: u[uk1,un+1]


2.5 B样条基函数的主要性质

1.局部支撑性

Bi,k(u){0ui<ui+k=0otherwise

对于每个区间(ui,ui+k),至多只有k个基函数在该区间内非零。

2.权性

i=0nBi,k(u)1u[uk1,un+1]

3.连续性

  Bik(u)在r重节点处的连续阶不低于k-1-r

4.分段参数多项式

  Bi,k(u)在每个长度非零的区间[ui,ui+1)上都是次数不高于k-1的多项式。


2.6 B样条函数的主要性质

1.局部性

  k阶B样条曲线上的一点至多与k个控制顶点相关,与其它控制顶点均无关。移动曲线的第i个控制点Pi,至多影响到定义在区间上的那部分曲线的形状,对其余部分不产生影响。

2.变差缩减性

3.几何不变性

4.凸包性

  B样条曲线落在Pi构成的凸包之中,其凸包区域小于或等于同一组控制顶点定义的Bezier曲线凸包区域。


2.7 B样条曲线类型的划分

1.均匀B样条曲线(uniform B-spline curve)

  当节点沿参数轴均匀等距分布,即ui+1ui=常数>0时,表示均匀B样条函数。
  均匀B样条的基函数呈周期性。即给定n和k,所有的基函数形状相同,每个后续基函数时前面基函数在新位置上的重复:

Bi,k(u)=Bi+1,k(u+Δu)=Bi+2,k(u+2Δu)

其中,Δu是相邻节点值的间距。

2.准均匀B样条曲线(Quasi-uniform B-spline curve)

  与均匀B样条曲线的差别在于两端节点具有重复度k,这样的节点矢量定义了准均匀的B样条基,解决了均匀B样条曲线没有保留Bezier曲线端点几何性质的问题。

3.分段Bezier曲线(Piecewise Bezier Curve)

  节点矢量中两端节点具有重复度k,所有内节点重复度为k-1,这样的节点矢量定义了分段的Bernstein基。
  用分段Bezier曲线表示B样条曲线后,各曲线段就具有了相对独立性,且可以采用Bezier曲线的简单有效算法,缺点是增加了定义曲线的数据、控制定点数及节点数。

4.非均匀B样条曲线(non-uniform B-spline curve)

  当节点沿参数轴的分布不等距,即ui+1ui常数时,表示非均匀B样条函数。