原地址:https://libaineu2004.blog.csdn.net/article/details/103287767
一、基本概念
B-Spline:B样条曲线
NURBS(Non Uniform Rational B-Spline):非均匀有理B样条曲线
B样条曲线有三种类型:
这里写图片描述
当起始点和终止点的重复度为最高次数加1是,开B样条变为Clamped B样条,当起始点和终止点重合且重复度为p+1时为闭B样条曲线。如上图的clamped有 n+1个控制点(n=9)以及 p = 3. 。那么,, m 必须是13 所以节点向量有14个节点。为了有clamped效果,前p+1 = 4 和最后4个节点必须一样。其余14 - (4 + 4) = 6 个节点可在定义域任何位置。实际上,曲线是用节点向量 U = { 0, 0, 0, 0, 0.14, 0.28, 0.42, 0.57, 0.71, 0.85, 1, 1, 1, 1 }产生的。
二、详情
在CAD中,设计师需要设计出各种各样的曲线;数学中,曲线是通过各种各样的方程表示的,比如一条通过点A(0,0)、B(1,1)的直线可以表示为:
y=x
或者用参数方程表示:
P(u) = (1-u)A+tB
再比如一个通过原点(1,2)、半径为2的圆可以表示为:
(x-1)^2 + (y-2)^2 = 4
或者用参数方程表示:
x = 2cos(u)+1
y = 2sin(u)+2
上面举例的是两种很简单的曲线,对于更复杂的曲线可以用更复杂的方程来表示(比如用高次多项式);
如果我们的设计师是一位数学家就好了,他可以根据自己的需要,设计出一个复杂的方程来表示自己想要的一条优美的曲线,但是事与愿违,设计师们往往想通过一种直观的方式来设计曲线,而不是利用方程。
因此,诸位科学家和工程师设计出了Bezier曲线、B-Spline样条曲线和NURBS,下面是一个有四个控制点的Bezier曲线:
可以通过改变一个控制点的位置来改变曲线的形状,比如将上图曲线中左边第二个控制点往上移,就可以得到下面的曲线:
可以看到,这种曲线生成方式比较直观和灵活,我只需要放置控制点,然后调整控制点的位置来得到想要的曲线,这就避免了和复杂的数学方程打交道,岂不快哉?
Bezier曲线、B样条和NURBS都是根据控制点来生成曲线的,那么他们有什么区别了?简单来说,就是:
§ Bezier曲线中的每个控制点都会影响整个曲线的形状,而B样条中的控制点只会影响整个曲线的一部分,显然B样条提供了更多的灵活性;
§ Bezier和B样条都是多项式参数曲线,不能表示一些基本的曲线,比如圆,所以引入了NURBS,即非均匀有理B样条来解决这个问题;
Bezier曲线只是B样条的一个特例而已,而B样条又是NURBS的一个特例,它们的关系可以图示为:
B样条克服了Bezier曲线的一些缺点,Bezier曲线的每个控制点对整条曲线都有影响,也就是说,改变一个控制点的位置,整条曲线的形状都会发生变化,而B样条中的每个控制点只会影响曲线的一段参数范围,从而实现了局部修改。
三、推荐阅读
1 《The NURBS Book 2nd》 英文版
国外讲义NURBS的经典书籍,涉及到NURBS曲线和曲面的基本定义和属性讲解,对NURBS曲线和曲面的相关操作及算法。如果想了解几何里面的曲线和曲面的知识,这本书很值得推荐!书籍从浅入深剖析样条曲线,采用通俗易懂的用词。能很轻松的看懂。里面有很多伪代码,能很方便修改成C/C++代码,然后直接套用。
源码:NLib source code has it's origins in code developed by Wayne Tiller and Les Piegel, based on their reference work "The Nurbs Book".
http://www.smlib.com/Manual/NLibIntro.html
http://www.smlib.com/Manual/
C.-K. Shene博士的CS3621 Introduction to Computing with Geometry Notes的第6部分B-spline Curves
2 《非均匀有理B样条(第2版)》是《THE NURBS BOOK 2nd》的中文版翻译
作者: Les Piegl / Wayne Tiller
出版社: 清华大学出版社
译者: 赵罡 / 穆国旺 / 王拉柱
3《An Introduction to NURBS.pdf》
配套源码:http://www.nar-associates.com/nurbs/c_code.html
4 施法中. 计算机辅助几何设计与非均匀有理B样条(修订版)[M]. 北京: 高等教育出版社, 2013.
5 数值分析
四、参考博客
曲线数学NURBS之bezier曲线
曲线数学NURBS之B样条曲线
[图形学] B样条曲线 - 原理和C++实现的演示程序(附源码)
三次B样条曲线拟合算法
三次Beizer曲线拟合算法
五、NURBS开源库
http://libnurbs.sourceforge.net/old/ ++ https://sourceforge.net/projects/libnurbs/files/ nurbs++-3.0.11
https://download.csdn.net/download/zhai_ht/4983882 Nurbs3.0.11开源库vs2010源代码
https://www.sintef.no/projectweb/geometry-toolkits/sisl/ ++ https://github.com/SINTEF-Geometry/SISL SISL
https://github.com/sintefmath/Splipy
SINTEF SISL库是当前可用的最成熟且功能完整的开源NURBS库,尽管它似乎尚未在开源社区中获得关注。 它是GPL许可。 最新版本使用CMake构建。SISL是一个全面的NURBS库,用于对曲线和曲面进行建模和询问。 它用C语言实现,并且经过三十多年的不断发展。
https://www.gnu.org/software/gsl/doc/html/interp.html GSL
https://github.com/pradeep-pyro/tinynurbs
Primary Reference -- "The NURBS Book," Les Piegl and Wayne Tiller, Springer-Verlag, 1995.
https://github.com/msteinbeck/tinyspline
https://github.com/mcneel/opennurbs
https://github.com/OpenNurbsFit/OpenNurbsFit
https://developer.rhino3d.com/guides/opennurbs/what-is-opennurbs/
https://onurraufbingol.com/NURBS-Python/ ++ https://github.com/orbingol/NURBS-Python python
http://ayam.sourceforge.net/ Ayam is an open source NURBS modeler based on Tcl/Tk and OpenGL.
————————————————
版权声明:本文为CSDN博主「libaineu2004」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/libaineu2004/article/details/103287767