【问题标题】:Matlab triangulate and plot cylindrical point cloud in 3DMatlab 三角剖分和绘制 3D 圆柱点云
【发布时间】:2012-05-10 08:26:39
【问题描述】:

我有一个关于在 Matlab 中绘制圆柱面的问题。我的数据集由X, Y, Z 坐标的点云和对应的强度值C 组成。

我可以使用scatter3 函数绘制它们:

figure
scatter3(X,Y,Z,8,C)

结果如下图:

但是,我想绘制这个对象的表面而不是点。我已经尝试使用 Delaunay 三角测量来实现这一目标

tri     = delaunay(X,Y);
figure
trisurf(tri,X,Y,Z,C,'FaceColor','interp')

Link to screenshots

正如您从图像中看到的那样,结果不是我想要的,因为三角测量存在困难。在我看来,该算法似乎无法很好地处理我多次获得相同的XY 坐标这一事实。

按照TriRep帮助页面上介绍的示例,我尝试使用以下方法:

dt = DelaunayTri(X,Y,Z);
tr = TriRep(dt, X, Y, Z);

可惜没有成功,因为我在调用 TriRep 函数时收到以下错误消息:

???使用 ==> TriRep 时出错 参数必须是“双矩阵”。

我想我必须限制我的几何形状,我想我通过使用freeBoundary 函数在Example 1 here 中找到了解决方案——尽管我确实需要TriRep 函数的输出来计算这个。这就是我卡住的地方。如您所见,我不是三角测量方法的专家,我非常感谢您提供的任何帮助。谢谢!

【问题讨论】:

    标签: matlab 3d plot triangulation delaunay


    【解决方案1】:

    我认为您想要的不是简单的三角剖分,而是您的一组点的凸包。

    2d 中凸包的经典类比 -
    如果您将一组点想象成板上的钉子,那么凸包就是通过在您的点周围拉伸橡皮筋形成的多边形 - 也就是说,它接触外部点但不接触内部点。

    扩展这一点,您可以将 3d 凸包视为点云中外部点的“皮肤”。

    凸包是更复杂的计算几何技术的起点,但在您的情况下,它会为您提供您正在寻找的网格。

    我没有用过 Matlab 的版本,但它看起来很简单: http://www.mathworks.com/help/techdoc/ref/convhulln.html

    编辑:在下面看到您的 cmets 后: 如果您已经在使用 TriRep 结构,则可以使用它来获取面法线,然后删除其面法线接近于直线向上/向下的任何三角形。例如,如果您从 Matlab 的 FaceNormals 文档页面 http://www.mathworks.com/help/techdoc/ref/trirep.facenormals.html 中的示例开始:

    numpts = 100;
    thetha = rand(numpts,1)*2*pi;
    phi = rand(numpts,1)*pi;
    x = cos(thetha).*sin(phi);
    y = sin(thetha).*sin(phi);
    z = cos(phi);
    dt = DelaunayTri(x,y,z);
    [tri Xb] = freeBoundary(dt);
    tr = TriRep(tri, Xb);
    P = incenters(tr);
    fn = faceNormals(tr);
    trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3), 'FaceColor', 'cyan', 'faceAlpha', 0.8);
    

    然后您可以简单地遍历法线,并删除任何具有高 z 幅度的面:

    for(i=196:-1:1)
        if(abs(fn(i,3))>0.8)
            tri(i)=[];
        end
    end
    trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3),'FaceColor','red','faceAlpha',0.7);
    

    HTH -- RC

    【讨论】:

    • 感谢您为我指明这个方向。我已经尝试过了,它看起来好多了,但仍然不是我想要的。目前曲面上的面太少,并且圆柱体的顶端和底端也是封闭的。我想到的是一个开放的圆柱体,侧壁上有尽可能多的小面,没有重叠。你知道我怎么能做到这一点吗?
    • 使用 T = delaunayn(X,{'Qt','Qc','Qx','Q4'});我能够得到一些非常接近我想要的新结果(毕竟我不会使用凸包,因为鉴于圆柱体不是完全凸的,这将省略点)。我现在的最后一个问题仍然是圆柱体的顶面和底面是封闭的。有没有办法在 delaunayn 中指定“最大三角测量距离”?如果我可以指定三角形面的最大长度,那么我可以轻松避免填充顶面和底面......
    • 请注意:for 循环向下运行而不是向上运行,因此您不必在删除行后弄乱索引。
    • 太棒了,感谢您的帮助。我认为这将完成这项工作!
    猜你喜欢
    • 2013-03-19
    • 2017-06-21
    • 2014-09-05
    • 2017-12-15
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多