我正在尝试计算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]。这是无穷大中的一个点。如何绕过此问题?
根据 'voronoin' 文档中的示例,v 的第一点将始终是 [Inf, Inf]。这是一句话:
V 的第一行是无穷远处的点。如果单元格中的任何索引 单元格数组为 1,则相应的 Voronoi 单元格包含 V 中的第一个点,无穷远处的点。这意味着沃罗诺伊细胞是 无限。
如果你想在顶点 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
但是,如果这不是你所说的"不工作"的意思,那么也许你可以详细说明你期望看到的内容?
避免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
您需要定义您感兴趣的空间的边界。例如,如果您在 voronoi 单元格周围绘制一个正方形,则根据正方形的大小,单元格将具有不同的区域。
Voronoi 分区本身不能在单元格上设置外部边界。
如果 Matlab 具有多边形交集函数,那么它应该很容易做到。一些相关的线程可能是:
多边形的交集和并集
计算图像和多边形之间重叠的简单方法是什么?
如果 Matlab 没有此功能,您可以手动计算 voronoi 线与多边形边界线之间的交点,然后基于此计算一个新多边形,然后从中计算面积。