天天看點

b樣條曲面繪制 opengl_使用插值在matlab簡單繪制三維模組化!

Matlab是一門功能強大的語言,不過一直地位尴尬,不冷不熱。盡管很多學生都跟它打過交道,但大多淺嘗辄止,用完完事。

寫這篇文章緣于我昨天接了一張matlab的三維模型的外包,出圖的時候用了插值算法。在與同學朋友交流的過程中,我發現身邊的很多大佬都不了解matlab裡的這個很實用的插值指令。關于這方面,網絡上也沒有講的很詳細的文章,這才鬥膽來置喙。

1.什麼是插值:

學過離散數學的人應該都知道插值的定義。這裡簡單地介紹一下插值的概念:

在離散資料的基礎上補插連續函數,使得這條連續曲線通過全部給定的離散資料點。(百 度百科定義)

· 用一個簡單的方式講:

插值方法可以将給定的一些孤立資料點拟合成一個完整的函數。

插值實作的方法很多,例如多項式(牛頓插值),埃爾米特,樣條插值,高斯三角插值,分段插值等。如果對插值有興趣又不想太深入了解,可以僅搜尋一下牛頓插值的推理。

2.Matlab的interp2指令:

interp是matlab自帶的插值函數,我們将用這個函數來畫我們的三維模型。使用時候可以自己定義想要以實作插值的方式。interp1是對一維資料的插值,本文隻講述針對二維資料的插值指令interp2。

Interp2官方文檔介紹(截取):

Vq = interp2(X,Y,V,Xq,Yq) interpolates to find Vq, the values of theunderlying 2-D function V at the query points in matrices Xq and Yq.

Matrices X and Y specify the points at which the data V is given.Xq can be a row vector, in which case it specifies a matrix with constant columns. Similarly, Yq can be a column vector and it specifies a matrix with constant rows.

百度翻譯:

vq=interp2(x,y,v,xq,yq)插值以查找vq,即矩陣xq和yq中查詢點處底層二維函數v的值。

矩陣x和y指定給資料v的點。xq可以是行向量,在這種情況下,它指定一個具有常量列的矩陣。類似地,yq可以是列向量,它指定一個具有常量行的矩陣。

簡單地加以解釋一下,interp2函數中的五個參數,前兩個參數分别存儲已知插值點的兩個坐标,第三個參數是插值點的資料。後兩個參數是預測點,傳回的是預測點在拟合插值函數上的資料。

Interp2被重載過多次,調用方法也很多,有興趣者可自行搜尋官方文檔。上述僅為較常用一例,下文執行個體示範時也是使用的這個範式。

3.執行個體示範:

以一個模拟平闆表面溫度模型執行個體為例:

程式:

b樣條曲面繪制 opengl_使用插值在matlab簡單繪制三維模組化!

(截圖中interp2函數的第六個參數是對插值方法的選擇,interp2提供了最近鄰插值(nearest),雙線性插值(linear),樣條曲線插值(spline),雙三次插值(cubic)五種插值方法以供選擇)

效果圖:

原始資料圖檔(溫度值用随機函數生成)

b樣條曲面繪制 opengl_使用插值在matlab簡單繪制三維模組化!

樣條插值:

b樣條曲面繪制 opengl_使用插值在matlab簡單繪制三維模組化!

雙線性插值:

b樣條曲面繪制 opengl_使用插值在matlab簡單繪制三維模組化!

最近鄰插值:

b樣條曲面繪制 opengl_使用插值在matlab簡單繪制三維模組化!

(由于每次程式運作都會随機生成一次新的溫度初始值,是以插值圖案起伏規律有所不同。)

4.延伸:

有了這個插值的方法,我們就可以使用同一個程式模闆。隻需要改變插值點的數值就能在matlab中簡單地畫出三維模型!

也許有時候插值點太少精度會不夠,或是插值點過多,圖像變得粗糙不平。但如果你需要根據某圖繪制出一個相似的形狀時,這仍然不失為一個好用的畫三維模型圖的方法!

以下我随手畫了兩張()

b樣條曲面繪制 opengl_使用插值在matlab簡單繪制三維模組化!
b樣條曲面繪制 opengl_使用插值在matlab簡單繪制三維模組化!

以上就是全部内容。

每次都是在社群中看大佬的文章(),第一次寫文章回饋社群,多有疏漏歡迎指正!

2019.10.10 十文字冰糖