2015-10-15 422 views
0

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

我没有料到的图形看起来像: How I expected the graph to look like.

对于我的组数据点,沃罗诺伊多面体不封装所有的点。由我的数据点形成的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)关于这些点来绘制沃罗诺伊,我得到这样的错误:

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 

回答

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

+0

我尝试了类似于您的建议。如果使用plot3(X(:,1),X(:,2),X(:,3),'*');然后执行代码,所有的点都没有被这些多面体吞没。另外,如果仔细观察,似乎并不是围绕每个点都形成了voronoi多面体。我还想指出的是,将最近邻点指向中心点(116,166,15)的最多点比(0,0,0)多一点。但是,这仍然不能解决我的问题。 – Swathi

0

referenced documentation page

观察到,与凸包点相关联的Voronoi区是无限的。

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

您预期看到的附加图像看起来像是显示Voronoi图中Voronoi区域与Voronoi图中有限顶点的最小边界立方体的交点。使用MATLAB函数进行计算并不容易,因为它们都没有提供Voronoi图中半无限元方向的定义。多面体通过Voronoi图的交点定义和立方体可以包含包括顶点:在对应的Voronoi区

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

这是一个具有挑战性的几何问题,我不会试图解决。你可以看到MATLAB使用三角测量法计算2D线到无穷的方向,这可能提供了如何在3D中生成相同的线索。