课堂笔记_ B样条曲线和NUBRS

为什么学习B样条

Bezier曲线/曲面不支持局部的修改和编辑
Bezier曲线/曲面拼接时,满足几何连续条件是十分困难的

B样条的历史

1946年,Schoenberg提出了一种基于样条的方法来近似曲线;

B样条的动机源于插值中的Runge-Kutta现象:高阶多项式很容易产生不稳定的上下抖动。

为什么不用分段低阶多项式通过连续的连接来代替高阶多项式呢?这就是样条(分段低阶多项式)的思想。

1972年,基于Schoenberg的工作,Gordon和Riesenfeld提出了B样条以及一系列对应的几何算法。

如何求解B样条

样条函数的插值,可以通过求解一个三对角方程来进行。
对于一个给定的区间划分,可以类似的计算样条曲线的插值。
给定区间上的所有样条函数组成一个线性空间。这个线性空间的基函数就叫做B样条基函数。

B样条基函数

P(t)=i=04PiNi,4

1.B样条基函数 Ni,k(t) 的非零区间是什么? ( ti,ti+k )
-小部分非0,大部分为0,保证了B样条的局部性。

2.一共需要多少个节点?
P0 对应 N0,4 , N0,4 对应的非零区间为( t0,t4
P1 对应 N1,4 , N1,4 对应的非零区间为( t1,t5
P2 对应 N2,4 , N2,4 对应的非零区间为( t2,t6
P3 对应 N3,4 , N3,4 对应的非零区间为( t3,t7
P4 对应 N0,4 , N4,4 对应的非零区间为( t4,t8

-共( N+K+1 )个

3.B样条插值出的曲线的定义区间是什么?
基函数定义区间
上图中 t3 - t5 有定义,其他区间无意义。总共五个基函数。k阶指的是一段内必须有k个基函数,这样才有意义,否则基底少了一个就不完备了。每个基函数跨越了k个区间

性质1
性质2

B样条分类

一般的曲线可以根据起始点和终止点是否重叠来进行分类:
- 不重合:开曲线
- 重合:闭曲线
根据节点向量中节点的分布,B样条可以分为如下四类:

(1)均匀B样条
节点成等差数列均匀分布排布,例如:0,1,2,3,4,5,5,7
均匀B样条
0,1,2,3定义一段,1,2,3,4定义另一段。两端之间有三个点之间重合,就可以两次连续。

最大特定:给定控制网格,就可以画出(估计出)曲线。如1,3两点的中点与2相连,相连线段的三分之一处为均匀B样条的起始点;2,4两点的中点与3相连,相连线段的三分之一处为均匀B样条过的点;这样依次连接,就可以大概画出均匀B样条。

(2)准均匀B样条:将起点和终点的都有k的重复度, 曲线就会经过端点。(对比均匀B样条,起点应在1,3两点的中点与2连线,取连线的三分之一处。)
准均匀B样条

(3)分段Bezier曲线:起始节点和终止节点都具有k的重复度,所有其他节点都具有k-1的重复度。
分段Bezier曲线
以上所有的分段都为Bezier曲线,对于分段Bezier曲线,不同的曲线段相互独立,移动控制点只会影响其所在的Bezier曲线段,而其他的Bezier曲线段都不会改变,甚至所有关于Bezier曲线的算法可以同样地适用于分段Bezier曲线。

但是分段Bezier曲线需要使用更多的参数和变量来进行控制:更多的控制点和更多的节点。

(4) 非均匀B样条
节点向量 T=[t0,t1,,tn+k] 中的节点呈非减序列排布,并且满足:
起始节点和终止节点的重复度均小于等于k;
其他节点的重复度小于等于k-1。

性质1:局部支持性
区间 t[ti,ti+1] 上的曲线仅至多k个控制点 Pj(j=ik+1,i) 决定,因为在 t[ti,ti+1] 区间上最多有k个控制点有定义。

修改控制点 Pi 仅会影响到区间 (ti,ti+k) 的曲线。

性质2:连续性
P(t)在每一个重复度为r的节点上具有 Ck1r 的连续性。
解释:假如k阶曲线,且节点向量不重复,由于k阶曲线是k-1阶连续。样条的概念是要比多项式低一次的几何连续性,所以k阶曲线在节点向量不重复的情况下,是k-1-1次连续。例如4阶曲线是(4-1-1=2)的连续。

性质3:凸包性
一个B样条曲线被包围在其控制顶点的凸包内部。

性质4:变差缩减性(Variation Diminishing Property)
任何一条直线与B样条曲线的交点树木不会超过该直线与B样曲线的控制多边形的交点数目。

性质5:仿射不变形
对曲线的变化可以通过对顶点的控制来选择。

性质6:直线保持性
如果控制多边形退化成为一条直线,那么B样条曲线依然在这条直线上。

性质7:灵活性
使用B样条曲线可以方便地构建如线段,尖点,切线等特殊效果。

以4阶B样条为例,如果需要包含一条线段,只需要指定控制顶点 Pi,Pi+1,Pi+2,Pi+3 共线(参照均匀B样条理解,非均匀的也有根据控制点画B样条的性质,只是不在三分之一点处)。如下图中的四顶点共线。

如果希望曲线过一个点 Pi ,只需要指定 Pi=Pi+1=Pi+2 ,即可得到尖点。如下图中的三重顶点。
灵活性
如上图中两重顶点相切,如果需要曲线与直线L相切,只需要指定控制点 Pi,Pi+1,Pi+2 都在L上,并让 ti+3 的重复度小于2。

计算B样条上一点的值

计算B样条曲线的一点P(t),可以直接使用B样条的公司,但de Boor算法是一个更有效的算法
de Boor算法
当求一个在 (tj,tj+1) 间的点t,只有在(j-k+1,j)之间有定义。将基函数用de-Boor算法展开,合并同类项后得到一个式子。即将一个k阶B样条写成了一个k-1阶B样条的形式,控制顶点变成了线性组合。

由此写成如下的递推公式求解B样条 一点的值:
de Boor算法1
deBoor算法递推方式.jpg
de Boor算法的递推不同于Bezier的求值,只需要特定的点求解。
deBoor算法割角

节点的插入

节点插入的意义

是实际中对B样条的重要的交互操作,允许在不改变一个B样条的几何形状以及阶的条件下插入一个新的节点。通过插入新的节点,可以增加一个B样条曲线的可控程度

插入新的节点t到节点区间 [ti,ti+1] 中;
节点向量变成为:

T1=[t0,t1,,ti,t,ti+1,,tn+k]

写成:

T1=[t10,t11,,t1i,t1,t1i+1,,t1n+k]

新的节点向量对应了新的B样条基函数。假设原始曲线P(t)可以由这些新的基函数和新的控制顶点 P1j (待定)来表达。

P(t)=j=0n+1P1jNj,k1(t)

在不改变B样条几何形状情况下,插入新节点后基函数变化,所以需要控制点变换,这时候就需要节点插入的算法

节点插入的算法

节点插入算法
很简单的一个算法,只是对当中的点进行了求取组合数。

效果演示如下:
节点插入效果演示

NUBRS

B样条曲线和Bezier曲线的缺点:
不能精确表示圆锥曲线(除了抛物线)
NUBRS(Non-Uniform Rational B-Spline,非均匀有理B样条):
目的在于找到一种精确描述圆锥曲线以及二次曲面的数学方法。

优点:
它提供了一个更一般更精确的方法,来表达并对自由曲线/曲面进行设计;
它提供了一个通用的数学公式,可以同时表示标准的解析曲线/曲面(如圆锥曲线)和自由曲线/曲面(如参数曲线/曲面);
存在稳定快速的数值计算算法;
NUBRS不仅对于仿射变换存在不变性,对于投影变换也存在不变性;
由于NURBS的控制点和权重都可以任意修改,用NURBS来进行曲线/曲面的设计可以获得更大的灵活性
非有理B样条,非有理和有理Bezier曲线/曲面都可以看成是NURBS的一种特殊形式

缺点:
需要存储权因子,如权重设计不合理,NURBS曲线可能会产生畸变;

  • 4
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tingzhushaohua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值