MATLAB中如何从一组内部3D散点绘制表面

9
我有一个大约60,000个三元组数据点的集合,表示分散在笛卡尔体积中的x、y和z坐标。
我想使用Matlab来可视化由这些点的最大范围描述的非凸形状/体积。
当然,我可以使用scatter3来可视化单个点,但是由于点的噪声,细节会被遮蔽。
类比一下,假设你用不同大小的球填充了一个沙漏,例如BB弹、乒乓球和kix,并且给出了每个对象的中心坐标。你如何利用这些坐标来可视化包含它们的沙漏形状?
我的例子使用不同大小的对象,因为数据点之间的间距是非均匀的,实际上是随机的;它使用沙漏,因为形状是非凸的。
2个回答

12
如果您的点所包围的表面可以描述为凸多面体(即像立方体或十二面体的表面一样,没有凹陷的坑或尖锐的棱角部分),那么我会先创建一个点的三维Delaunay三角剖分。这将使用点作为顶点填充点周围的体积,并且您可以使用DelaunayTri类的convexHull方法找到形成体积外壳的三角形面集。

以下是一个示例,它在单位立方体内生成200个均匀分布的随机点,为这些点创建四面体网格,然后找到该体积的三维凸壳:

interiorPoints = rand(200,3);      %# Generate 200 3-D points
DT = DelaunayTri(interiorPoints);  %# Create the tetrahedral mesh
hullFacets = convexHull(DT);       %# Find the facets of the convex hull

%# Plot the scattered points:
subplot(2,2,1);
scatter3(interiorPoints(:,1),interiorPoints(:,2),interiorPoints(:,3),'.');
axis equal;
title('Interior points');

%# Plot the tetrahedral mesh:
subplot(2,2,2);
tetramesh(DT);
axis equal;
title('Tetrahedral mesh');

%# Plot the 3-D convex hull:
subplot(2,2,3);
trisurf(hullFacets,DT.X(:,1),DT.X(:,2),DT.X(:,3),'FaceColor','c')
axis equal;
title('Convex hull');

enter image description here


我没有最新版本的Matlab,但是我能够找到基本等效的同样功能的版本。不幸的是,我的表面不是凸面,因此上述方法掩盖了一些重要细节。我将修改我的问题以澄清这一点。 - Adam Wuerl

1
你可以将数据视为三维概率密度的样本,并在网格上估计该密度,例如通过3D直方图或更好的3D 核密度估计。然后应用阈值并使用isosurface提取表面。
不幸的是,在统计工具箱中包含的hist3(尽管其名称如此)仅为2D直方图,而ksdensity仅适用于1D数据,因此您需要自己实现3D版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接