[英]How Do I Generate a 3-D Surface From Isolines?
在MATLAB中您可以使用該功能griddata
或TriScatteredInterp
類(注:如R2013a的scatteredInterpolant
是推薦的替代)。 這兩者都允許您將規則間隔的數據表面擬合到一組非均勻間隔的點(盡管在較新的 MATLAB 版本中似乎不再推薦使用griddata
)。 以下是您可以如何使用每個:
griddata
:
[XI,YI,ZI] = griddata(x,y,z,XI,YI)
其中x,y,z
每個代表每個點的笛卡爾坐標向量(在這種情況下是輪廓線上的點)。 行向量XI
和列向量YI
是griddata
對擬合曲面的值ZI
進行插值的笛卡爾坐標。 為矩陣XI,YI
返回的新值與將XI,YI
傳遞給meshgrid
以創建均勻點網格的結果相同。
TriScatteredInterp
類:
[XI,YI] = meshgrid(...); F = TriScatteredInterp(x(:),y(:),z(:)); ZI = F(XI,YI);
其中x,y,z
再次表示每個點的笛卡爾坐標向量,只是這次我使用了冒號整形操作(:)
來確保每個都是列向量( TriScatteredInterp
所需的格式)。 然后使用必須使用meshgrid
創建的矩陣XI,YI
評估插值F
這是一些示例代碼和它生成的結果圖,用於使用上述兩種方法從輪廓數據重建表面。 輪廓數據是用contour
函數生成的:
% First plot:
subplot(2,2,1);
[X,Y,Z] = peaks; % Create a surface
surf(X,Y,Z);
axis([-3 3 -3 3 -8 9]);
title('Original');
% Second plot:
subplot(2,2,2);
[C,h] = contour(X,Y,Z); % Create the contours
title('Contour map');
% Format the coordinate data for the contours:
Xc = [];
Yc = [];
Zc = [];
index = 1;
while index < size(C,2)
Xc = [Xc C(1,(index+1):(index+C(2,index)))];
Yc = [Yc C(2,(index+1):(index+C(2,index)))];
Zc = [Zc C(1,index).*ones(1,C(2,index))];
index = index+1+C(2,index);
end
% Third plot:
subplot(2,2,3);
[XI,YI] = meshgrid(linspace(-3,3,21)); % Generate a uniform grid
ZI = griddata(Xc,Yc,Zc,XI,YI); % Interpolate surface
surf(XI,YI,ZI);
axis([-3 3 -3 3 -8 9]);
title('GRIDDATA reconstruction');
% Fourth plot:
subplot(2,2,4);
F = TriScatteredInterp(Xc(:),Yc(:),Zc(:)); % Generate interpolant
ZIF = F(XI,YI); % Evaluate interpolant
surf(XI,YI,ZIF);
axis([-3 3 -3 3 -8 9]);
title('TriScatteredInterp reconstruction');
請注意,這兩個結果之間幾乎沒有區別(至少在這個范圍內)。 還要注意,由於這些點的輪廓數據的稀疏性,插值表面在拐角附近有空白區域。
您可以使用 MATLAB Central 文件交換中的gridfit工具。 我給出的示例之一正是您想要做的,從從等值線中獲取的點列表開始,我從數據中重建了一個平滑的表面。 實際上,我使用的示例取自地形圖。
我認為你想要的是“輪廓拼接”,例如在本文中討論
MATLAB 有一個名為SURF的內置命令,它采用 X、Y、Z 的三個數組並繪制曲面。 這可能就是你要找的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.