在包含点的Voronoi图中查找区域

时间:2017-11-28 16:50:59

标签: matlab voronoi

我正在尝试使用this link中的代码构建Voronoi图。但是,我有几点,想知道他们落在哪个地区。这个代码与MATLAB中的原始函数(即voronoin)一样,给出了两个输出:[vornb,vorvx],一个用于顶点,另一个用于单元格。所以,我想看看点(x, y, z)属于Voronoi图的哪个区域。

我实际上正在寻找像3D this区域屏蔽这样的东西。

1 个答案:

答案 0 :(得分:0)

无论您是使用内置voronoin生成Voronoi单元格(使用N-by-D矩阵点X作为输入)还是polybnd_voronoi(链接) File Exchange submission for bounded Voronoi cells,它采用另外的M-by-D矩阵BX定义一个边界凸多面体),您可以通过仅使用相同的输入来计算哪个单元格包含给定点[x y z]参数。

对于有界Voronoi单元格情况,首先需要确定您的点是否在边界凸包内。一种方法是创建一个Delaunay triangulation边界点并使用pointLocation方法确定该点是否在凸包内:

DT = delaunayTriangulation(BX);
cellIndex = pointLocation(DT, [x y z]);

如果cellIndexNaN,则该点不在边界凸包内。否则,它位于一个Voronoi单元中。要确定哪一个,首先要考虑Voronoi单元C{i}表示比X(i, :)中任何其他点更接近点X的所有点的集合。因此,要找出点[x y z]属于哪个单元格,您必须找到X中最接近的点。您可以使用pdist2min执行此操作,如下所示:

[~, cellIndex] = min(pdist2(X, [x y z]));

如果您无法访问pdist2(位于Statistics Toolbox中),则可以自行计算距离:

[~, cellIndex] = min(sqrt(sum(bsxfun(@minus, X, [x y z]).^2, 2)));

现在,cellIndex可以用作voronoinpolybnd_voronoi的输出参数的索引,以获取边界Voronoi单元格。

概括为多个点:

您可以将上述内容概括为多于一个[x y z],这样您就可以创建3D区域遮罩:

[PX, PY, PZ] = meshgrid(...);  % Generate regular points in a 3D volume
PXYZ = [PX(:) PY(:) PZ(:)];    % Combine them into one matrix

DT = delaunayTriangulation(BX);      % Create triangulation for boundary
cellMask = pointLocation(DT, PXYZ);  % Find points in boundary

index = ~isnan(cellMask);  % Index of points in boundary
[~, cellMask(index)] = min(pdist2(X, PXYZ(index, :)), [], 1);  % Find cell index
cellMask = reshape(cellMask, size(PX));  % Reshape mask to 3D

3D蒙版cellMask将包含Voronoi单元格内的点的索引值,并且NaN包含边界凸包外的点的索引值。