【问题标题】:Plotting a surface from a set of interior 3D scatter points in MATLAB在 MATLAB 中从一组内部 3D 散点绘制曲面
【发布时间】:2014-08-11 11:19:28
【问题描述】:

我有一大组(约 60,000 个)代表 x、y 和 z 坐标的三元组数据点,它们分散在笛卡尔体积中。

我正在寻找一种方法来使用 Matlab 来可视化由点的最大范围描述的非凸形状/体积。

我当然可以使用scatter3 来可视化各个点,但是考虑到大量的点,形状的细节会被点的噪声所掩盖。

打个比方,假设您在沙漏中装满了随机大小的球体,例如 BB、乒乓球和 kix,然后得到每个对象的中心坐标。您将如何获取这些坐标并可视化包含它们的沙漏的形状?

我的示例使用不同大小的对象,因为数据点之间的间距不均匀且实际上是随机的;它使用沙漏,因为形状是非凸的。

【问题讨论】:

    标签: matlab 3d data-visualization


    【解决方案1】:

    如果包围点的表面可以描述为convex polyhedron(即像立方体的表面或dodecahedron,没有凹坑或jagged pointy parts),那么我将首先创建一个3-D Delaunay triangulation 的点数。这将使用一系列以点为顶点的四面体元素填充点周围的体积,然后您可以使用DelaunayTriconvexHull 方法找到形成体积外壳的三角形面集类。

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

    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');
    

    【讨论】:

    • 我没有最新版本的 Matlab,但能够找到相同功能的基本等效版本。不幸的是我的表面不是凸的,所以上面的方法掩盖了一些重要的细节。我将修改我的问题以澄清这一点。
    【解决方案2】:

    您可以将数据视为来自 3D 概率密度的样本,并在网格上估计该密度,例如通过 3d 直方图,或者更好的 3d kernel density estimator。然后应用阈值并使用isosurface 提取表面。

    不幸的是,统计工具箱中包含的hist3(尽管它的名称)只是一个二维直方图,而ksdensity 仅适用于一维数据,因此您必须自己实现 3d 版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多