我正在尝试使用this link中的代码构建Voronoi图。但是,我有几点,想知道他们落在哪个地区。这个代码与MATLAB中的原始函数(即voronoin
)一样,给出了两个输出:[vornb,vorvx]
,一个用于顶点,另一个用于单元格。所以,我想看看点(x, y, z)
属于Voronoi图的哪个区域。
我实际上正在寻找像3D this区域屏蔽这样的东西。
答案 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]);
如果cellIndex
为NaN
,则该点不在边界凸包内。否则,它位于一个Voronoi单元中。要确定哪一个,首先要考虑Voronoi单元C{i}
表示比X(i, :)
中任何其他点更接近点X
的所有点的集合。因此,要找出点[x y z]
属于哪个单元格,您必须找到X
中最接近的点。您可以使用pdist2
和min
执行此操作,如下所示:
[~, cellIndex] = min(pdist2(X, [x y z]));
如果您无法访问pdist2
(位于Statistics Toolbox中),则可以自行计算距离:
[~, cellIndex] = min(sqrt(sum(bsxfun(@minus, X, [x y z]).^2, 2)));
现在,cellIndex
可以用作voronoin
或polybnd_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
包含边界凸包外的点的索引值。