我有一个关于在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')
从图像中可以看出结果不是我想要的,因为三角测量存在困难。对我而言,似乎该算法无法很好地应对我多次获得相同X
和Y
坐标的事实。
按照TriRep
帮助页面上介绍的示例,我尝试使用以下方法:
dt = DelaunayTri(X,Y,Z);
tr = TriRep(dt, X, Y, Z);
唉,没有成功,因为我在调用TriRep
函数时收到以下错误消息:
???使用==>时出错TriRep 参数必须是'双矩阵'。
我想我必须约束我的几何体,我认为我使用freeBoundary
函数在Example 1 here中找到了解决方案 - 尽管我确实需要TriRep
函数的输出顺序计算这个。这就是我被困的地方。正如您所看到的,我不是三角测量方法的专家,我非常感谢您提供的任何帮助。谢谢!
答案 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