我正在尝试计算 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]。这是无穷大的一点。我怎样才能绕过这个问题?
我正在尝试计算 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 中的第一个点,即无穷远点。这意味着 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
但是,如果这不是您所说的“不工作”,那么也许您可以详细说明您期望看到的内容?
这可以避免 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 线和多边形边界线之间的交点,然后根据它计算一个新的多边形,然后从中计算面积。