如何从等值线生成3D曲面?

10

我有一组等值线点(或轮廓点),如下所示:

enter image description here

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

现在,是否有任何算法或任何软件包(无论是C#、C++还是MATLAB),我可以使用它们将等值线点插值为完整的3D表面?

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

编辑:欢迎使用C ++解决方案。

4个回答

13
在MATLAB中,你可以使用函数griddata或者TriScatteredInterp(注意:从R2013a开始,scatteredInterpolant是推荐的替代品)。这两种方法都允许你将一组非均匀间距的点拟合到一个定期间隔的数据表面上(尽管看起来griddata在较新的MATLAB版本中不再推荐使用)。以下是如何使用它们的方法:
  • 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');
    

    enter image description here

    请注意,这两个结果之间几乎没有太大的差异(至少在这个尺度下)。另外要注意,在插值曲面的角附近由于轮廓数据稀疏而留有空区域。


3
你可以使用gridfit工具,在MATLAB中心文件交换中找到。我提供的示例之一正是您想要做的事情,从取自等值线的点列表开始,我重构了平滑曲面数据。实际上,我使用的示例是从地形图中获取的。

2
我想你要找的是“轮廓缝合”,例如在这篇论文中讨论过。请注意保留HTML标签,不做任何解释。

0
MATLAB有一个内置命令叫做SURF,它需要三个数组X、Y、Z并绘制一个曲面。这可能是你正在寻找的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接