在MATLAB中在人体点上绘制3D voronoi多面体

时间:2015-10-15 04:26:23

标签: matlab 3d sensor delaunay voronoi

我试图围绕放置在人体框架上的一组点(传感器位置的坐标)以3D绘制voronoi多面体。我在MATLAB中找到了几种方法。除了他们都没有给我正确的多面体。我理解3D中的voronoi对于一组点应该是这样的。

我期望图表如何: How I expected the graph to look like.

对于我的数据点集,voronoi多面体不会封装所有点。由我的数据点构成的voronoi多面体看起来像这样:

The voronoi polyhedrons that are formed out of my data points

我的数据集的坐标是:

X= [116,191,0;
    108,183,0;
    120,175,0;
    100,162,12;
    116,166,8;
    133,158,14;
    100,150,0;
    116,166,15;
    125,144,8;
    90,133,5;
    108,133,2.5;
    144,133,5;
    116,116,15;
    144,116,6.5;
    108,100,-5;
    150,100,15;
    83,100,15;
    108,83,14;
    100,58,13;
    133,50,13;
    100,25,11;
    133,30,12;
    100,8.3,14;
    133,8.3,14];

我使用链接(http://www.mathworks.com/help/matlab/math/voronoi-diagrams.html)中的代码在这些点上绘制voronoi,我得到如下错误:

Error using convhull
The coordinates of the input points must be finite values; Inf and NaN are not permitted.

Error in best3D_original (line 38)
K = convhull(XR10);

基本上,保持多边形顶点的向量V在第一行中具有Inf个值。即使我强行删除第一行,我也没有得到我要求的结果。代码如下所示:

dt = delaunayTriangulation(X);
figure
[V,R] = voronoiDiagram(dt);
tid = nearestNeighbor(dt,0,0,0);
XR10 = V(R{tid},:);
K = convhull(XR10);
K
defaultFaceColor  = [0.6875 0.8750 0.8984];
trisurf(K, XR10(:,1) ,XR10(:,2) ,XR10(:,3) , ...
        'FaceColor', defaultFaceColor, 'FaceAlpha',0.9)
title('3-D Voronoi Region')

我还尝试在另一个脚本中为同一组数据点分别添加补丁功能。代码看起来像这样:

 X=[x y z]; 
 [V,C]=voronoin(X); 
 for k=1:length(C) 
     disp(C{k}) 
 end 
 for k=2:length(C) 
     if all(C{k}~=1) 
        VertCell = V(C{k},:); 
                 KVert = convhulln(VertCell); 
                 patch('Vertices',VertCell,'Faces',KVert,'FaceColor','g','FaceAlpha',0.5); 
    end 
 end

2 个答案:

答案 0 :(得分:0)

我不确定发生了什么,但V的第一行只包含Inf个值,这就是导致错误进一步发生的原因。

dt = delaunayTriangulation(X);
figure
[V,R] = voronoiDiagram(dt);
V(1,:) = []; %// INTERESTING LINE, removes the Inf values
tid = nearestNeighbor(dt,0,0,0);
XR10 = V(R{tid},:);
K = convhull(XR10);
defaultFaceColor  = [0.6875 0.8750 0.8984];
trisurf(K, XR10(:,1) ,XR10(:,2) ,XR10(:,3) , ...
        'FaceColor', defaultFaceColor, 'FaceAlpha',0.9)
title('3-D Voronoi Region')

我得到以下情节:

enter image description here

答案 1 :(得分:0)

来自referenced documentation page

  

观察与凸壳上的点相关的Voronoi区域是无界的。

这就是为什么你看到的点没有被多面体包围的原因 - 没有任何Voronoi区域定义的有限多面体。

您期望看到的附加图像看起来像Voronoi图中的Voronoi区域与有限顶点的最小边界立方体的交点。使用内置的MATLAB函数进行计算并非易事,因为它们都没有提供Voronoi图中半无限元素方向的定义。由Voronoi图和立方体的交集定义的多面体可能包含由以下内容组成的顶点:

  • 相应Voronoi区域中的有限顶点
  • Voronoi区域中的半无限面与立方体中的边缘之间的交点
  • Voronoi区域中的半无限边与立方体中的面之间的交点
  • 由连接上述交叉点的边界包围的立方体的顶点

这是一个我不会尝试解决的具有挑战性的几何问题。您可以看到MATLAB使用基于三角测量的方法来计算使用edit voronoi的2D线到无穷大的方向 - 这可能提供有关如何在3D中生成相同内容的线索。