B-Spline样条曲线及其性质





B-Spline 学习笔记(MOOC)


[1] B样条产生的背景

1. Bezier曲线的不足

Bezier曲线曲面有很多优点,可以用鼠标拖动控制顶点,改变曲线的形状,非常直观,给设计人员很大的自由度。但Bezier曲线有几点不足

  • 一旦确定了控制点数(n+1个),则曲线阶次确定(n次),当顶点数过多时,Bezier的阶次很高。且高次Bezier的导数会有很多零点,造成曲线出现过多极值点,表现为曲线的震荡
  • 为了克服这一现象,可以采用分段Bezier曲线拼接的方式。但Bezier曲线或曲面的拼接又比较复杂。因为拼接过程需要满足拼接点的0阶、1阶甚至更高阶连续性,条件比较复杂苛刻。
  • Bezier曲线或曲面无法进行局部修改,因为伯恩斯坦基函数的在整个区间都有值,即整个曲线的区间都是伯恩斯坦基函数的支撑区间

2. 克服不足的方法

考虑下图所示的混合函数:
在这里插入图片描述
每个函数只在区间[0,1]上的一部分有支撑,这样的混合函数作为基函数的话,就不会像伯恩斯坦基函数一样出现“牵一发而动全身”的情形。

1972年,Gordon、Rinsenfeld等人提出B样条方法,在保留Bezier方法全部优点的同时,克服Bezier方法的弱点即 样条(Spline)——分段连续多项式

整条曲线用一个完整的表达形式,但内在的量是一段段的,比如用一堆的三次曲线拼接,两两间满足2次几何连续。

这样既克服波动现象,又能使曲线是低次的,即有统一的表达又有统一的算法。


3. 如何进行分段?

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

当有5个点的时候,采用三次样条的方式构造曲线,那么可以构造出4段曲线,每一段曲线是三次多项式,且段与段之间满足二次连续。而5个控制点用Bezier构造曲线时,多项式曲线为四次。



[2] B样条的递推定义

1. B-Spline与Bezier Curve

B-Spline的数学表达式为(索引i表示控制点,索引k表示阶数,阶数=次数+1):
在这里插入图片描述
形式上和Bezier曲线相似:
在这里插入图片描述
相同点: 都有n+1个控制点,Pi为控制多边形矢量。

不同点:

  • B样条的基函数为 B i , k B_{i,k} Bi,k ,而Bezier曲线的基函数为 B i , n B_{i,n} Bi,n
    这说明对于Bezier曲线来说,其基函数的次数和控制点的个数是必定联系起来的,而对于B样条来说,其基函数与控制点的个数没有关系。
  • Bezier的参数 u u u取值范围为[0,1],而B样条的参数取值范围是[ u k − 1 , u n + 1 u_{k-1},u_{n+1} uk1,un+1],这个原因后边会介绍到。

2. B样条基函数

  • 阶数

    B i , k B_{i,k} Bi,k称为k阶(k-1次)B样条基函数,k刻画次数,可以是2~控制点个数n+1之间的任意整数。

    当B样条基函数为二阶,则其为1次多项式。

    这里需要注意,Bezier的阶数和次数是一样的(都是控制点数-1),而对于B样条来说,阶数是次数加一。

  • 节点向量

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

在这里插入图片描述

B样条基函数实际上就是一个多项式,是一个比较复杂的、有特点的多项式,如何得到这个B样条基函数?B样条定义方式多种多样,但公认的最容易理解的是de Boor-Cox递推定义。


3. de Boor-Cox递推公式

只要是k阶(k-1次)的B样条基函数,构造一种递推的公式,由0次构造1次,由1次构造2,以此类推。递推定义如下:
在这里插入图片描述
可以看出,k阶B样条基函数是由两个k-1阶的基函数线性组合而成的。为了防止分子分母都为0的情况出现,约定0/0=0


  • 基函数支撑区间

    观察分子,可以发现,若确定第i个k阶B样条基函数 B i , k ( u ) B_{i,k}(u) Bi,k(u),需要用到 u i , u i + 1 , . . . u i + k u_i, u_{i+1}, ... u_{i+k} ui,ui+1,...ui+k共k+1个节点,称区间[ u i , u i + k u_i, u_{i+k} ui,ui+k]为 B i , k ( u ) B_{i,k}(u) Bi,k(u)的支撑区间。

  • 一阶B样条基函数

    “0次多项式”
    在这里插入图片描述

  • 二阶B样条基函数

    可以由两个一阶B样条曲线递推得到,是它们的凸组合。
    在这里插入图片描述

  • 三阶B样条基函数
    在这里插入图片描述

根据样条曲线的定义式,每一个控制点 p i p_i pi都有一个基函数 B i , k ( u ) B_{i,k}(u) Bi,k(u)与之匹配,其曲线次数为k-1次。问题是这条曲线的定义区间是什么?

Bezier的定义区间是[0,1],那么B样条的定义区间呢?

对n+1个顶点,k阶的B样条曲线需要多少个节点向量与之匹配?



[3] B样条的定义区间与节点向量

1. k阶B样条对应的节点向量数

  • k阶基函数涉及到的区间
    根据de Boor-Cox递推公式,可知k阶基函数涉及到的区间,为[ u i , u i + k u_i, u_{i+k} ui,ui+k],如果把相邻节点之间的区间认为是一个小区间,那么k阶基函数涉及到k个小区间,k+1个节点。

  • n+1个k阶基函数涉及到的区间
    当给定n+1个控制点,用k阶B-Spline生成曲线,需要用到 B 0 , k ( u ) B_{0,k}(u) B0,k(u), B 1 , k ( u ) B_{1,k}(u) B1,k(u), … , B n , k ( u ) B_{n,k}(u) Bn,k(u)个k阶基函数,那么这些基函数涉及到的区间为[ u 0 , u n + k u_0, u_{n+k} u0,un+k],共n+k+1个节点,n+k个小区间, 即节点向量为:
    在这里插入图片描述

2. B样条函数的定义区间

按照给出的定义,u定义在区间[ u k − 1 , u n + 1 u_{k-1}, u_{n+1} uk1,un+1]上,那么这个区间是怎么来的呢?

以k=4,n=4为例:
按照[3]-1的第二条所说,这里有5个控制点,需要用到5个4阶B样条函数,这五个基函数涉及到的区间为[ u 0 , u n + k u_0, u_{n+k} u0,un+k] = [ u 0 , u 8 u_0, u_{8} u0,u8],即节点向量为:
在这里插入图片描述
进一步地按照[3]-1的第二条来分析每个基函数所涉及的区间,可以得到:

B 0 , 4 ( u ) B_{0,4}(u) B0,4(u)涉及到的区间为[ u 0 , u 4 u_0, u_4 u0,u4]
B 1 , 4 ( u ) B_{1,4}(u) B1,4(u)涉及到的区间为[ u 1 , u 5 u_1, u_5 u1,u5]
B 2 , 4 ( u ) B_{2,4}(u) B2,4(u)涉及到的区间为[ u 2 , u 6 u_2, u_6 u2,u6]
B 3 , 4 ( u ) B_{3,4}(u) B3,4(u)涉及到的区间为[ u 3 , u 7 u_3, u_7 u3,u7]
B 4 , 4 ( u ) B_{4,4}(u) B4,4(u)涉及到的区间为[ u 4 , u 8 u_4, u_8 u4,u8]
在这里插入图片描述

这里提到,区间要合法,区间必须要有足够的基函数与顶点配对。
这句话的含义个人理解为,如果某个区间为基函数的支撑区间,即该区间里基函数有值,那么对应的 P i B n , k ( u ) P_iB_{n,k}(u) PiBn,k(u)就会生效(不为零),即基函数匹配的顶点可以产生对曲线的控制作用,那按照我们的理解,这里的4阶样条曲线,曲线是3次的,类比Bezier Curve,需要4个控制点,那么就需要区间上有4个控制点生效,也就是有4个基函数的支撑区间经过该区间,上面的图就应该找到[ u 3 , u 5 u_3, u_5 u3,u5]这个区间作为B-Spline的定义区间,相当于上述曲线被分为两段, u 3 u 4 u_3u_4 u3u4 u 4 u 5 u_4u_5 u4u5 P 0 , P 1 , P 2 , P 3 P_0, P_1, P_2, P_3 P0,P1,P2,P3控制第一段, P 1 , P 2 , P 3 , P 4 P_1, P_2, P_3, P_4 P1,P2,P3,P4控制第二段。两段之间有三个顶点是一样的,这样就保证了两段拼接的效果非常好。

推广一下,就可以得到k阶样条曲线的定义区间为[ u k − 1 , u n + 1 u_{k-1}, u_{n+1} uk1,un+1]

* 对B-Spline,阶数 = (次数+1) = 次数 = 每段生效的控制点数量

可见B样条基函数严重依赖于节点向量的分布。


3. B样条曲线完整定义

在这里插入图片描述



[4] B样条基函数的主要性质

1. 局部支撑性

Bezier基函数整个区间非0,即整个区间都是各基函数的支撑区间;而B-Spline的基函数的支撑区间为区间的一部分。


2. 权性

在定义空间内,各基函数值之和时刻为1
在这里插入图片描述

3. 连续性

r重节点处基函数的连续阶不低于k-1-r,实际上就是当节点不重合时(1重节点),k阶(k-1次)B-Spline可以达到k-2阶连续。

4. 分段参数多项式

B i , k ( u ) B_{i,k}(u) Bi,k(u)在每个长度非零的区间[ u i , u i + 1 u_{i}, u_{i+1} ui,ui+1)上都是次数不高于k-1的多项式,它在整个参数轴上是分段多项式。



[4] B样条函数的主要性质

1. 局部性

k阶B样条曲线上的一点至多与k个控制顶点有关,与其他控制顶点无关。移动曲线一个控制顶点,至多影响定义在区间上那部分曲线的形状,对曲线的其它部分不发生影响。

2. 变差缩减性

同Bezier曲线,类似凸包性,不赘述。

3. 几何不变性

同Bezier曲线,不赘述。

4. 凸包性

同Bezier曲线,曲线落在控制顶点构成的凸包中。
在这里插入图片描述



[5] B样条曲线类型

1. 均匀B样条曲线 Uniform B-Spline Curve

即节点沿参数轴均匀等距分布,e.g.{0,1,2,3,4,5,6}

均匀B样条的基函数呈周期性,即给定n和k,所有的基函数有相同形状,每个后续基函数仅为前面基函数在新位置上的重复。

2. 准均匀B样条曲线 Quasi-Uniform B-Spline Curve

两端节点具有重复度k,e.g.{0,0,0,1,2,3,4,5,5,5}
在这里插入图片描述
准均匀B样条曲线保留了Bezier曲线端点的几何性质,即过首末控制点,这是均匀B样条曲线做不到的。


3. 分段Bezier曲线 Piecewise Bezier Curve

两端节点具有重复度k,所有内节点重复度为k-1,这样的节点矢量定义了分段的Bernstein基函数。
在这里插入图片描述
这说明Bezier曲线是B-Spline的一个特例,B样条曲线也可以用分段的Bezier曲线拼接而成,这样的好处是各曲线段具有了相对的独立性。(各段控制点不交叠?)

B样条曲线计算机图形学中一种重要的曲线表示方法,它具有良好的数学性质样条插值曲线的优点。在MATLAB中,B样条曲线的绘制可以采用三种方法: 第一种方法通过绘制控制点来调整曲线,具体步骤如下: 1. 首先确定曲线的阶次,选择合适的控制点。 2. 在MATLAB命令窗口输入bsplin()函数,定义B样条曲线的节点向量和基函数矩阵。 3. 创建一组控制点矩阵,使用plot()函数绘制控制点。 4. 输入spmak()函数,将控制点矩阵和基函数矩阵作为参数,创建一个B样条曲线。 5. 使用fnplt()函数绘制B样条曲线。 第二种方法使用B样条曲线拟合已知的数据点,具体步骤如下: 1. 使用MATLAB表示数据点,可以用矩阵或向量的形式。 2. 通过splrep()函数将数据点拟合成B样条曲线,得到节点和系数。 3. 使用splev()函数生成插值点,即插值后的曲线。 4. 使用fnplt()函数绘制B样条曲线。 第三种方法使用B样条曲线插值已知的数据点,具体步骤如下: 1. 通过interp1()函数对数据点进行插值处理,得到插值后的数据点矩阵。 2. 通过splrep()函数将插值后的数据点拟合成B样条曲线,得到节点和系数。 3. 使用splev()函数生成插值点,即插值后的曲线。 4. 使用fnplt()函数绘制B样条曲线。 总之,不管是通过控制点还是通过插值处理,B样条曲线的绘制与调整都十分灵活,可以满足不同场景下的需求和要求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值