计算 Voronoi 单元面积

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],这是一个无限远的点。我该如何解决这个问题?

3个回答

4
根据 'voronoin' 文档中的示例,v 的第一个点将始终为 [Inf, Inf]。下面是引用:
“V 的第一行是一个无限远处的点。如果单元格数组中的任何索引都是 1,则相应的 Voronoi 单元包含 V 中的第一个点,即一个无限远处的点。这意味着该 Voronoi 单元是无界的。”
如果要对顶点 v 使用 'polyarea' 而不获取 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 有多边形相交函数,那么应该很容易实现。一些相关的线程可能是:

多边形相交和并集

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

如果 Matlab 没有这个功能,您可以手动计算 Voronoi 线和多边形边界线之间的交点,然后基于此计算一个新的多边形,从中计算面积。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接