Matlab在3D中对三角形圆柱点云进行三角测量和绘制

时间:2012-04-30 16:24:20

标签: matlab 3d plot triangulation delaunay

我有一个关于在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函数的输出顺序计算这个。这就是我被困的地方。正如您所看到的,我不是三角测量方法的专家,我非常感谢您提供的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

我认为你想要的不是一个简单的三角测量,而是你的一组点的凸包。

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

延伸此项,您可以将三维凸包视为点云中外部点的“皮肤”。

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

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

编辑:看到以下评论后: 如果您已经在使用TriRep结构,则可以使用它来获取面法线,然后删除其面部法线接近直线向上/向下的任何三角形。 EG,如果你从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