1. 程式人生 > 其它 >【轉】Bezier曲線、B-Spline和NURBS的區別與《THE NURBS BOOK 2nd》簡介

【轉】Bezier曲線、B-Spline和NURBS的區別與《THE NURBS BOOK 2nd》簡介

原地址: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