如何从Isolines生成三维表面?

我有一组等值点(或等高点),例如:

alt text http://sofzh.miximages.com/c%23/triang&isolines example1.jpg

等值线上的每个点都有各自的X,Y和Z坐标。 由于它们是等值线,这意味着每个点将具有唯一的XY对,但同一条线上的点将具有相同的Z坐标。

现在,是否有任何算法或任何软件包(在C#或C ++或MATLAB中)可用于将等值线点插入完整的三维表面?

P / S:我不仅对最终输出感兴趣,我有兴趣获得插值表面数据,以便我可以自己绘制表面。

编辑:C ++解决方案也受到欢迎。

在MATLAB中,您可以使用函数griddataTriScatteredInterp类 (注意:从R2013a开始,scatInterpolant是推荐的替代方案)。 这两种方法都允许您将规则间隔数据的表面拟合到一组非均匀间隔点(尽管在较新的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

示例和比较

下面是一些示例代码以及它生成的结果图,用于使用上述两种方法从轮廓数据重建曲面。 使用contourfunction生成轮廓数据:

 % 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提供三个数组并绘制曲面。 这可能就是你要找的东西。