网格/表面剪裁

时间:2014-06-27 22:21:55

标签: matlab mapping mesh surface

我正在使用Matlab中的一些南极DEM数据。所以,我已经能够使用以下基本代码生成漂亮的网格物体:

load (Data.xyz)
X = Data(:,1);
Y = Data(:,2);
Z = Data(:,3);
xr = unique(X);
yr = unique(Y);
gz = zeros(length(yr),length(xr));
gz = griddata(X,Y,Z,xr,yr');

figure
mesh(xr,yr,gz);
hold on
contour3(xr,yr,gz,'k-');
hold off

现在我有几个问题,尽管在过去的几天里一直在观看所有论坛并且日夜搜索谷歌,但我仍然无法回答这些问题。我希望你们所有的专家都能给我一些建议。我的问题是:

  1. 上面的代码需要花费很多时间。同意南极洲的DEM规模较大,代码响应时间慢并不一定意味着其不正确。但是,我完全无法在笔记本电脑上运行此代码(2.5 GHz / 4GB) - 它太慢了。我想知道是否有其他方法来生成更快更有效的网格。

  2. 第二个问题是上面的" Data.xyz"包含来自所有南极洲的DEM数据。生成网格后,我想根据位置剪切它。比方说,例如,我想提取由x1,y1,x2,y2,x3,y3和x4,y4限制的区域的网格数据。我该怎么做呢?我无法在任何地方找到合适的功能或工具或任何用户脚本,这样我就可以这样做。是否可以在matlab中剪切网格?

  3. 我正在运行Matlab 2012a,而且我无法访问映射工具箱。任何建议???

1 个答案:

答案 0 :(得分:0)

1.我想澄清一下你希望你的代码做什么。对于数据X,Y,Z,我认为这些是点(X,Y)(未在网格上采样),每个点与某个高程Z相关联。

致电时

gz = griddata(X,Y,Z,xr,yr');

您说的是,每个可能的对(xr(i),yr(j))都是网格上要对曲面进行采样以创建网格的位置。我可能错了,但我不认为这是你想要的? 我认为你宁愿在相等的间隔点进行采样,而是使用像...这样的东西。

xr = min(X):spacing:max(X);
yr = min(Y):spacing:max(Y);   
gz = griddata(X,Y,Z,xr,yr');  % ' is for the transpose
mesh(xr,yr,gz);

其中spacing是您数据规模的合理数字。你的代码现在的方式,你可能会采取比你想要的更多的样本,这可能是你的代码需要这么长时间的原因。

对于2.我认为你可以得到一个for循环,只需将感兴趣区域中的点添加到三个新的X,Y,Z值列表中。如果您的区域是x_left,x_righty_left,y_right ...

所围绕的矩形
Xnew = []; Ynew = []; Znew = [];
for i = 1:length(X)
  if ( x_left<X(i) )&&( X(i)<x_right )&&( y_left<Y(i) )&&( Y(i)<y_right )
    Xew = [Xnew, X(i)];
    Ynew = [Ynew, Y(i)];
    Znew = [Znew, Z(i)];
  end
end