2015-10-15 111 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中生成相同的線索。