【问题标题】:Interpolate surface of 3D cylinder in Matlab在 Matlab 中插值 3D 圆柱的表面
【发布时间】:2023-03-07 00:40:01
【问题描述】:

我有一个描述 3D 圆柱点云的数据集 (xx,yy,zz,C):

我想从这个数据集中制作一个表面图,类似于这个

为了做到这一点,我想我可以使用 TriScatteredInterp 将分散的数据插入到常规网格上,然后使用 surf 绘制它:

F = TriScatteredInterp(xx,yy,zz);
max_x = max(xx); min_x = min(xx);
max_y = max(yy); min_y = min(yy);
max_z = max(zz); min_z = min(zz);
xi = min_x:abs(stepSize):max_x;
yi = min_y:abs(stepSize):max_y;
zi = min_z:abs(stepSize):max_z;
[qx,qy] = meshgrid(xi,yi);
qz = F(qx,qy);
F = TriScatteredInterp(xx,yy,C);
qc = F(qx,qy);

figure
surf(qx,qy,qz,qc);
axis image

这对于凸面和凹面物体非常有效,但对于圆柱体则以这种方式结束:

谁能帮我实现一个更好的情节?

【问题讨论】:

    标签: matlab 3d matlab-figure


    【解决方案1】:

    我认为您正在寻找的是 Convex hull 函数。请参阅其文档。

    K = convhull(X,Y,Z) 返回点 (X,Y,Z) 的 3-D 凸包, 其中 X、Y 和 Z 是列向量。 K 是三角剖分 表示凸包的边界。 K 的大小为 mtri-by-3, 其中 mtri 是三角形面的数量。即K的每一行 是根据点索引定义的三角形。

    2D 示例

    xx = -1:.05:1; yy = abs(sqrt(xx));
    [x,y] = pol2cart(xx,yy);
    k = convhull(x,y);
    plot(x(k),y(k),'r-',x,y,'b+')
    

    使用 plot 以二维方式绘制 convhull 的输出。使用 trisurf 或 trimesh 绘制 convhull 的 3-D 输出。

    【讨论】:

      【解决方案2】:

      您尝试过 Delaunay 三角测量吗?

      http://www.mathworks.com/help/matlab/ref/delaunay.html

      load seamount
      tri = delaunay(x,y);
      trisurf(tri,x,y,z);
      

      还有TriScatteredInterp

      http://www.mathworks.com/help/matlab/ref/triscatteredinterp.html

      ti = -2:.25:2;
      [qx,qy] = meshgrid(ti,ti);
      qz = F(qx,qy);
      mesh(qx,qy,qz);
      hold on;
      plot3(x,y,z,'o');
      

      【讨论】:

        【解决方案3】:

        TriScatteredInterp 适用于拟合 z = f(x,y) 形式的二维曲面,其中 f 是单值函数。像你一样适合点云是行不通的。

        由于您处理的是圆柱体,本质上是一个 2D 表面,如果您转换为极坐标,您仍然可以使用 TriScatterdInterp,例如,将半径作为角度和高度的函数来拟合 - 某事喜欢:

        % convert to polar coordinates:
        theta = atan2(yy,xx);
        h = zz;
        r = sqrt(xx.^2+yy.^2);
        
        % fit radius as a function of theta and h
        RFit = TriScatteredInterp(theta(:),h(:),r(:));
        
        % define interpolation points
        stepSize = 0.1;
        ti = min(theta):abs(stepSize):max(theta);
        hi = min(h):abs(stepSize):max(h);
        [qx,qy] = meshgrid(ti,hi);
        % find r values at points:
        rfit = reshape(RFit(qx(:),qy(:)),size(qx));
        % plot
        surf(rfit.*cos(qx),rfit.*sin(qx),qy)
        

        【讨论】:

          【解决方案4】:

          圆柱体是与一条直线等距的所有点的集合。所以你知道你的xxyyzz 数据有一个共同点,那就是它们都应该与对称线等距。您可以使用它来生成一个新的圆柱体(在本例中,对称线取 z 轴):

          % best-fitting radius 
          % NOTE: only works if z-axis is cylinder's line of symmetry
          R = mean( sqrt(xx.^2+yy.^2) );
          
          % generate some cylinder
          [x y z] = cylinder(ones(numel(xx),1));
          
          % adjust z-range and set best-fitting radius
          z = z * (max(zz(:))-min(zz(:))) + min(zz(:));
          x=x*R;
          y=y*R;
          
          % plot cylinder
          surf(x,y,z)
          

          【讨论】:

          • 很抱歉,但这并不是我所追求的。我不想安装一个新的圆柱体,而是想根据测量的点云绘制一个表面。我之前尝试过三角测量,但这对我来说并没有产生完全正确的结果,因为我的许多数据点不再出现在地图上。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-10
          • 2015-04-01
          • 2011-02-10
          相关资源
          最近更新 更多