2012-05-08 187 views
4

我想計算每個Voronoi細胞在matlab中的面積,但我被卡住了。我在網上找到這個代碼:計算Voronoi細胞區域

[v , c] = voronoin(sdata); 
for i = 1 : size(c ,1) 
    ind = c{i}'; 
    tess_area(i,1) = polyarea(v(ind,1) , v(ind,2)); 
end 

這段代碼不起作用,因爲v中的一個點是[Inf,Inf]。這是無限的一點。我怎樣才能繞過這個問題?

回答

4

根據'voronoin'文檔中的例子,v的第一個點總是[Inf,Inf]。這是一個報價:

V的第一行是無窮遠處的一個點。如果單元格中的任何索引的單元格數組爲1,則相應的Voronoi單元格包含V中的第一個點,即無窮遠處的一個點。這意味着Voronoi單元格是無限的 。

如果你想使用「polyarea」上的頂點v在未得到NaN的然後我天真的回答是輸入成「polyarea」之前砍掉V的第一行:

sdata = [ 0.5 0 
     0  0.5 
    -0.5 -0.5 
    -0.2 -0.1 
    -0.1 0.1 
     0.1 -0.1 
     0.1 0.1 ] 
[v , c] = voronoin(sdata); 
for i = 1 : size(c ,1) 
    ind = c{i}'; 
    tess_area(i,1) = polyarea(v(2:end,1), v(2:end,2)) 
end 

但如果這不是「不工作」的意思,那麼也許你可以詳細說明你期望看到什麼?

1

這樣可以避免NaN的事情:

 [ v, c] = voronoin (sdata); 
     tess_area=zeros(size(c,1),1); 

     for i = 1 : size(c ,1) 
      ind = c{i}'; 
     if ind~=1 
      tess_area(i,1) = polyarea(v(ind,1) , v(ind,2)); 
     end 
     end 
0

你需要定義一個你有興趣在空間的邊界。例如,如果你畫一個正方形環繞你的Voronoi單元中,根據大小你的廣場,細胞將有不同的領域。

Voronoi分區本身不能設置單元格的外邊界。

如果Matlab有一個多邊形相交函數,那麼它應該很容易做到。一些相關的主題可能是:

intersection and union of polygons

What is an simple way to compute the overlap between an image and a polygon?

如果Matlab的沒有這個,你可以手動計算沃羅諾伊線和您的多邊形的邊界線之間的交點,然後計算基於此的新多邊形,然後計算該區域。