分享讲解nurbs的一本书和一个网站

哇,这个新论坛好棒,看中文的感觉真好啊!!

这几天刚把nurbs的定义重新看了看,The NURBS Book这本书和CS3621上对于非周期的nurbs曲线定义上明确约定了两端的重节点数量为q+1,在rhino中节点序列确实少了两端的两个。我按deboor的定义在gh中重新写了一个Nurbs实现,按照deboor的定义,节点向量两端确实需要在rhino的节点向量基础上添加一个重节点。具体参见gh文件。B样条曲线.gh (60.4 KB)

1 个赞

和算法的新旧无关,和节点向量的定义有关。
节点向量是逐个隐藏的。最开始的定义是Floating 类型的NURBS曲线(或者说是B-spline),曲线首尾和控制点首尾是不重合的;逐个隐藏节点,得到的结果会逐渐向Bezier形态变化,就是Clamped类型,曲线的首尾和控制点的首尾是重叠的。隐藏几个节点,得到的结果是不一样的。
Rhino是在软件内部显示的信息部分省去了,但是在计算的时候还是一样的(不知道会不会让他们的程序员搞混),导出数据的时候也会加上省去的节点向量。
其实没必要省去,毕竟没节省多少存储,也没节省多少计算量。

确实是新旧算法的区别,只要在零阶基函数的定义上做一点小改变,就能在少了两个节点向量情况下构造数学上完全等价的基函数序列。


将m-1改为m+1即可

1 个赞

B-spline Curves: Definition (mtu.edu)

B-spline Curves: Open Curves (mtu.edu)

你的这个图,还是有0到m个节点向量,节点向量总数为m+1个。
在 m=n+p+1的规则下,节点向量总数为m+1,那么就是 (m+1)=(n+1) + (p+1) ,你会发现那是你说的“旧算法”。

用一个单span的3次(degree=3,控制点数量为4)曲线举例子,节点向量只有8个{0,0,0,0,1,1,1,1},就是满足 m=n+p+1的。