4

我正在尝试计算 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

3 回答 3

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

但是,如果这不是您所说的“不工作”,那么也许您可以详细说明您期望看到的内容?

于 2012-05-08T05:20:30.913 回答
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
于 2013-10-24T15:53:53.837 回答
0

您需要定义您感兴趣的空间的边界。例如,如果您在 voronoi 细胞周围绘制一个正方形,根据您的正方形的大小,细胞将具有不同的区域。

Voronoi 分区本身不能设置单元的外部边界。

如果Matlab有多边形相交功能,那么应该很容易做到。一些相关的线程可能是:

多边形的交集和并集

计算图像和多边形之间重叠的简单方法是什么?

如果 Matlab 没有这个,你可以手动计算 voronoi 线和多边形边界线之间的交点,然后根据它计算一个新的多边形,然后从中计算面积。

于 2015-06-01T21:03:50.203 回答