非重叠的非凸多边形

时间:2015-12-05 11:32:27

标签: algorithm computational-geometry np

假设一组n个随机分布的非凸多边形P = {Pi},n = | P |,在平面中,它们中的一些重叠(它们中的大约50%彼此重叠)。

1]移动多边形,使其不会发生重叠。

2]只有"小"允许移位(尽可能保留对象Pi的相对位置)。

在我看来,问题是NP难。我尝试了几种方法(随机优化最小化重叠区域+移位),一体化移动(随机摇动),在凸包外部添加(适用于凸多边形,但对于非凸形多边形则有很大的偏移),... < / p>

最有希望的是使用简单启发式(在2个方向上移动)的增量方法。

0] Compute minimum bounding boxes (MBB) for all Pi. Sort Pi by area.
1] Add a Pi to the solution S and check for overlaps
    1.a] Test intersection  Pi vs. all Pj in S.
    1.b] If MBB(Pj) vs. MBB(Pi) overlap, check the polygons Pi vs. Pj: 
        1.b.1] If Pi, Pj overlap, moving Pi perpendicular to Pj (left, right) by s may help
        1.b.2] Suppose Pi1=Pi(sl), Pi2=Pi(sr) to be shifted Pi, shifts sl=s, sr=-s
        1.b.3] Check, which direction is more perspective:
        1.b.4] While intersections Pi1 vs. Pj exist //Left
           1.b.4.a] Preselect collisions Pi1 vs. all Pj by MBB.
           1.b.4.b] If MBB(Pi1) and MBB(Pj) overlap, check Pi1 vs. Pj
           1.b.4.c] If overlap found sl = sl + s;
           1.b.4.c] Shift Pi1(sl);
        1.b.5] While intersections Pi1 vs. Pj exist //Right
           1.b.5.a] Preselect collisions Pi1 vs.all Pj by MBB.
           1.b.5.b] If MBB(Pi1) and MBB(Pj) overlap, check Pi1 vs. Pj
           1.b.5.c] If overlap found sr = sr + s;
           1.b.5.d] Shift Pi2(sr);
        1.b.6] Assign Pi = Pi1 or Pi = Pi2 (the faster).

不幸的是,对于大n(数千),增量方法很慢。有没有可能的速度改进或更好的方法存在?最多的努力花在不必要的轮班和检查上......

多边形的Voronoi镶嵌可能有助于细胞内多边形的移动...我们也可以检查,哪个Voronoi细胞受影响添加一个新细胞(发生器由多边形表示)......也许,运动可以计算为受影响细胞中Pi质心和多边形质心的平均向量。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

选择每个多边形的一个顶点,确保所选多个顶点不重合。 (如果不可能,则遇到麻烦。)确定所有多边形最紧密的边界,并将最大正方形的边除以所选顶点之间的最短水平/垂直距离。

将所有选定顶点的坐标乘以此系数,并相应地平移剩余的顶点(不重新缩放)。这将使所有多边形分开,同时保持它们的位置非常相似。

也许这个解决方案对你来说太“稀疏”了;它可以作为重新包装的起点,而不会再次产生重叠。