文章目錄
http://www.ae.metu.edu.tr/~ae464/splines.pdf
初步感受一下bezier曲線
bezier([5,10,15,20,25],[0 8 10 9 1])
function [X,Y]=bezier(x,y) %定義這個子函數,可以被main調用,這裏我們直接座標賦值
x=[5,10,15,20,25]
y=[0 8 10 9 1]
n=length(x); %獲取輸入的座標點的個數,例如:測試的X座標[5,10,15,20,25]爲作業要求4次曲線
t=linspace(0,1); % 改變式中的t值,則點就會在空間移動
xx=0; %初始化X
yy=0; %初始化Y
for k=0:n-1 %伯恩斯坦的一般形式,我們輸入了5個座標,因此是四次貝塞爾曲線
tmp=nchoosek(n-1,k)*t.^k.*(1-t).^(n-1-k); % nchoosek 來實現二項式係數或所有組合語法: C = nchoosek(n,k)
xx=xx+tmp*x(k+1); % X軸座標
yy=yy+tmp*y(k+1); % Y軸座標
end
if nargout==2 %輸出參數的個是爲2個時
X=xx;Y=yy;
end
h=plot(xx,yy); %畫四次貝塞爾曲線
hold on %保留本曲線
m=plot(x,y); %畫原始點
14.1 多項式曲線 Polynomial curves
一個常量,可由一個點唯一確定
一條直線,可由兩個點唯一確定
一條拋物線,可由三個點唯一確定
一條三次曲線,可由四個點唯一確定,並且它擁有一個拐點。
三次曲線是多項式曲線中擁有拐點的最高項次數最小的曲線。
拐點使它擁有非常有意義的作用,可以用它將多個點平滑地連接起來。
一條三次曲線,需要由四個係數的多項式來描述:
a+bx+cx2+dx3=y
a+bx+cx2+dx3=y
由已知的四個點,可以構造四個方程,解這四個方程即可求出四個係數。可由矩陣的逆運算得到:
Ma=y⇒a=M−1y
Ma=y⇒a=M−1y
矩陣運算使得用計算機求解非常容易。
邊界條件
兩個相鄰曲線段在公共邊界(控制點)處有相同的一階和二階導數,即自然三次樣條具有二階導數連續性
主要缺點
任意一個控制點發生了變動,則整條曲線都將受到影響。這樣,自然三次樣條不允許“局部控制”,因此不給出完整的新控制點集,則不可能構造麴線的一部分。
14.2 分段曲線Piecewise polynomial curves
複雜的曲線,可以由多個三次曲線連續起來成形。(得益於拐點)
於是我們可以將曲線以每兩點進行分段,分別求出兩點間的三次曲線。
爲了使這些三次曲線平滑地相連,我們約束連接點處必須是連續的,並且一次導數和二次導數都是連續的。於是通過兩個點和兩個約束,我們就有了四個方程,可解出該多項式的四個係數,同時保證它與相鄰的三次曲線是連續的。(由於起始端點和結束端點沒有導數,所以我們需要人工指定兩個斜率)
將多段曲線同時置入一個矩陣,即可一次性求出全部係數。
14.3 曲線參數化
到目前爲止,我們已經瞭解了控制點序列如何使用三次方函數定義控制點之間的曲線段並在段連接處執行各種連續性級別,從而定義分段多項式曲線。 特別:
•C0連續性,表示兩個線段匹配聯接處的值。
•C1連續性,表示它們與連接處的斜率匹配。
•C2連續性,表示它們與連接處的曲率匹配
上面的方法得到的都是基於x軸的曲線,這並不好用。我們希望每段曲線都通過參數t描述:
在示例中,兩條曲線是相同的,但是描述它們的方程式是不同的。 在右側的參數形式中,我們定義了參數t0,t1和t2,它們在控制點之間沿x軸移動時在0和1之間變化。 我們可以寫方程式:
關聯t的原始x座標。 導數表示每個t在我們沿x方向移動時有多快變化
Now we specify each curve segment by a parametric cubic curve
重要的是,這些量應在空間(即x)中而不是在參數座標中計算,因爲我們希望曲線在空間中平滑連接,而不是相對於我們的任意參數化而言
回顧之前的示例,我們沒有進行參數化,因此可以重寫所有方程式以及必須求解的最終線性系統。
這種方法的最大優勢在於,因爲我們已經知道所有係數的值,所以我們爲每個控制點從矩陣中減少了一行和一列。
一旦您瞭解了分段參數化的概念,其餘部分將以一種直接的方式進行。
14.4 平面曲線
將參數化後的曲線分別應用的兩個座標軸上,我們可以在2維平面上構造任意曲線!使其頭尾相連,可形成環。
樣條
分類方法
給定一組控制點,有兩種方式選取分段連續參數多項式函數:
插值樣條:曲線經過控制點。
逼近樣條:曲線不經過控制點。
所謂樣條曲線(Spline Curves)是指給定一組控制點而得到一條曲線,曲線的大致形狀由這些點予以控制,一般可分爲插值樣條和逼近樣條兩種,插值樣條通常用於數字化繪圖或動畫的設計,逼近樣條一般用來構造物體的表面。
14.5 插值方法Interpolation methods
樣條插值是一種工業設計中常用的、得到平滑曲線的一種插值方法,三次樣條又是其中用的較爲廣泛的一種
雖然多項式曲線已經這麼牛逼,但是它使用一個矩陣來計算整個曲線,所以當用戶調整其中的一個點的時候,會影響整個曲線的形狀。這對造形來說是一個災難,我們希望能夠局部修改曲線。
14.5.1 Hermite cubic splines插值樣條曲線
爲了實現這個需求,我們可以將多項式的兩個約束改爲用戶指定每個分段兩個端點的斜率,這樣就可以將單點變化的影響縮小到局部了。多項式曲線變成了 Hemiter 曲線。
Hermite插值不僅滿足在結點上與原函數相等,且各階導數也相等。
在分段低次插值時候,可以選擇分段線性插值和分段Hermite插值的方法,採用後者得到的結果即爲Hermite樣條。
與自然三次樣條不同,Hermite樣條可以局部調整,因爲每個曲線端僅依賴於端點約束。
主要缺點
只有當被插值函數在所有插值點處的函數值和導數都已知的前提下才能使用,而且在內節點處,其二階導數一般不連續。基於Hermite樣條的改進方法是Cardinal樣條和Kochenek-Bartels樣條。
14.5.2 Catmul-Rom splines插值樣條曲線(改良)
Hemiter 曲線要求用戶提供每個點的斜率,並不是那麼方便。 Catmul-Rom 提供了一種自動設置斜率的方法:每個點的斜率由前後兩個點決定。
ti=12(pi+1−pi−1)ti+1=12(pi+2−pi)
Cardinal樣條
類似於Hermite樣條,Cardinal樣條也是插值分段三次曲線,並且每條曲線的端點位置均指定切線。
與Hermite不同的是,Cardinal樣條不一定要給出端點的切線值。
在cardinal樣條中,一個控制點的斜率值可以由兩個相鄰控制點的座標進行計算。
14.5.3 Cardinal splines 樣條曲線(改良)
Cardinal 曲線爲 Catmul-Rom 的斜率生成提供了一個可選參數t。當t=0時,Cardinal 曲線即爲 Catmul-Rom 曲線。當 t>0 時,得到繃緊後的 Catmul-Rom 曲線。反之 t<0 時,得到松跨後的 Catmul-Rom 曲線。
ti=12(1−t)(pi+1−pi−1) ti+1=12(1−t)(pi+2−pi)
14.5.4 Kochanek-Bartels樣條
這是cardinal樣條的擴展。將兩個附加參數引入到約束方程中,可以得到Kochanek-Bartels樣條,從而爲調整曲線段形狀提供更多方便。需要注意的是,導數在線段邊界處不一定連續,因爲 本樣條的設計是爲了模擬動畫路徑,特別是當對象運動有突變時。
15.1 逼近樣條(該部分內容準確性待定)
15.2 Bezier樣條——逼近樣條
Bezier曲線是BSpline的特例,雖然它也是分段多項式,但是Bezier多項式的次數並不是三,而是由將逼近控制點數量及相關位置決定。
特性
- 曲線總是通過第一個和最後一個控制點;
- 曲線在始點處的切線落在前兩個控制的連線上,曲線在終點處的切線落在最後兩個控制點的連線上。
15.2 B樣條——逼近樣條
B樣條曲線會經過每個型值點(型值點vs控制點),但是不經過控制點,也即是說,型值點是B樣條曲線所經過的點,而控制點則是控制其形狀的點。
優點
- 和Bezier樣條一樣,B樣條也是通過逼近一組控制點來產生的。但是B樣條的具有兩個Bezier樣條所不具備的特點:
- B樣條多項式的次數可獨立於控制點數目(有一定限制);
- B樣條允許局部控制曲線或曲面。
缺點
- 缺點就是比Bezier樣條更復雜。
分類
- B樣條通常根據所選的節點向量類型進行描述,節點向量有三種分類:均勻的(uniform)、開放均勻的(open uniform)和非均勻的(nonuniform)。
15.3 Beta樣條——逼近樣條
B樣條是一般化的beta樣條,它是在beta樣條的一階和二階導數上加上幾何條件而形成的。
15.4 有理樣條(Rational Spline)
有理函數是兩個多項式之比,因此有理樣條是兩個樣條函數之比,例如有理B樣條。
有理樣條和非有理樣條比,有兩個重要的優點:
- 提供了二次曲線的精確表達式,如圓和橢圓,非有理樣條僅能逼近二次曲線;
- 對於透視變換是不會變化的。
其他
- 貝塞爾曲線
- Chaikin曲線
- 利薩茹曲線
它們各有特點:
- 貝塞爾曲線通過兩個端點和多個控制點來構造。插值容易,但端點處的斜率不容易控制,控制點牽一髮而動全身。
- Chaikin曲線通過直線邊來構造。用迭代法構造,幾乎不可能用於插值。
- 利薩茹曲線以不同相位和振幅的正弦函數來構造。位置由參數可直接獲得,可以用來做一些特效。
應用:在遊戲中,常常給定一些座標點,讓角色逐一通過。角色在運動的時候,沿着這些點平滑地移動。所以我們需要有一些方法能求出通過給點座標集合的曲線。
參考:
https://blog.csdn.net/while0/article/details/51513485
https://blog.csdn.net/weixin_34392435/article/details/86184081
http://blog.leanote.com/post/simon88/%E6%A0%B7%E6%9D%A1%E6%9B%B2%E7%BA%BF#title
教材:http://www.ae.metu.edu.tr/~ae464/splines.pdf