1

我有一个关于在 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 参数必须是“双矩阵”。

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

4

1 回答 1

2

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

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

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

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

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

编辑:在看到您的评论后:如果您已经在使用 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--钢筋混凝土

于 2012-04-30T16:52:35.987 回答