B样条

什么是样条?

样条是通过一组指定点集而生成平滑曲线的柔性带。

什么是B样条?

B样条就相当于一个函数,这个函数在系数不同时就可以变化成各种曲线的形状。

B样条曲线

BezierBezierBezier曲线的不足
  • nnnBezierBezierBezier曲线:n+1n+1n+1个控制点

    x(t)=∑i=0nBin(t)bix(t)=\sum_{i=0}^nB_i^n(t)b_ix(t)=i=0nBin(t)bi

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oyo0bFcc-1633780575853)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211007171546503.png)]

全局性:牵一发而动全身,不利于设计

原因:基函数是全局的

样条曲线
  • 分段的多项式曲线(BezierBezierBezier曲线)
    • 分段表达,具有局部性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mg5lZ0zo-1633780575856)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211007181628645.png)]

样条曲线的统一表达:

  • 形式类比:每个控制顶点用一个基函数进行组合

    x(t)=∑i=0nNi,k(t)dix(t)=\sum_{i=0}^nN_{i,k}(t)d_ix(t)=i=0nNi,k(t)di

  • 性质要求:

    • 基函数须局部性(局部支集) 移动某一段控制点的位置只会影响该段曲线的形状,其他段的曲线不受影响。
    • 基函数要有正性+权性
    • .........
B样条的产生

启发:

  • BernsteinBernsteinBernstein基函数的递推公式:

    Bin(t)=(1−t)Bi(n−1)(t)+tBi−1(n−1)(t)B_i^n(t)=(1-t)B_i^{(n-1)}(t)+tB_{i-1}^{(n-1)}(t)Bin(t)=(1t)Bi(n1)(t)+tBi1(n1)(t),其中**B00(t)=1,Bin(t)=0若i∉{0,...,n}B_0^0(t)=1,B_i^n(t)=0若i\notin\{0,...,n\}B00(t)=1,Bin(t)=0i/{0,...,n}**

  • 思路:

    • 局部处处类似定义,由一个基函数平移得到
    • 高阶的基函数由2个低阶的基函数"升阶"得到
      • 利于保持一些良好的性质,比如提高光滑性

关键思想:

  • 以三次为例
    • 我们定义一个基函数b(t)b(t)b(t)
    • 特性:
      • b(t)b(t)b(t)C2C^2C2连续
      • b(t)b(t)b(t)是分段多项式,3次
      • b(t)b(t)b(t)具有局部支持特性
      • 重复平移b(t+i)b(t+i)b(t+i)形成一个统一的分区
      • b(t)≥0b(t)≥0b(t)0,对于所有的ttt

B样条曲线的每个控制节点都有一个节点参数:节点向量

kkk阶均匀B样条基函数被定义为:
Ni0(t)={1,i≤t<i+10,其他 N_i^0(t)=\begin{cases} 1,i≤t<i+1\\ 0,其他 \end{cases} Ni0(t)={1,iti+10,
在这里插入图片描述

B样条的优势
  1. 保留了BezierBezierBezier曲线的优势
  2. 可局部修改,调整某一控制点的时候,不会影响到整条曲线。
  3. 控制多边形与曲线的逼近程度较好
  4. 曲线拼接时比BezierBezierBezier方便
B样条曲线

一般表达:

n+1n+1n+1个控制点Pi(i=0,1,...,n)P_i(i=0,1,...,n)Pi(i=0,1,...,n)和一个节点向量T={t0,t1,...,tm}T=\{t_0,t_1,...,t_m\}T={t0,t1,...,tm},依次连接这些控制点可以构成一个特征多边形,k+1k+1k+1阶(kkk次)B样条的表达式如下所示,而且2≤k≤n+12≤k≤n+12kn+1,必须满足m=n+k+1m=n+k+1m=n+k+1,一般情况下t0=0,tm=1t_0=0,t_m=1t0=0,tm=1。所以定义域是闭区间[0,1]
P(t)=∑i=0nPiFik(t)  t∈[tk−1,tn+1] P(t)=\sum_{i=0}^nP^iF_{i}^{k}(t)\ \ t\in[t_{k-1},t_{n+1}] P(t)=i=0nPiFik(t)  t[tk1,tn+1]
其中Fik(t)F_i^k(t)Fik(t)是k次B样条基函数,kkk表示基函数的次数,公认的是deBoor−Coxde Boor-CoxdeBoorCox递推定义。其内容简单来说是由0次构造1次,由1次构造2次,由2次构造3次,以此类推。

递推定义:
{Fi0(t)={1,ti≤t≤ti+10,其他Fik(t)=t−titi+k−tiFik−1(t)+ti+k+1−tti+k+1−ti+1Fi+1k−1(t)约定00=0 \begin{cases} F_{i}^{0}(t)=\begin{cases} 1,t_i≤t≤t_{i+1}\\ 0,其他\\ \end{cases}\\ F_{i}^{k}(t)=\frac{t-t_i}{t_{i+k}-t_i}F_{i}^{k-1}(t)+\frac{t_{i+k+1}-t}{t_{i+k+1}-t_{i+1}}F_{i+1}^{k-1}(t)\\ \\约定\frac{0}{0}=0 \end{cases} Fi0(t)={1,titti+10,Fik(t)=ti+ktittiFik1(t)+ti+k+1ti+1ti+k+1tFi+1k1(t)00=0

零次B样条

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FeGPOB1C-1633780575865)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211008163007092.png)]

一次B样条

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cX9xBsq9-1633780575867)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211008163417265.png)]

二次B样条

在这里插入图片描述

三次B样条

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TBN9IIcG-1633780575868)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211008163745791.png)]

B样条的曲线递推图像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h6hrszDj-1633780575870)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211008165914167.png)]

B样条的定义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYm6ML13-1633780575871)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211009121336520.png)]

为了理解p>0p>0p>0时计算Ni,p(u)N_{i,p}(u)Ni,p(u)的方法(ppp为次数),我们使用三角计算格式。所有节点区间在左边第一列,所有零次基函数在第二列。见下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oYM6Le7o-1633780575872)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211009121501453.png)]

为了计算Ni,1N_{i,1}Ni,1,需要Ni,0(u)和Ni+1,0(u)N_{i,0}(u)和N_{i+1,0}(u)Ni,0(u)Ni+1,0(u)。因此,我们可以计算N0,1(u),N1,1(u),N2,1(u)N_{0,1}(u),N_{1,1}(u),N_{2,1}(u)N0,1(u),N1,1(u),N2,1(u)等等。所有这些Ni,1(u)N_{i,1}(u)Ni,1(u)写在第三列。一旦所有Ni,1(u)N_{i,1}(u)Ni,1(u)计算完毕,我们可以计算Ni,2(u)N_{i,2}(u)Ni,2(u)并将其放在第四列。继续这个过程直到所有需要的Ni,p(u)N_{i,p}(u)Ni,p(u)计算完毕。

因为Ni,1(u)N_{i,1}(u)Ni,1(u)是从Ni,0(u)N_{i,0}(u)Ni,0(u)Ni+1,0(u)N_{i+1,0}(u)Ni+1,0(u)计算的,因此可以得出Ni,1(u)N_{i,1}(u)Ni,1(u)[ui,ui+2)[u_i,u_{i+2})[ui,ui+2)上是非零的。

由上图得出结论:基函数Ni,p(u)N_{i,p}(u)Ni,p(u)在[ui,ui+p+1u_i,u_{i+p+1}ui,ui+p+1)上非零

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zlPNngqQ-1633780575873)(C:\Users\MyPC\AppData\Roaming\Typora\typora-user-images\image-20211009190404837.png)]

由上图可得出:在任何一个节点区间[ui,ui+1)[u_i,u_{i+1})[ui,ui+1),最多有p+1p+1p+1ppp次基函数非零,即Ni−p,p(u),Ni−p+1,p(u),Ni−p+2,p(u),...,Ni−1,p(u)N_{i-p,p}(u),N_{i-p+1,p}(u),N_{i-p+2,p}(u),...,N_{i-1,p}(u)Nip,p(u)Nip+1,p(u)Nip+2,p(u)...,Ni1,p(u)Ni,p(u)N_{i,p}(u)Ni,p(u)

B样条基函数的主要性质

1. 局部支撑性:

Bi,k(u)={≥0   u∈[ui,ui+k+1]=0   otherwise B_{i,k}(u)=\begin{cases} ≥0\ \ \ u\in[u_i,u_{i+k+1}]\\ =0\ \ \ otherwise \end{cases} Bi,k(u)={0   u[ui,ui+k+1]=0   otherwise

​ 而BezierBezierBezier在整个区间非0。反过来,对每一个区间(ui,ui+k+1)(u_i,u_{i+k+1})(ui,ui+k+1)上最多有k+1k+1k+1个基函数在其上非零

2. 权性:

∑i=0nBi,k(u)=1   u∈[uk,un+1] \sum_{i=0}^nB_{i,k}(u)=1\ \ \ u\in[u_{k},u_{n+1}] i=0nBi,k(u)=1   u[uk,un+1]

3. 连续性:

Bi,k(u)B_{i,k}(u)Bi,k(u)rrr重节点处的连续阶不低于k−1−rk-1-rk1r

4. 分段参数多项式:

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

B样条函数的主要性质

1.局部性:

kkk阶B样条曲线上的一点至多与kkk个控制顶点有关,与其它控制顶点无关

​ 移动曲线的第iii个控制顶点PiP_iPi,至多影响到定义在区间上那部分曲线的形状,对曲线其余部分不发生影响

2.变差缩减性:

​ 平面内n+1n+1n+1个控制顶点构成B样条曲线P(t)P(t)P(t)的特征多边形。在该平面内的任意一条直线与P(t)P(t)P(t)的交点个数不多于该直线和特征多边形的交点个数

3. 几何不变性:

​ B样条曲线的形状和位置与坐标系的选择无关

4.凸包性:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JifqAoT7-1636171565307)(B样条.assets/image-20211102210715876.png)]

​ 凸包就是包含上边这6个顶点的最小凸多边形。凸多边形是把多边形的每条边延长,其它边都在它的同一侧

​ 该性质导致顺序k+1k+1k+1个顶点重合时,由这些顶点定义的k次B样条曲线段退化到这一个重合点;顺序k+1k+1k+1个顶点共线时,由这些顶点定义的k次B样条曲线为一直线段

B样条曲线类型的划分

1. 均匀B样条曲线

​ 当节点沿参数轴均匀等距分布,即ui+1−ui=常数>0u_{i+1}-u_i=常数>0ui+1ui=>0时,表示均匀B样条函数

如:{0,1,2,3,4,5,6}\{0,1,2,3,4,5,6\}{0,1,2,3,4,5,6}

​ 均匀B样条的基函数呈周期性。即给定n和k,所有的基函数有相同形状。每个后续基函数仅仅是前面基函数在新位置上的重复:
Bi,k(u)=Bi+1,k(u+Δu)=Bi+2,k(u+2Δu) B_{i,k}(u)=B_{i+1,k}(u+\Delta u)=B_{i+2,k}(u+2\Delta u) Bi,k(u)=Bi+1,k(u+Δu)=Bi+2,k(u+2Δu)
其中,Δu\Delta uΔu为相邻节点值的间距

​ 均匀B样条曲线没有保留BezierBezierBezier曲线端点的几何性质,即不过控制点中的起点和终点,采用准均匀的B样条曲线则能够通过。

2. 准均匀B样条曲线

​ 与均匀B样条曲线的差别在于两端节点具有重复度k,这样的节点矢量定义了准均匀的B样条函数

均匀:u={0,1,2,3,4,5,6}u=\{0,1,2,3,4,5,6\}u={0,1,2,3,4,5,6}

准均匀:{0,0,0,1,2,3,4,5,5,5}\{0,0,0,1,2,3,4,5,5,5\}{0,0,0,1,2,3,4,5,5,5}

3. 分段BeizerBeizerBeizer曲线

​ 节点矢量中两端节点具有重复度k,所有内节点重复度为k-1,这样的节点矢量定义了分段的BernsteinBernsteinBernstein

​ B样条曲线用分段BezierBezierBezier曲线表示后,各曲线段就具有了相对的独立性

4. 非均匀B样条曲线

​ 当节点沿参数轴的分布不等距,即ui+1−ui≠常数时u_{i+1}-u_i≠常数时ui+1ui=,表示非均匀B样条函数

B样条曲面

B样条曲面方程为:
p(u,v)=∑i=0m∑j=0ndijNi,k(u)Nj,l(v) p(u,v)=\sum_{i=0}^m\sum_{j=0}^nd_{ij}N_{i,k}(u)N_{j,l}(v) p(u,v)=i=0mj=0ndijNi,k(u)Nj,l(v)
其中uk≤u≤um+1,vi≤v≤vn+1u_k≤u≤u_{m+1},v_i≤v≤v_{n+1}ukuum+1,vivvn+1,B样条基函数Ni,k(u)(i=0,1,...,m)N_{i,k}(u)(i=0,1,...,m)Ni,k(u)(i=0,1,...,m)Nj,l(v)(j=0,1,...,n)N_{j,l}(v)(j=0,1,...,n)Nj,l(v)(j=0,1,...,n)分别由节点矢量U和VU和VUVdeBoor−coxdeBoor-coxdeBoorcox递推公式计算,di,jd_{i,j}di,j构成一张控制网格,称为B样条曲面的特征网格

最终实现的结果为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3VytsFvJ-1636442804332)(B样条.assets/image-20211108173230768.png)]
其中节点向量通过哈特利-贾德方法获得。

困惑点:使用Hartley-Judd(哈特利-贾德)方法获得节点向量没有看明白

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐