计算Voronoi细胞面积

时间:2012-05-08 01:50:28

标签: matlab graph graph-algorithm 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]。这是无限的一点。我该如何绕过这个问题?

3 个答案:

答案 0 :(得分:4)

根据'voronoin'文档中的示例,v的第一个点始终是[Inf,Inf]。这是一个引用:

  

V的第一行是无穷远处的一个点。如果单元格中有任何索引   单元格数组为1,则相应的Voronoi单元格包含   V中的第一个点,无穷远处的一个点。这意味着Voronoi单元是   无界的。

如果你想在顶点v上使用'polyarea'而不获得NaN,那么我天真的答案就是在将第一行v输入'polyarea'之前将其切掉第一行:

 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 :(得分: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

答案 2 :(得分: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没有这个,你可以手动计算voronoi线和多边形边界线之间的交点,然后根据它计算一个新的多边形,然后从中计算面积。