簡體   English   中英

如何從等值線生成 3-D 表面?

[英]How Do I Generate a 3-D Surface From Isolines?

我有一組等值線點(或輪廓點),例如:

在此處輸入圖片說明

等值線上的每個點都有其各自的 X、Y 和 Z 坐標。 由於它們是等值線,這意味着每個點將具有唯一的 XY 對,但同一條線上的點將具有相同的 Z 坐標。

現在,是否有任何算法或任何軟件包(在 C# 或 C++ 或 MATLAB 中)可用於將等值線點插入完整的 3-D 表面?

P/S:我不僅對最終輸出感興趣,我還對獲取插值表面數據感興趣,以便我可以自己繪制表面。

編輯:也歡迎 C++ 解決方案。

在MATLAB中您可以使用該功能griddataTriScatteredInterp(注:如R2013a的scatteredInterpolant是推薦的替代)。 這兩者都允許您將規則間隔的數據表面擬合到一組非均勻間隔的點(盡管在較新的 MATLAB 版本中似乎不再推薦使用griddata )。 以下是您可以如何使用每個:

  • griddata

     [XI,YI,ZI] = griddata(x,y,z,XI,YI)

    其中x,y,z每個代表每個點的笛卡爾坐標向量(在這種情況下是輪廓線上的點)。 行向量XI和列向量YIgriddata對擬合曲面的值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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM