开源项目推荐:Bezier曲线、B-Spline和NURBS的区别与《THE NURBS BOOK 2nd》简介

简介: 开源项目推荐:Bezier曲线、B-Spline和NURBS的区别与《THE NURBS BOOK 2nd》简介

一、基本概念


B-Spline:B样条曲线


NURBS(Non Uniform Rational B-Spline):非均匀有理B样条曲线


B样条曲线有三种类型:


image.png


当起始点和终止点的重复度为最高次数加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曲线:


image.png


可以通过改变一个控制点的位置来改变曲线的形状,比如将上图曲线中左边第二个控制点往上移,就可以得到下面的曲线:


image.png


可以看到,这种曲线生成方式比较直观和灵活,我只需要放置控制点,然后调整控制点的位置来得到想要的曲线,这就避免了和复杂的数学方程打交道,岂不快哉?


Bezier曲线、B样条和NURBS都是根据控制点来生成曲线的,那么他们有什么区别了?简单来说,就是:


§  Bezier曲线中的每个控制点都会影响整个曲线的形状,而B样条中的控制点只会影响整个曲线的一部分,显然B样条提供了更多的灵活性;


§  Bezier和B样条都是多项式参数曲线,不能表示一些基本的曲线,比如圆,所以引入了NURBS,即非均匀有理B样条来解决这个问题;


Bezier曲线只是B样条的一个特例而已,而B样条又是NURBS的一个特例,它们的关系可以图示为:

image.png


B样条克服了Bezier曲线的一些缺点,Bezier曲线的每个控制点对整条曲线都有影响,也就是说,改变一个控制点的位置,整条曲线的形状都会发生变化,而B样条中的每个控制点只会影响曲线的一段参数范围,从而实现了局部修改。


image.png


三、推荐阅读


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".


Home - Solid Modeling Solutions - NURBS-Based Geometry Kernel Libraries


SMS Libraries Manual - Solid Modeling Solutions - NURBS-Based Geometry Kernel Libraries


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 数值分析


6《计算几何算法与实现(Visual C++版)》 孔令德,三次参数样条曲线


7《计算机图形学——基于MFC三维图形开发》 孔令德


8《数值计算方法与算法(第三版)》 张韵华


四、参考博客


曲线数学NURBS之bezier曲线


曲线数学NURBS之B样条曲线


[图形学] B样条曲线 - 原理和C++实现的演示程序(附源码)


三次B样条曲线拟合算法


三次Beizer曲线拟合算法


五、NURBS开源库


NURBS++ ++ libnurbs - Browse Files at SourceForge.net nurbs++-3.0.11


Nurbs3.0.11开源库vs2010源代码-C++文档类资源-CSDN下载 Nurbs3.0.11开源库vs2010源代码


SISL ++ https://github.com/SINTEF-Geometry/SISL SISL


https://github.com/sintefmath/Splipy


SINTEF SISL库是当前可用的最成熟且功能完整的开源NURBS库,尽管它似乎尚未在开源社区中获得关注。 它是GPL许可。 最新版本使用CMake构建。SISL是一个全面的NURBS库,用于对曲线和曲面进行建模和询问。 它用C语言实现,并且经过三十多年的不断发展。


Interpolation — GSL 2.7 documentation 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


GitHub - OpenNurbsFit/OpenNurbsFit: Open source NURBS fitting library


What is openNURBS? with C/C++


NURBS-Python :: Onur Rauf Bingol ++ GitHub - orbingol/NURBS-Python: Object-oriented pure Python B-Spline and NURBS library  


Ayam - Start Ayam is an open source NURBS modeler based on Tcl/Tk and OpenGL.


GitHub - OpenNurbsFit/OpenNurbsFit: Open source NURBS fitting library


https://github.com/q576333/agv_path_smoothing


https://github.com/aijm/NURBS


六、FitYk曲线拟合软件(开源)


curve fitting (peak fitting) software


Fityk --- curve fitting and peak fitting software — Fityk 1.3.1 manual


https://github.com/wojdyr/fityk


image.png


七、IGOR Pro(商业软件)


一款强大好用的数据绘图和处理工具,igor最突出的特色不是绘图,而完全可以程的特点,软件提供了大量的函数以及命令供用户选择,且拥有易于使用的编程环境,可以将编程当作数据处理的一部分,而且无需任何外部的支持,软件内置了预编译指令、文件包含、条件编译、名称空间等,支持与主流的文件格式兼容,比如HDF、matlaba、mcamp等,支持win、mac等操作系统。



相关文章
|
自然语言处理 算法 前端开发
C++与Doxygen:精通代码文档化之道
C++与Doxygen:精通代码文档化之道
1060 0
|
存储 传感器 自动驾驶
几种常见的点云格式数据解析与在线预览
3D模型在线转换网站支持pcd、pts、xyz、las、laz、asc、ply等点云格式文件在线预览,同时支持将点云格式在线转换为ply、xyz等模型格式。
8931 1
Vue3 父组件调用子组件方法($refs 在setup()、<script setup> 中使用)
Vue3 父组件调用子组件方法($refs 在setup()、<script setup> 中使用)
2870 0
halcon算子模板匹配(一)基于形状的模板匹配
halcon算子模板匹配(一)基于形状的模板匹配
5771 0
|
9月前
|
人工智能 安全 Ubuntu
保姆级教程 | 在Ubuntu上部署Claude CodeUI全过程
Claude Code Plan Mode 是 Anthropic 推出的智能编程助手功能,采用只读分析模式,保障代码安全的同时提供AI驱动的项目规划与风险评估。该模式平均每周为开发者节省27小时,显著提升开发效率与项目成功率,是AI编程领域的重要创新。
13283 10
|
10月前
|
机器学习/深度学习 算法 数据挖掘
【机械臂控制】基于matlab具有参数不确定性的动态非线性系统机械臂鲁棒控制研究(Matlab代码实现)
【机械臂控制】基于matlab具有参数不确定性的动态非线性系统机械臂鲁棒控制研究(Matlab代码实现)
353 0
|
设计模式 Java 程序员
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
本系列文章聚焦于面向对象软件设计中的设计模式,旨在帮助开发人员掌握23种经典设计模式及其应用。内容分为三大部分:第一部分介绍设计模式的概念、UML图和软件设计原则;第二部分详细讲解创建型、结构型和行为型模式,并配以代码示例;第三部分通过自定义Spring的IOC功能综合案例,展示如何将常用设计模式应用于实际项目中。通过学习这些内容,读者可以提升编程能力,提高代码的可维护性和复用性。
4005 1
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
|
编译器 C语言 计算机视觉
Qt+OpenCV配置教程(图解亲测)
Qt+OpenCV配置教程(图解亲测)
3572 0
Qt+OpenCV配置教程(图解亲测)
QT设置widget背景图片
该内容介绍如何在Qt中为控件添加背景图片。主要方法包括:1) 在样式表中使用`border-image`属性指定控件及其背景图片;2) 使用调色板`QPalette`设置图片,但可能导致窗口显示不下;3) 在`paintEvent`中绘制图片,适合自定义绘图但不适用于子窗口;4) 通过覆盖一个大小与窗口相同的`QLabel`来设置背景图片,可实现动态背景。推荐使用样式表设置背景,简单高效且适合子窗口。
1543 3
|
容器
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Tab Widget的使用及说明
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Tab Widget的使用及说明
2809 2