1. 程式人生 > >(27)三次插值樣條曲線

(27)三次插值樣條曲線

三次插值樣條曲線在靈活性和計算速度之間進行了合理的折中。與更高次樣條相比,三次插值樣條只需較少的計算和儲存,且較穩定。與二次插值樣條相比,三次插值樣條在模擬任意形狀時顯得更靈活。

三次插值樣條曲線由分段的三次多項式來描述。設其參變數為t,則分段三次插值樣條曲線表示式的一般形式為:

             P(t) = B1 + B2t + B3t2 + B4t3     (0≤t≤tm)           (4-13)

其中,P(ti) = [x(ti)  y(ti)  z(ti)]可以看作三次插值樣條曲線上某一點的位置向量,ti是該點的參變數,x(ti)、y(ti)、z(ti)可以看作是該點的座標值。

式(4-13)中的B1、B2、B3、B4為四個待定係數。必須確定這四個係數,這需要設定四個獨立條件。

n+1個型值點產生n 段曲線,每段曲線都需要確定四個係數。確定係數的不同方法導致不同的三次插值樣條曲線:

三次自然樣條曲線
Hermite樣條曲線
Cardinal樣條曲線

三次自然樣條曲線 

三次自然樣條曲線是最早用於圖形應用的三次插值樣條曲線。

 三次自然樣條曲線具有C2連續性。

  n+1個型值點(P0、P1、P2……Pn)插值產生n段曲線,每段曲線有4個係數,共有4n個多項式係數需要確定。

4n個多項式係數的確定:
①  對於每個內型值點(P1、P2……Pn-1,共n-1個)有4個邊界條件:在該型值點兩側的兩個相鄰曲線段在該點處具有相同的一階和二階導數,並且兩個曲線段都要通過該點。——4(n-1)個方程
②  曲線起點為第一個型值點P0,曲線終點為最後一個型值點Pn。——2個方程
③  在P0 和 Pn兩點處設二階導數為0。——2個方程

三次自然樣條曲線能夠做到曲線通過所有型值點。
 缺點:
① 必須解方程組。
② 整條曲線受所有型值點控制,如果型值點中有任何一個改動,則整條曲線都受影響。因此,不允許“區域性控制”。
③ 在實際應用中很少採用三次自然樣條曲線。 

Hermite樣條曲線 

Hermite樣條曲線是以法國數學家Charles Hermite命名的,它是一個分段三次多項式,並且在每個型值點處有給定的切線。
與三次自然樣條曲線不同,Hermite樣條曲線可以區域性調整,因為每個曲線段僅依賴於端點約束。
整條曲線通過所有的型值點,對於每個曲線段來說,它通過兩個相鄰的型值點。
Hermite樣條曲線段的確定:
 已知:設曲線段的起點和終點分別為P0和P1,並且曲線段在兩端點處的切向量分別為P'0和P'1。參變數t是在兩個端點取值0和1之間變化。
                   
對於每個三次曲線段,有了四個獨立條件:兩個端點的位置向量以及曲線段在兩端點處的切向量。根據這四個條件可以得到方程組,求出分段表示式(4-13)中的四個係數: 

P0 = B1 + B2t + B3t2 + B4t3 = B1                   (當t=0)

P1 = B1 + B2t + B3t2 + B4t3 = B1 + B2+ B3 + B4         (當t=1)

P'0 = B2 + 2B3t + 3B4t2 = B2                      (當t=0)   (4-14)

P'1 = B2 + 2B3t + 3B4t2 = B2 + 2B3 + 3B4             (當t=1)

式(4-14)寫成矩陣形式:

           

求解上述方程組中的B1、B2、B3、B4,可得Hermite樣條曲線的矩陣表示式:

       

將式(4-16)展開,得到第k段Hermite樣條曲線的表示式:

  P(t) = Pk(2t3-3t2+1) + Pk+1(-2t3+3t2) + Pk'(t3-2t2+t) + Pk+1'(t3-t2)       (4-17)

Hermite樣條曲線能區域性修改,對某些數字化應用有用。但對計算機圖形學中的大部分問題而言,除了型值點座標外,更好的做法是不需要輸入曲線斜率值或其它幾何資訊就能生成樣條曲線。因此,出現了Cardinal樣條,它不需要輸入控制點上的曲線導數值,而是採用控制點的座標位置來計算導數。 

Cardinal樣條曲線

Cardinal樣條曲線也是分段三次插值曲線,並且每個曲線段端點處均指定切線,但不一定要給出端點處的切線值。
一個Cardinal樣條曲線段由四個連續控制點給出。中間兩個控制點是曲線段的端點,另外兩個控制點用來計算端點斜率。 

設P(t)是兩個控制點Pk和Pk+1間的引數三次函式式,則從Pk-1到Pk+2間的4個控制點用於建立Cardinal樣條曲線段的邊界條件: 

                     

                      P0 = Pk

                      P1 = Pk+1

                      P'0 = 1/2(1- ts)(Pk+1- Pk-1)           (4-18)

                      P'1 = 1/2(1- ts)(Pk+2- Pk

控制點Pk和Pk+1處的斜率分別與弦Pk-1Pk+1和PkPk+2成正比。

引數ts:稱為張力引數,它控制Cardinal樣條曲線與輸入控制點之間的鬆緊程度。

                  

張力引數 ts 在Cardinal曲線形狀中的作用:

                 

以將邊界條件式(4-18)轉換成矩陣形式: 

       

其中,s = (1-ts)/2。

將矩陣形式(4-19)展開,得Cardinal樣條曲線多項式形式:

P(t) = Pk-1(-st3 + 2st2 - st) + Pk[(2-s)t3 + (s-3)t2 + 1] +

          Pk+1[(s-2)t3 + (3-2s)t2 + st] + Pk+2(st3 - st2)             (4-20) 

相關推薦

27曲線

三次插值樣條曲線在靈活性和計算速度之間進行了合理的折中。與更高次樣條相比,三次插值樣條只需較少的計算和儲存,且較穩定。與二次插值樣條相比,三次插值樣條在模擬任意形狀時顯得更靈活。 三次插值樣條曲線由

影象演算法:最近鄰,雙線性

最近在複習影象演算法,對於一些簡單的影象演算法進行一個程式碼實現,由於找工作比較忙,具體原理後期補上,先上程式碼。今天先給出最近鄰插值,雙線性插值,三次插值。 1.最近鄰插值 原始圖中影響點數為1 (1)程式碼 # include<iostream>

BiCubic

                     雙三次插值(BiCubic插值 ) 雙三次插值又稱立方卷積插值。三次卷積插值是一種更加複雜的插值方式。該演算法利用待取樣點周圍16個點的灰度值作三次插值,不僅考慮到4 個直接相鄰點的灰度影響,而且考慮到各鄰點間灰度值變化率的影響。三

Matlab 演算法最鄰近、雙線性、雙

1、最鄰近元法 這是最簡單的一種插值方法,不需要計算,在待求象素的四鄰象素中,將距離待求象素最近的鄰象素灰度賦給待求象素。設i+u, j+v(i, j為正整數, u, v為大於零小於1的小數,下同)為待求象素座標,則待求象素灰度的值 f(i+u, j+v) 如下圖所示:

影象-雙線性與雙

在現實生活中,我們經常會遇到把影象進行放大、幾何空間變換的情況等等,這些操作都需要在源影象和目標影象之間建立一個對映規則,使得兩影象畫素座標之間建立起一種對應關係,從而為目標影象的每一個畫素賦值。 從源影象到目標影象的對映叫前向對映,但是這種對映方法可能會出現這樣的兩個問題

數字影象縮放之雙

基本原理:雙三次插值是一種更加複雜的插值方式,它能創造出比雙線性插值更平滑的影象邊緣。縮放後圖像中某個象素的象素值是由源影象相應畫素附近的(4 x 4)個鄰近象素值計算出來的,即通過一個基函式進行擬合得到一個目的畫素值,具體某點v(x,y) 的畫素值是使用下式計算得到:

雙線性和雙

線性插值先講一下線性插值:已知資料 (x0, y0) 與 (x1, y1),要計算 [x0, x1] 區間內某一位置 x 在直線上的y值(反過來也是一樣,略):y−y0x−x0=y1−y0x1−x0y=x1−xx1−x0y0+x−x0x1−x0y1上面比較好理解吧,仔細看就是

Lanczos,最鄰近,雙線性二

本文為轉載,原部落格地址:http://blog.csdn.net/trent1985/article/details/45150677 [研究內容] 目前比較常用的幾種插值演算法 [正文] 目前比較常用的插值演算法有這麼幾種:最鄰近插值,雙線性二次插值,三次插值, Lan

影象縮放之雙

今天學習了第三種影象縮放的方法,雙三次插值法。由於理解能力比較差,看了好久的公式,還是雲裡霧裡,但是為了督促自己學習,還是把已知的部分記錄下來。 數學原理 假設源影象A大小為m*n,縮放後的目標影象B的大小為M*N。那麼根據比例我們可以得到B(X,Y)在

【影象縮放】雙立方卷積Android版改寫

最近在做圖片放大之後的畫面處理,嘗試了這種卷積插值法,原文如下:https://dailc.github.io/2017/11/01/imageprocess_bicubicinterpolation.html 然後我將其工程簡單地改寫成了Android版本的程式碼(只是個Demo,用來看看效果

一維最優化:二Quadratic interpolation method

理論見參考《Practical Optimization》中4.5節,程式碼實現如下:( 可以將黃金分割法和二次插值法結合起來,想用黃金分割法快速搜尋得到最優解,然後用該最優解作為二次插值的初值,可以提高計算精度。Matlab中就是採用此組合策略。 ) OneDimensi

Opencv 曲線(Cubic Spline)

1.樣條曲線簡介 樣條曲線(Spline)本質是分段多項式實函式,在實數範圍內有:S:[a,b]→R,在區間[a,b]上包含k個子區間[ti−1,ti],且有: a=t0<t1<⋯<tk−1<tk=b(1) 對應每一段區

5.27:cocos2d-x初探學習筆記2--重要概念及Test例結構(轉)

這樣的 發生 菜單 add css 基礎 dsm 人的 添加 1.幾個重要概念 在cocos2d引擎中,有幾個概念,各自是導演。場景,布景和人物角色。 導演(CCDirector):在cocos2d-x引擎中,導演類是遊戲的組織者和領導者。導演制定規則讓遊戲內的場

教你寫Http框架——例帶你深入理解AsyncTask

func implement oncreate 其它 層疊 worker dcl 例如 人員 這個標題大家不要奇怪,扯Http框架怎麽扯到AsyncTask去了,有兩個原因:首先是Http框架除了核心http理論外。其技術實現核心也是線程池 + 模板 +

day8讀取檔案登陸,檔案操作

# -*- coding:utf-8 -*- # write by Paul name = input('請輸入您要建立的使用者名稱:') password = input('請輸入您要建立的密碼:') with open('log.txt', mode="w",encoding='UTF-8') as

猜數字小遊戲+折半查詢法二分法+密碼輸入+字母大小寫轉換

猜數字小遊戲: #include<stdio.h> #include<time.h> #include<stdlib.h> /* 猜數字小遊戲 */ int menu() { printf("**********1.開始遊戲**********\n

TCP 握手與四揮手?解釋一下握手與四揮手

TCP 三次握手與四次揮手?(解釋一下三次握手與四次揮手) 三次握手建立連線 1)  主機A傳送一個SYN段到主機B告訴B想要連線的主機埠,以及初始的序列號(ISN:x)(報文段1) 2) 主機B應答,伺服器發回包含B的初始序號的SYN報文段(報文段

TCP/IP的特性一握手&四揮手

    TCP與UDP的對比:      TCP/IP中有兩個具有代表性的傳輸協議,他們分別是TCP和UDP。TCP提供可靠的通訊傳輸,而UDP則常被用於廣播和細節控制交給應用的通訊傳輸。那他們有何異同呢? &nbs

bzoj3453: tyvj 1858 XLkxc拉格朗日

傳送門 \(f(n)=\sum_{i=1}^ni^k\),這是自然數冪次和,是一個以\(n\)為自變數的\(k+1\)次多項式 \(g(n)=\sum_{i=1}^nf(i)\),因為這東西差分之後是\(f\),所以這是一個\(k+2\)次多項式 同理最後我們要求的也是一個\(k+3\)次多項式 \(

P3270 [JLOI2016]成績比較拉格朗日

傳送門 挺神仙的啊…… 設\(f[i][j]\)為考慮前\(i\)門課程,有\(j\)個人被\(B\)爺碾壓的方案數,那麼轉移為\[f[i][j]=\sum_{k=j}^{n-1}f[i-1][k]\times {k \choose k-j}\times {n-1-k \choose r[i]-1-(k-