【Matlab】離散點擬合曲面


Matlab中可以使用interp函數和griddata函數來實現插值,從而得到擬合曲面

  • 從曲面上采樣
  • 離散點擬合曲面

1.離散點采樣

為了獲取離散點,首先需要從某個特定的曲面上采樣。
其中利用數學的方法,就是先生成采樣曲線的x-y坐標,並根據曲面方程獲取對應的z值;

%我們以螺旋采樣為例
%構建采樣的坐標點x-y
theta = 0:0.025*pi:10*pi;
r7 = 0 + 0.1*theta;
x = r7.*cos(theta)+3;
y = r7.*sin(theta)+3;plot(x,y,'.')
[X,Y] = meshgrid(x,y);
%在對應曲面方程上采樣
Z = rand*(sin(X+rand*2*pi)+sin(Y+rand*2*pi));
surf(X,Y,Z);shading interp
figure
z = diag(Z);    %對應x,y坐標點處的z
plot3(x,y,z,'.b')

原曲面與采樣點雲
在這里插入圖片描述在這里插入圖片描述

另一種則是利用柵格與插值的方法來獲取對應的z值:

%Based surface
x0 = linspace(0,2*pi,128);
y0 = linspace(0,2*pi,128);
[X0,Y0] = meshgrid(x0,y0);
Z0= rand*(sin(X0+rand*2*pi)+sin(Y0+rand*2*pi));

%而后生成采樣柵格
theta = 0:0.025*pi:10*pi;
r7 = 0 + 0.1*theta;
x = r7.*cos(theta)+3;
y = r7.*sin(theta)+3;plot(x,y,'.')
[X,Y] = meshgrid(x,y);

%此處用重新插值的方法獲得采樣點的坐標
%相當與在原圖上做了重新的插值,查到了螺旋線柵格化后的點
Z = interp2(X0,Y0,Z0,X,Y);  
surf(X,Y,Z);shading interp
figure
z = diag(Z);    %對應x,y坐標點處的z
plot3(x,y,z,'.b')

此時的曲面和采集到的點雲如下:
在這里插入圖片描述在這里插入圖片描述

2.曲面擬合

在有了點雲之后,需要將x-y-z數據變成柵格化數據才能夠調用mesh,surf等函數繪制圖形。

%目標曲面的大小,需要先生成一個柵格
%一般與點雲大小相當
xn = linspace(0,2*pi,128);
yn = linspace(0,2*pi,128);
[Xn,Yn] = meshgrid(xn,yn);

%利用griddata來插值,從xyz生成柵格數據
%最后一個為插值方法,包linear cubic natural nearest和v4等方法
%v4方法耗時長但較為准確
Zn = griddata(x,y,z,Xn,Yn,'v4'); 

surf(Xn,Yn,Zn);shading interp
figure
mesh(Xn,Yn,Zn)
hold on
plot3(x,y,z,'r+','MarkerSize',3)

擬合出的曲面結果,以及包含采樣點的mesh圖:
在這里插入圖片描述在這里插入圖片描述


ref:
https://blog.csdn.net/u012302488/article/details/51201238
https://blog.csdn.net/shanchuan2012/article/details/72772191
http://muchong.com/html/201106/3290808.html

在這里插入圖片描述
pic from pexels.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM