我正在尝试在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]。这是无限的一点。我该如何绕过这个问题?
答案 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线和多边形边界线之间的交点,然后根据它计算一个新的多边形,然后从中计算面积。