醫(yī)院網(wǎng)站建設(shè)情況電商推廣平臺(tái)
文章目錄
- 0.參考
- 1.問(wèn)題起源與插值法的曲線擬合
- 1.1.問(wèn)題起源
- 1.2.拉格朗日插值
- 1.3.“基”的概念
- 1.4.插值存在的Runge現(xiàn)象
- 2.貝塞爾曲線
- 2.1.控制點(diǎn)的思想
- 2.2.由控制點(diǎn)生成貝塞爾曲線
- 2.3.多個(gè)控制點(diǎn)時(shí)的貝塞爾曲線公式
- 2.4.貝塞爾曲線的遞推公式
- 2.5.貝塞爾曲線的性質(zhì)
- 3.B樣條曲線
- 3.1.B樣條曲線的基本概念
- 3.2.對(duì)B樣條的疑問(wèn)
- 3.3.B樣條遞推公式的過(guò)程
- 3.4.B樣條引入節(jié)點(diǎn)帶來(lái)的好處——局部性
- 3.5.為什么 m = n + k + 1 ?
- 3.6.為什么 階數(shù)(Order) = 次數(shù)(Degree) + 1?
- 3.7.B樣條曲線的特點(diǎn)
- 3.8.B樣條曲線的歷史
- 4.B樣條曲線的矩陣表達(dá)式及在SLAM中的應(yīng)用
- 4.1.均勻B樣條的矩陣表達(dá)式
- 4.2.均勻B樣條表示李群空間的矩陣表達(dá)式
- 4.3.B樣條曲線用于SLAM的軌跡表示
0.參考
貝塞爾(Bezier)曲線與B樣條:這個(gè)視頻講的很好,尤其是對(duì)樣條曲線的兩種理解方式上,會(huì)對(duì)后面B樣條曲線性質(zhì)的分析有很大的幫助。本文在前面的部分也會(huì)較多的參考這個(gè)視頻中講解的內(nèi)容。但是視頻后面講解B樣條曲線的時(shí)候稍微簡(jiǎn)略了一點(diǎn),因此本文給出我自己的理解。
1.問(wèn)題起源與插值法的曲線擬合
1.1.問(wèn)題起源
樣條曲線起源于一個(gè)常見(jiàn)問(wèn)題,即已知若干點(diǎn)的條件下,如何得到通過(guò)這些點(diǎn)的一條光滑曲線?
一個(gè)簡(jiǎn)答的方法是對(duì)曲線進(jìn)行 插值:在原有數(shù)據(jù)點(diǎn)上進(jìn)行填充生成曲線,曲線必經(jīng)過(guò)原有數(shù)據(jù)點(diǎn)。
1.2.拉格朗日插值
當(dāng)有多個(gè)點(diǎn)的時(shí)候,可以使用拉格朗日插值法得到插值的曲線函數(shù)表達(dá)式:
其中每個(gè)函數(shù) LkL_kLk?稱為拉格朗日插值基函數(shù)。注意這個(gè)基的概念,對(duì)于后面理解貝塞爾曲線和B樣條曲線非常有幫助。
1.3.“基”的概念
我們之前學(xué)過(guò)的知識(shí)中,有很多地方用到了 基 的概念,比如下面的內(nèi)容:
- 線性代數(shù):向量的線性組合就是在對(duì)向量空間的基向量給不同的權(quán)重相加,然后得到新的向量。
- 微積分:Taylor展式,Fourier級(jí)數(shù):他們都是有基函數(shù),然后最終我們的函數(shù)是由很多這種基函數(shù)組成的
- Lagrange插值法:一組基的線性組合:前面剛剛提到,我們插值得到的函數(shù)其實(shí)是由一組基函數(shù)組合來(lái)的。
1.4.插值存在的Runge現(xiàn)象
插值存在一些問(wèn)題,比如Runge現(xiàn)象。這是因?yàn)椴逯狄蟛逯岛瘮?shù)必須經(jīng)過(guò)所有的插值點(diǎn),導(dǎo)致非線性程度很嚴(yán)重。
為了解決這個(gè)問(wèn)題,并且考慮到人們往往想要一個(gè)比較光滑的曲線,而并不要求曲線通過(guò)所有點(diǎn),所以擬合就產(chǎn)生了。
2.貝塞爾曲線
2.1.控制點(diǎn)的思想
一個(gè)簡(jiǎn)單且行之有效的方法是,把這些點(diǎn)作為限制點(diǎn),然后在這些限制點(diǎn)中放置一條具有彈性的金屬片,最后金屬片繞過(guò)這些點(diǎn)后的最終狀態(tài)即為所需曲線。而最終得到的形狀曲線,就是樣條曲線。這也是該名字的由來(lái),其中金屬片就是樣條,形成的曲線就是樣條曲線。
注意:上圖中的藍(lán)色圓形可以變的很大,這樣生成的樣條曲線就離圓心很遠(yuǎn)了,所以就是明顯不通過(guò)這些圓心點(diǎn)的。如果把圓的半徑縮小成0,那么結(jié)果就變成插值了。
2.2.由控制點(diǎn)生成貝塞爾曲線
步驟如下:
- 先由前2個(gè)控制點(diǎn),按照 ttt 的比例生成一個(gè)中間過(guò)程點(diǎn) PiP_iPi?
Pi=(1?t)P0+P1P_i = (1-t) P_0 + P_1Pi?=(1?t)P0?+P1? - 再由后2個(gè)控制點(diǎn),按照 ttt 的比例生成一個(gè)中間過(guò)程點(diǎn) PjP_jPj?
Pj=(1?t)P1+P2P_j = (1-t) P_1 + P_2Pj?=(1?t)P1?+P2? - 對(duì)兩個(gè)中間過(guò)程點(diǎn),按照 ttt 的比例生成最后我們要的曲線上的一個(gè)點(diǎn) PxP_xPx?。
Px=(1?t)Pi+PjP_x = (1-t)P_i + P_jPx?=(1?t)Pi?+Pj?
最后,通過(guò)遍歷所有的比例值 t∈[0,1]t \in [0, 1]t∈[0,1],我們就可以得到貝塞爾曲線上的所有點(diǎn),也就是得到了整條貝塞爾曲線。
如果控制點(diǎn)的個(gè)數(shù)比3個(gè)多呢?那么就要不斷重復(fù)上面2個(gè)點(diǎn)生成1個(gè)中間點(diǎn)的過(guò)程,直到最后只剩下一個(gè)點(diǎn),這個(gè)點(diǎn)就是曲線上的點(diǎn)。所以當(dāng)有多個(gè)控制點(diǎn)的時(shí)候,只需要對(duì)上面的過(guò)程進(jìn)行多次,最后得到一個(gè)曲線上的點(diǎn)PxP_xPx?,然后改變比例ttt,就得到整條貝塞爾曲線了。
2.3.多個(gè)控制點(diǎn)時(shí)的貝塞爾曲線公式
重要:對(duì)貝塞爾曲線公式的兩種理解:
- 從 基 是 基函數(shù) 的角度理解:貝塞爾曲線前面的權(quán)重WWW就是插值基函數(shù),它是和ttt有關(guān)的函數(shù),所以他是有次數(shù)的,比如下圖所示的就是關(guān)于ttt為3次的基函數(shù)。后面的點(diǎn)PPP就相當(dāng)于插值點(diǎn),也就是給基函數(shù)的權(quán)重。但是貝塞爾曲線和拉爾朗日插值的不同之處在于,貝塞爾曲線的結(jié)果并不全都通過(guò)這些插值點(diǎn)。
也就是說(shuō),這種理解方式,基 是 基函數(shù),也就是關(guān)于ttt的一些函數(shù),而 權(quán)重 則是這些 控制點(diǎn)。
這種理解方式就是微積分的理解方式,也就是泰勒展開(kāi)、級(jí)數(shù)的理解方式,因?yàn)樽罱K我們的曲線是可以用一個(gè)函數(shù)表示的,而這個(gè)函數(shù)是由 基函數(shù) 施加不同的 權(quán)重 得到的,而這個(gè)權(quán)重就是各個(gè)控制點(diǎn)的坐標(biāo)值。
2. 從 基 是 控制點(diǎn) 的角度理解:
也就是說(shuō),這種理解方式,基 是 基向量,也就是控制點(diǎn);而 權(quán)重 則是關(guān)于 ttt的一些函數(shù),對(duì)于任意一個(gè) ttt確定了之后,我們就可以把函數(shù)值算出來(lái),就得到了一個(gè)具體的權(quán)重值。然后把權(quán)重值施加到控制點(diǎn)上,我們就得到了曲線上的一個(gè)具體的點(diǎn)。
這種理解方式就是線性代數(shù)的理解方式,也就是對(duì)向量空間的基向量進(jìn)行線性組合的理解方式。這里相當(dāng)于把整個(gè)曲線分成一個(gè)個(gè)的點(diǎn)來(lái)看,對(duì)于每一個(gè)點(diǎn)來(lái)說(shuō),它對(duì)應(yīng)著一個(gè)確定的ttt值,這個(gè)確定的ttt值帶入函數(shù)WWW里面就可以得到確定的權(quán)重。然后利用這個(gè)確定的權(quán)重對(duì)控制點(diǎn)進(jìn)行線性組合,就得到了曲線上的一個(gè)點(diǎn)。最后遍歷所有的ttt值,我們就得到了曲線上的所有點(diǎn),也就是得到了整條貝塞爾曲線。
2.4.貝塞爾曲線的遞推公式
其實(shí)這個(gè)很簡(jiǎn)單,因?yàn)榍懊嫖覀冎v解多個(gè)控制點(diǎn)的貝塞爾曲線的具體做法時(shí),其實(shí)就是按照遞推的公式來(lái)講解的它的思路,只不過(guò)是寫(xiě)成最終的公式的時(shí)候我們可以寫(xiě)出一個(gè)最終的結(jié)果。而遞推公式就是描述了一步步求中間點(diǎn)的過(guò)程。
2.5.貝塞爾曲線的性質(zhì)
- Bezier曲線是BSpline的特例
- 曲線總是通過(guò)第一個(gè)和最后一個(gè)點(diǎn)
- 曲線在始點(diǎn)處的切線落在前兩個(gè)控制的連線上,曲線在終點(diǎn)處的切線落在最后兩個(gè)控制點(diǎn)的連線上
- 改變其中任何一個(gè)點(diǎn),整條曲線都會(huì)隨之改變。這個(gè)很容易發(fā)現(xiàn),以為如果從 基 是 基函數(shù) 的角度來(lái)看就會(huì)發(fā)現(xiàn),每個(gè)基函數(shù)的定義域都是 t∈[0,1]t \in [0, 1]t∈[0,1]。所以一個(gè)控制點(diǎn)改變了之后,它會(huì)影響整個(gè)曲線中這個(gè)控制點(diǎn)對(duì)應(yīng)的 基函數(shù) 的函數(shù)值分量,從而導(dǎo)致整條曲線從頭到尾都會(huì)受到影響。
- 貝塞爾曲線冪次 = 控制點(diǎn)個(gè)數(shù) - 1。 對(duì)于一條復(fù)雜的曲線,如果使用一個(gè)貝塞爾曲線來(lái)插值獲得目標(biāo)曲線,就需要通過(guò)增加控制點(diǎn)來(lái)進(jìn)行插值,需要的計(jì)算也越復(fù)雜。冪次的問(wèn)題很好理解,因?yàn)槊可梢粋€(gè)中間點(diǎn)冪次就上升一次。
因此對(duì)于復(fù)雜曲線,不要求用n-1次曲線,而是讓次數(shù)低一點(diǎn),經(jīng)常使用三次貝塞爾曲線一段一段地拼接成目標(biāo)曲線,如Ps 或 Ai 中使用鋼筆工具畫(huà)出物體輪廓所做的那樣。 如果使用這種方法,確保最終整體曲線一次光滑的條件是在連接點(diǎn)出兩側(cè)的斜率相等,即連接點(diǎn)和其兩側(cè)控制點(diǎn)共線。
3.B樣條曲線
3.1.B樣條曲線的基本概念
生成曲線,本質(zhì)上就是找一組基函數(shù),然后用各個(gè)控制點(diǎn)當(dāng)權(quán)重進(jìn)行線性組合。或者理解為把控制點(diǎn)作為基向量,然后用函數(shù)當(dāng)權(quán)重,給定一個(gè)ttt帶入函數(shù)中就得到一個(gè)具體的權(quán)重值,然后就可以得到曲線上一個(gè)點(diǎn),最后遍歷所有的比例ttt就可以得到曲線上的所有點(diǎn)。
下面給出B樣條曲線的一些基本概念,然后后面再給出詳細(xì)的解釋。
舉例說(shuō)明如下:
3.2.對(duì)B樣條的疑問(wèn)
前面的概念中,不太清楚的就是 控制點(diǎn)(Control Points) 和 節(jié)點(diǎn)(Knots) 這兩個(gè)概念。而且前面的講解中一開(kāi)始說(shuō)了節(jié)點(diǎn)的個(gè)數(shù)和控制點(diǎn)無(wú)關(guān),是自己選取的;但是后面又說(shuō)控制點(diǎn)和節(jié)點(diǎn)的個(gè)數(shù)必須要滿足的關(guān)系是 m=n+k+1m = n+k+1m=n+k+1,這個(gè)屬實(shí)有點(diǎn)讓人疑惑。
另外一個(gè)讓人不太清楚的就是 次(Degree) 和 階(Order) 的區(qū)別,實(shí)際上 階數(shù) = 次數(shù) + 1。
直接解釋這兩個(gè)問(wèn)題是無(wú)法解釋的,因?yàn)檫@個(gè)必須從B樣條的原理觸發(fā),當(dāng)明白了B樣條的原理,自然就可以明白為什么B樣條中除了控制點(diǎn)還會(huì)有節(jié)點(diǎn),然后才可以推導(dǎo)前面的兩個(gè)關(guān)系式。
3.3.B樣條遞推公式的過(guò)程
我們直接從最終的遞推形式的kkk次B樣條基函數(shù)出發(fā),來(lái)解釋B樣條的思想。所以這里我們把曲線的樣條擬合問(wèn)題變成了對(duì) 基函數(shù) 的線性組合問(wèn)題,線性組合的權(quán)重變成了各個(gè)點(diǎn)的坐標(biāo)值。
有了控制點(diǎn),為什么還要使用節(jié)點(diǎn)呢?貝塞爾曲線只用控制點(diǎn)就可以了啊?其實(shí)這個(gè)就是為了改進(jìn)貝塞爾曲線只有全局特性、沒(méi)有局部特性的問(wèn)題,也就是貝塞爾曲線只要修改了一個(gè)控制點(diǎn)之后,即使基函數(shù)不變,整個(gè)曲線也都會(huì)被修改,因?yàn)樗幕瘮?shù)的定義域是在t∈[0,1]t \in [0, 1]t∈[0,1] 的整個(gè)區(qū)間上的。而B(niǎo)樣條加入節(jié)點(diǎn),目的就是為了給擬合的曲線增加局部性,從而實(shí)現(xiàn)改變一個(gè)控制點(diǎn)只會(huì)影響整個(gè)擬合曲線的一部分,而不會(huì)影響整個(gè)曲線。而實(shí)現(xiàn)的關(guān)鍵就是插入節(jié)點(diǎn),讓控制點(diǎn)只能作用到部分節(jié)點(diǎn)區(qū)間上,而不會(huì)作用到整個(gè)節(jié)點(diǎn)區(qū)間上。
貝塞爾曲線的基函數(shù)區(qū)間定義域是在t∈[0,1]t \in [0, 1]t∈[0,1] 的,B樣條曲線就在這個(gè)區(qū)間上插入很多節(jié)點(diǎn),從而把整個(gè)區(qū)間分成很多小的區(qū)間。如下圖所示,假設(shè)我把區(qū)間[0,1][0, 1][0,1]分成8個(gè)子區(qū)間,那么我要插入8+1=98+1=98+1=9個(gè)節(jié)點(diǎn),假設(shè)他們的序號(hào)分別是0?80-80?8。
根據(jù)前面B樣條曲線的遞推公式(這個(gè)公式為什么是這樣大家就不要追究了,這種結(jié)論大佬發(fā)現(xiàn)了直接用就行了):
可以發(fā)現(xiàn),在這些節(jié)點(diǎn)區(qū)間內(nèi)的基函數(shù)都是0次的,也就是他們?cè)诟髯缘膮^(qū)間內(nèi)都是1,不在自己區(qū)間范圍內(nèi)的都是0,并且這個(gè)取值和ttt是無(wú)關(guān)的,所以這個(gè)區(qū)間內(nèi)的基函數(shù)都是0次的,如下圖所示。注意圖中的Bi,0B_{i, 0}Bi,0?表示的就是當(dāng)前的樣條基函數(shù)都是0次的,然后iii表示的是哪個(gè)區(qū)間的樣條基函數(shù),因?yàn)槲覀冇?個(gè)點(diǎn),所以有8個(gè)樣條基函數(shù),注意下圖中的索引都是從0開(kāi)始的。
那么B樣條曲線的遞推公式就是在說(shuō):可以使用兩個(gè)相鄰的小區(qū)間組成一個(gè)大區(qū)間,同時(shí)基函數(shù)次數(shù)增加1。如下圖所示,最開(kāi)始的子區(qū)間里面的B樣條函數(shù)都是0次的,而由于B樣條的遞推公式中組合兩個(gè)相鄰區(qū)間的時(shí)候前面的系數(shù)是帶有 ttt 的,而且一個(gè)是ttt,另一個(gè)是1?t1-t1?t(實(shí)際公式不是這樣,但是也大概是這個(gè)思想)。所以組合了兩個(gè)區(qū)間之后,在這個(gè)新的區(qū)間中的基函數(shù)就變成1次的了。同理新區(qū)間中的樣條基函數(shù)Bi,1B_i,1Bi?,1表示樣條基函數(shù)都是1次的,而iii表示它的哪個(gè)區(qū)間的樣條基函數(shù)。
注意:
- 圖中為了方便畫(huà)圖,合并之后的區(qū)間和之前的區(qū)間長(zhǎng)度畫(huà)成一樣大的了,實(shí)際上合并之后的區(qū)間長(zhǎng)度應(yīng)該是翻倍的。
- 另外圖中也是為了方便表示出兩個(gè)區(qū)間合成一個(gè)區(qū)間的結(jié)果,把區(qū)間畫(huà)的而有點(diǎn)問(wèn)題了。實(shí)際上由于第0和第1個(gè)區(qū)間合成新的區(qū)間0,第1和第2個(gè)區(qū)間合成新的區(qū)間1,那么新的區(qū)間0和1之間應(yīng)該是有一般重疊的,但是圖中沒(méi)有把重疊畫(huà)出來(lái),因?yàn)楫?huà)出來(lái)的話就太亂了。如果是正常有重疊的區(qū)間的話,那么此時(shí)新的區(qū)間的基函數(shù)應(yīng)該就是像下圖這樣也有重疊:
那么如此不斷的用B樣條的遞推公式合并相鄰的兩個(gè)區(qū)間的話,可以發(fā)現(xiàn)區(qū)間個(gè)數(shù)越來(lái)越少,但是區(qū)間上的樣條基函數(shù)的次數(shù)會(huì)越來(lái)越高,如下圖所示:
假設(shè)我們進(jìn)行3次這樣的區(qū)間合并,最終我們得到的每個(gè)區(qū)間上的樣條基函數(shù)就是3次的,整個(gè)過(guò)程如下:
另外也可以看參考視頻的講解中作者給出的PPT,其實(shí)也是在表達(dá)這個(gè) 區(qū)間合并、基函數(shù)次數(shù)遞增 的過(guò)程:
以上就是B樣條曲線的遞推公式表示的過(guò)程,可以發(fā)現(xiàn)其實(shí)和前面貝塞爾曲線遞推的過(guò)程是非常像的,其實(shí)都是用相鄰的兩個(gè)點(diǎn)組合成一個(gè)新的中間點(diǎn),然后再用相鄰的兩個(gè)中間點(diǎn)組合成一個(gè)更新的中間點(diǎn),如此迭代……
3.4.B樣條引入節(jié)點(diǎn)帶來(lái)的好處——局部性
我們看之前的圖,最終我們得到了5個(gè)B樣條的基函數(shù),并且每個(gè)基函數(shù)都是3次的。由B樣條的公式可以發(fā)現(xiàn),最終我們也需要5個(gè)控制點(diǎn)來(lái)控制樣條曲線,因?yàn)榭刂泣c(diǎn)的個(gè)數(shù)和基函數(shù)的個(gè)數(shù)是一樣的,因?yàn)榭刂泣c(diǎn)就是權(quán)重,有幾個(gè)基函數(shù)肯定就要有幾個(gè)權(quán)重嘛。
那么我們來(lái)分析一下,第0個(gè)控制點(diǎn)P0P_0P0?它作用到了幾個(gè)最初的節(jié)點(diǎn)區(qū)間上呢?如下圖所示,可以發(fā)現(xiàn)它之作用到了前4個(gè)區(qū)間上。也就是說(shuō),如果改變控制點(diǎn)P0P_0P0?,最終只會(huì)影響在區(qū)間0?40-40?4之間的B樣條曲線,而不會(huì)影響它后面的B樣條曲線,這就是B樣條曲線引入控制點(diǎn)之后帶來(lái)的好處——擬合的曲線具有局部性!不會(huì)由于一個(gè)控制點(diǎn)的改變而導(dǎo)致?tīng)恳话l(fā)而動(dòng)全身!
3.5.為什么 m = n + k + 1 ?
首先再次定義以上變量的意思:
- mmm:節(jié)點(diǎn)的個(gè)數(shù)-1,也就是節(jié)點(diǎn)的個(gè)數(shù)=m+1,或者說(shuō)mmm是節(jié)點(diǎn)區(qū)間的個(gè)數(shù)。比如在上圖中,節(jié)點(diǎn)的個(gè)數(shù)為9,則m=8m=8m=8;
- nnn:控制點(diǎn)的個(gè)數(shù)-1,也就是控制點(diǎn)的個(gè)數(shù)=n+1,或者說(shuō)nnn是控制點(diǎn)區(qū)間的個(gè)數(shù)。比如在上圖中,控制點(diǎn)的個(gè)數(shù)為5,則n=4n=4n=4。注意:最后的時(shí)候區(qū)間是5個(gè),表示控制點(diǎn)個(gè)數(shù)就是5個(gè),因?yàn)槊總€(gè)控制點(diǎn)是作用在一個(gè)區(qū)間上的;而在節(jié)點(diǎn)的那個(gè)地方區(qū)間是8個(gè),而節(jié)點(diǎn)數(shù)是9個(gè)!
- kkk:基函數(shù)的次數(shù),也就是合并區(qū)間的最后得到的基函數(shù)的次數(shù);
那么為什么 m=n+k+1m=n+k+1m=n+k+1呢?其實(shí)從上面合并區(qū)間的過(guò)程中就可以看出來(lái),每合并一次,基函數(shù)的次數(shù)上升一次,區(qū)間的個(gè)數(shù)就減少一次。
- 一開(kāi)始是時(shí)候區(qū)間的個(gè)數(shù)就是mmm。
- 最后區(qū)間的個(gè)數(shù)是n+1n+1n+1。注意不是nnn,最終的區(qū)間個(gè)數(shù)就是控制點(diǎn)的個(gè)數(shù),因?yàn)橐粋€(gè)控制點(diǎn)對(duì)應(yīng)一個(gè)區(qū)間的基函數(shù)。
- 一共合并了kkk次區(qū)間,所以有m?k=n+1m-k = n+1m?k=n+1,因此得到m=n+k+1m = n+k+1m=n+k+1。
注意:既然有上面的公式,到底誰(shuí)是自變量,誰(shuí)是因變量?其實(shí)從寫(xiě)法就可以看出來(lái),nnn和kkk是自變量,而mmm是因變量。也就是說(shuō),控制點(diǎn)的個(gè)數(shù)n+1n+1n+1是自己事先確定的,基函數(shù)的次數(shù)kkk也是自己事先確定的,確定了這兩個(gè)之后,選擇幾個(gè)節(jié)點(diǎn)m+1m+1m+1也自然就確定了,因?yàn)?strong>這是由B樣條曲線的遞推公式?jīng)Q定的。
3.6.為什么 階數(shù)(Order) = 次數(shù)(Degree) + 1?
首先我們已經(jīng)明白了**次數(shù)(Degree)**的含義,它代表的是最終的基函數(shù)的次數(shù),也就是ttt的最高次冪。
那么 階數(shù)(Order) 有什么意義呢?以及為什么滿足 階(Order) = 次(Degree) + 1?
首先說(shuō)階數(shù)的物理意義:它其實(shí)反應(yīng)了當(dāng)前的點(diǎn)最多受到幾個(gè)控制點(diǎn)的控制,也就是如果是4階的B樣條曲線,那么一個(gè)點(diǎn)最多受到它周圍的4個(gè)控制點(diǎn)的控制。
前面我們已經(jīng)說(shuō)了,B樣條曲線具有局部性,而且分析了為什么具有局部性,本質(zhì)上是因?yàn)閰^(qū)間合并這種操作導(dǎo)致最終基函數(shù)所在的區(qū)間只能影響到整個(gè)節(jié)點(diǎn)區(qū)間的一部分,所以這個(gè)基函數(shù)對(duì)應(yīng)的權(quán)重(也就是控制點(diǎn))如果改變,也只會(huì)影響到最終擬合的這個(gè)區(qū)間的樣條曲線,而不會(huì)影響整個(gè)樣條曲線。
那么怎么分析的當(dāng)前的一個(gè)點(diǎn)最多受到幾個(gè)控制點(diǎn)的影響呢?其實(shí)也很簡(jiǎn)單,我們就分析每個(gè)控制點(diǎn)覆蓋的區(qū)間范圍,直到某個(gè)控制點(diǎn)和第0個(gè)控制點(diǎn)沒(méi)有重合的節(jié)點(diǎn)區(qū)間。
如下圖所示,節(jié)點(diǎn)區(qū)間0?10-10?1只受到控制點(diǎn)P0P_0P0?的影響;節(jié)點(diǎn)區(qū)間1?21-21?2會(huì)受到控制點(diǎn)P0P_0P0?、P1P_1P1?的影響;節(jié)點(diǎn)區(qū)間2?32-32?3會(huì)受到控制點(diǎn)P0P_0P0?、P1P_1P1?、P2P_2P2?的影響;節(jié)點(diǎn)區(qū)間3?43-43?4會(huì)受到控制點(diǎn)P0P_0P0?、P1P_1P1?、P2P_2P2?、P3P_3P3?的影響;而到了區(qū)間4?54-54?5的時(shí)候,此時(shí)前面的控制點(diǎn)P0P_0P0?已經(jīng)無(wú)法施加控制作用了,此時(shí)起作用的控制點(diǎn)是P1P_1P1?、P2P_2P2?、P3P_3P3?、P4P_4P4?。
所以可以發(fā)現(xiàn),一個(gè)節(jié)點(diǎn)區(qū)間最多受到幾個(gè)控制點(diǎn)的控制,和一個(gè)控制點(diǎn)可以控制幾個(gè)節(jié)點(diǎn)區(qū)間是一樣的!那么一個(gè)控制點(diǎn)可以控制幾個(gè)節(jié)點(diǎn)區(qū)間呢?顯然控制點(diǎn)自己就是一個(gè)區(qū)間,然后每往上走一次,控制點(diǎn)控制的節(jié)點(diǎn)區(qū)間個(gè)數(shù)就+1,所以最終一個(gè)控制點(diǎn)控制的節(jié)點(diǎn)區(qū)間個(gè)數(shù)就是 k+1 !所以說(shuō) 階數(shù) = 次數(shù) + 1。
可以看到就像一種滑窗的感覺(jué),如下圖所示:
- 一開(kāi)始的時(shí)候在節(jié)點(diǎn)區(qū)間開(kāi)頭,只有第0個(gè)控制點(diǎn)能發(fā)揮作用,滑窗長(zhǎng)度是1;
- 慢慢往后遍歷節(jié)點(diǎn)區(qū)間,發(fā)揮作用的控制點(diǎn)個(gè)數(shù)逐漸增加,滑窗長(zhǎng)度逐漸變大;
- 從滑動(dòng)到某個(gè)節(jié)點(diǎn)區(qū)間開(kāi)始,就只能有恒定個(gè)數(shù)的控制點(diǎn)發(fā)揮作用了,而不會(huì)一直增加,也就是滑窗開(kāi)始保持固定長(zhǎng)度,這個(gè)長(zhǎng)度就是B樣條曲線的 階數(shù)(Order) ;
- 快到達(dá)節(jié)點(diǎn)區(qū)間結(jié)尾的時(shí)候,發(fā)揮作用的控制點(diǎn)個(gè)數(shù)逐漸減少,滑窗長(zhǎng)度逐漸變小;
- 最后到達(dá)節(jié)點(diǎn)區(qū)間末尾,只有最后一個(gè)控制點(diǎn)能發(fā)揮作用,滑窗長(zhǎng)度又變成1。
另外從這個(gè)圖中也可以發(fā)現(xiàn),起始和最后的kkk個(gè)區(qū)間,也就是階數(shù)-1個(gè)區(qū)間,有效的控制點(diǎn)個(gè)數(shù)是不足的,所以一般來(lái)說(shuō)不使用前面的幾個(gè)節(jié)點(diǎn)區(qū)間,而使用有效控制點(diǎn)個(gè)數(shù)到達(dá)階數(shù)的那些區(qū)間,也就是從中間區(qū)間開(kāi)始使用。
3.7.B樣條曲線的特點(diǎn)
- 優(yōu)點(diǎn):和Bezier樣條一樣,B樣條也是通過(guò)逼近一組控制點(diǎn)來(lái)產(chǎn)生的。但是B樣條具有兩個(gè)Bezier樣條所不具備的特點(diǎn):
(1)B樣條多項(xiàng)式的次數(shù)可獨(dú)立于控制點(diǎn)數(shù)目(有一定限制);
(2)B樣條允許局部控制曲線或曲面。 - 缺點(diǎn):比Bezier樣條更復(fù)雜。
3.8.B樣條曲線的歷史
最后給出這個(gè)吧,其中前面的B樣條曲線的遞推公式就是de Boor-Cox公式,1972年就提出來(lái)了,真理經(jīng)久不衰啊……
- 均勻節(jié)點(diǎn)意義下的一元B樣條(B-splines,Basis Splines縮寫(xiě))是在1946年由I.J.Schoenberg提出
- 非均勻節(jié)點(diǎn)定義的B樣條由Curry在1947年提出
- 1962年,法國(guó)數(shù)學(xué)家Pierre Bézier研究了一種曲線,即Bézier曲線
- 1972年,de Boor與Cox分別獨(dú)立提出了計(jì)算B樣條基函數(shù)的公式,這個(gè)公式對(duì)B樣條作為計(jì)算機(jī)輔助幾何設(shè)計(jì)(CAGD)重要工具起到了至關(guān)重要的作用,稱之為de Boor-Cox公式。在此之前,計(jì)算B樣條基函數(shù)大多用差分方法計(jì)算,數(shù)值上可能不穩(wěn)定。
4.B樣條曲線的矩陣表達(dá)式及在SLAM中的應(yīng)用
參考:均勻B樣條曲線的表達(dá)式
4.1.均勻B樣條的矩陣表達(dá)式
注意:這個(gè)矩陣形式的推導(dǎo)可以不用關(guān)注,實(shí)際上是有公式的,在上面的參考博客中就有。只需要知道其中的自變量有ttt和控制點(diǎn)PPP即可。比如在SLAM中,位置樣條曲線P(t)P(t)P(t)對(duì)ttt求導(dǎo),得到的就是速度樣條曲線,再對(duì)ttt求導(dǎo)得到的就是加速度曲線。如果要優(yōu)化軌跡的時(shí)候,那么就是對(duì)控制點(diǎn)求導(dǎo)來(lái)有優(yōu)化軌跡。
4.2.均勻B樣條表示李群空間的矩陣表達(dá)式
4.3.B樣條曲線用于SLAM的軌跡表示