使用 Lloyd 算法进行锚定分区
using Lloyd's algorithm for anchored partitioning
我可以使用 Lloyd 算法将多边形划分为 n 个多边形。假设我使用上述算法将下面的多边形分成 5 个多边形,我得到:-
但我想进行锚定分区,这意味着我希望每个子多边形至少包含一个边界点,如下所示:
是否对现有算法进行了修改以帮助我实现该目标?如何保证锚定?
如果您能引用一些现有的 Matlab/python 代码而不是伪代码,那将会很有帮助吗?我在上面使用的代码来自 here,它执行普通的香草实现。
只是一个建议:一个简单的尝试。在正方形上定义一个势函数U(x, y)
。 Something like this. 您可以选择参数,使其最小值是一个与正方形内切圆几乎相同的圆。或者随意选择不同的潜力。给定点 p1 = [x1; y1], p1 = [x1; y1], ... pn = [xn; yn]
,形成 2 x n 矩阵
P = [p1 p2 ... pn];
设 Lloyd 算法一步的函数为
P_out = LA(P_in)
即给定点 P_in = [p1_in p2_in ... pn_in]
它生成它们的 Voronoi 图,然后计算每个 Voronoi 单元的质心 p1_out, p2_out, ..., pn_out
并将输入点移动到新的输出,质心点 P_out = [p1_out p2_out ... pn_out]
.
然后你可以沿着电位的负梯度应用重新定位,即
function P_out = GR(P_in)
P_out = P_in - gradU(P_in);
end
其中 GRAD = gradU(P_in)
是为每个 column-vector P_in(:,j)
计算梯度向量并生成梯度的 2 x n 矩阵 GRAD 的函数。
所以你的算法实际上就是合成
P_out = LA(GR(P_in));
也许这些点会偏向正方形的外围,避开中间部分,从而最终让 Voronoi 单元接触到边界?我选择了一个潜在的假设,在这种情况下矢量梯度场是无旋的,所以不会出现某种循环动力学,但该算法将收敛到一些 centroidal 平衡配置(这听起来可信但我不确定那)。
我可以使用 Lloyd 算法将多边形划分为 n 个多边形。假设我使用上述算法将下面的多边形分成 5 个多边形,我得到:-
但我想进行锚定分区,这意味着我希望每个子多边形至少包含一个边界点,如下所示:
是否对现有算法进行了修改以帮助我实现该目标?如何保证锚定?
如果您能引用一些现有的 Matlab/python 代码而不是伪代码,那将会很有帮助吗?我在上面使用的代码来自 here,它执行普通的香草实现。
只是一个建议:一个简单的尝试。在正方形上定义一个势函数U(x, y)
。 Something like this. 您可以选择参数,使其最小值是一个与正方形内切圆几乎相同的圆。或者随意选择不同的潜力。给定点 p1 = [x1; y1], p1 = [x1; y1], ... pn = [xn; yn]
,形成 2 x n 矩阵
P = [p1 p2 ... pn];
设 Lloyd 算法一步的函数为
P_out = LA(P_in)
即给定点 P_in = [p1_in p2_in ... pn_in]
它生成它们的 Voronoi 图,然后计算每个 Voronoi 单元的质心 p1_out, p2_out, ..., pn_out
并将输入点移动到新的输出,质心点 P_out = [p1_out p2_out ... pn_out]
.
然后你可以沿着电位的负梯度应用重新定位,即
function P_out = GR(P_in)
P_out = P_in - gradU(P_in);
end
其中 GRAD = gradU(P_in)
是为每个 column-vector P_in(:,j)
计算梯度向量并生成梯度的 2 x n 矩阵 GRAD 的函数。
所以你的算法实际上就是合成
P_out = LA(GR(P_in));
也许这些点会偏向正方形的外围,避开中间部分,从而最终让 Voronoi 单元接触到边界?我选择了一个潜在的假设,在这种情况下矢量梯度场是无旋的,所以不会出现某种循环动力学,但该算法将收敛到一些 centroidal 平衡配置(这听起来可信但我不确定那)。