【计算机图形学02】b-spline(b-样条曲线)

b样条曲线

1、背景介绍

前文介绍了构造曲线的一种方式bezier。但是,bezier曲线存在一定的弊端,使得它有很大的局限性。即它必须是全局的,如果不是全局的,则无法提供高次的连续性的保证。而高次的连续性保证是许多工业领域在设计曲线时的要求,比如:铁路轨道总是高次曲率连续的,否则行驶中的火车会经历剧烈的颠簸。

为了解决既满足全局的光滑曲线的要求,又能在局部可以调整形状的同时实现高阶的连续,b样条这一方法被引入了进来。b样条广泛的用于cad软件和众多计算机图形学算法库中,相比于bezier曲线,b样条有两个优势:(1)b样条基函数多项式次数独立于控制点个数。(2)允许局部控制曲线。缺点:比bezier更加复杂。

B 样条曲线可以被认为是定义了一个n-1次连续的多个n 阶 Bezier 曲线的顺序组合。即,在区间内b样条满足n阶连续,在区间之间b样条满足n-1阶连续。

2、b样条公式

给定参数轴一个分割: T : t i i = − ∞ + ∞ , t i ≤ t i + 1 T:{t_i}^{+\infin}_{i=-\infin},t_i\leq t_{i+1} T:tii=+,titi+1,k阶b样条基函数可由下式给出:
{ B i , 1 = { 1 , t ∈ [ t i , t i + 1 ) , 0 , o t h e r   v a l u e s B i , k ( t ) = t − t i t i + k − 1 − t i B i , k − 1 ( t ) + t i + k − t t i + k − t i + 1 B i + 1 , k − 1 ( t ) , k ⩾ 2 \left\{\begin{array}{cc} B_{i,1}=\left\{\begin{array}{cc} 1, & t\in[t_i,t_{i+1}),\\ 0, & other\ values \end{array}\right.\\ B_{i,k}(t)=\frac{t-t_i}{t_{i+k-1}-t_i}B_{i,k-1}(t)+\frac{t_{i+k}-t}{t_{i+k}-t_{i+1}}B_{i+1,k-1}(t),k\geqslant 2 \end{array}\right. Bi,1={1,0,t[ti,ti+1),other valuesBik(t)=ti+k1tittiBi,k1(t)+ti+kti+1ti+ktBi+1,k1(t),k2
Notes:规定0/0=0

上式称为cox-de Boor公式,T称为结点向量(knot vector), t i t_i ti称为节点(knot),若 t i = t j + 1 = . . . = t j + l − 1 t_i=t_{j+1}=...=t_{j+l-1} ti=tj+1=...=tj+l1,称

b样条放弃了bezier曲线在构造时,所有的样条基函数都是非零的这一限制。b样条的所有的样条基都只在局部为正,具体的说,对于区间节点为 u 0 , u 1 , u 2 , . . . u_0,u_1,u_2,... u0,u1,u2,...的k阶b样条曲线,节点区间 ( u i , u i + 1 ) (u_i,u_i+1) uiui+1)的样条基中只有 B i − k + 1 , k ( t ) , . . . , B i , k ( t ) B_{i-k+1,k}(t),...,B_{i,k}(t) Bik+1,k(t),...,Bi,k(t)为正,其余均为0。即:
∑ a = − ∞ + ∞ B a , k = ∑ a = i − k + 1 k − 1 B a , k = 1 \sum_{a=-\infin}^{+\infin} B_{a,k}=\sum_{a=i-k+1}^{k-1} B_{a,k}=1 a=+Ba,k=a=ik+1k1Ba,k=1
3、示例

在这里插入图片描述

接下来我们以一个二阶b样条曲线为例来进行上述公式的计算,给定 u 0 , u 1 , u 2 , u 3 = 0 , 2 , 4 , 6 u_0,u_1,u_2,u_3=0,2,4,6 u0,u1,u2,u3=0,2,4,6,控制点坐标为 b [ u 0 , u 1 ] = ( 0 , 0 ) , b [ u 1 , u 2 ] = ( 8 , 8 ) , b [ u 2 , u 3 ] = ( 8 , 0 ) b[u_0,u_1]=(0,0),b[u_1,u_2]=(8,8),b[u_2,u_3]=(8,0) b[u0,u1]=0,0b[u1,u2]=8,8b[u2,u3]=(8,0),计算u=3时,b的值。

分析:u=3,落在了2和4之间,也就是 u 1 和 u 2 u_1和u_2 u1u2之间,下式中括号中元素 u 0 , u 1 , u 2 , u 3 , u 即 0 , 2 , 4 , 6 , 3 u_0,u_1,u_2,u_3,u即0,2,4,6,3 u0,u1,u2,u3,u02463,控制点坐标在上面给出,即求b[u,u]:
b [ u , u ] = u 2 − u u 2 − u 1 b [ u 1 , u ] + u − u 1 u 2 − u 1 b [ u , u 2 ] = 4 − 3 4 − 2 b [ u 1 , u ] + u − 2 4 − 2 b [ u , u 2 ] = 0.5 ∗ b [ u 1 , u ] + 0.5 ∗ b [ u , u 2 ] b [ u 1 , u ] = u 2 − u u 2 − u 0 b [ u 0 , u 1 ] + u − u 0 u 2 − u 0 b [ u 1 , u 2 ] = 4 − 3 4 − 0 [ 0 , 0 ] + 3 − 0 4 − 0 [ 8 , 8 ] = 0.25 ∗ [ 0 , 0 ] + 0.75 ∗ [ 8 , 8 ] = [ 6 , 6 ] b [ u , u 2 ] = u 3 − u u 3 − u 1 b [ u 1 , u 2 ] + u − u 1 u 3 − u 1 b [ u 2 , u 3 ] = 6 − 3 6 − 2 b [ u 1 , u 2 ] + 3 − 2 6 − 2 b [ u 2 , u 3 ] = 0.75 ∗ [ 8 , 8 ] + 0.25 ∗ [ 8 , 0 ] = [ 8 , 6 ] b [ u , u ] = 0.5 ∗ [ 6 , 6 ] + 0.5 ∗ [ 8 , 6 ] = [ 7 , 6 ] \begin{aligned} b[u,u]&=\frac{u_2-u}{u_2-u_1}b[u_1,u]+\frac{u-u_1}{u_2-u_1}b[u,u_2] \\ &=\frac{4-3}{4-2}b[u_1,u]+\frac{u-2}{4-2}b[u,u_2] \\ &=0.5*b[u_1,u]+0.5*b[u,u_2] \\ b[u_1,u]&=\frac{u_2-u}{u_2-u_0}b[u_0,u_1]+\frac{u-u_0}{u_2-u_0}b[u_1,u_2] \\ &=\frac{4-3}{4-0}[0,0]+\frac{3-0}{4-0}[8,8] \\ &=0.25*[0,0]+0.75*[8,8] \\ &=[6,6] \\ b[u,u_2]&=\frac{u_3-u}{u_3-u_1}b[u_1,u_2]+\frac{u-u_1}{u_3-u_1}b[u_2,u_3] \\ &=\frac{6-3}{6-2}b[u_1,u_2]+\frac{3-2}{6-2}b[u_2,u_3] \\ &=0.75*[8,8]+0.25*[8,0] \\ &=[8,6] \\ b[u,u]&=0.5*[6,6]+0.5*[8,6] \\ &=[7,6] \end{aligned} b[u,u]b[u1,u]b[u,u2]b[u,u]=u2u1u2ub[u1,u]+u2u1uu1b[u,u2]=4243b[u1,u]+42u2b[u,u2]=0.5b[u1,u]+0.5b[u,u2]=u2u0u2ub[u0,u1]+u2u0uu0b[u1,u2]=4043[0,0]+4030[8,8]=0.25[0,0]+0.75[8,8]=[6,6]=u3u1u3ub[u1,u2]+u3u1uu1b[u2,u3]=6263b[u1,u2]+6232b[u2,u3]=0.75[8,8]+0.25[8,0]=[8,6]=0.5[6,6]+0.5[8,6]=[7,6]

性质

1、曲线满足k-1阶连续。

2、对于n+1个控制点,由n+1个混合函数进行描述。

3、控制点可以重复,可以删减,可以增加。

4、每个曲线段受k个控制点影响。

5、每个曲线段会落在k+1个控制点形成的凸包内。

6、任意一个控制点可以影响最多k个曲线段的形状。

如上图所示,为了满足过初始(结尾)的控制点,需要对现有的控制点进行扩张,通常是把初始控制点复制达到k个。此时,b样条曲线过初始顶点,且与0,1控制点形成的线段相切。如果对于2阶b样条,如果想过9这个控制点,则需要在最后再复制一份9这个控制节点加入结点向量。

应用

1、通过采样方式对函数的数值进行b样条插值,包括图像,路径,温度等的插值等。

d017e0c6da2a99bd91e1bd28f6e4efdf.png

2、对几何外形进行人为的构造。

3、车床在走刀头时,要求所车的部件至少是c2光滑的,才能满足不会卡刀的要求,因此在cad设计时,可以采用3次b样条曲线。

CAGD_ThomasSederberg.pdf
Chapter 2. B样条曲线.pdf

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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样条曲线的绘制与调整都十分灵活,可以满足不同场景下的需求和要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值