在任意边界内打包任意多边形

时间:2011-07-28 19:12:40

标签: algorithm polygon heuristics packing

我想知道是否有人能指出最适合我特定多边形打包问题的算法/启发式算法。我给了一个多边形作为边界(凸面或凹面也可能包含孔)和一个“填充”多边形(也可能是凸面或凹面,不包含孔)我需要用指定的数字填充边界多边形填充多边形。 (我在2D工作)。

我发现的许多多边形填充启发式假设边界和/或填充多边形将是矩形的,并且填充多边形将具有不同的大小。在我的例子中,填充多边形可能是非矩形的,但都是完全相同的。

也许这是一种特殊类型的包装问题?如果有人对这种类型的多边形包装有一个定义,我很乐意google,但到目前为止,我还没有发现任何类似的东西都很有用。

感谢。

4 个答案:

答案 0 :(得分:4)

你问的问题很难。为了正确看待这个问题,你要用非重叠磁盘包装有界多边形内部的(更简单)情况已经很难了,磁盘是最简单的“包装形状”(你必须使用任何其他形状)考虑方向以及大小和中心位置。)

事实上,我认为在computational geometry确定任意整数N和任意有界多边形区域(在欧几里德平面中)是一个开放的问题,什么是“最优”(在覆盖的意义上) N个内部非重叠磁盘的多边形内部包装的最大百分比,您可以自由选择每个磁盘的半径和中心位置。我确定某些特殊的多边形形状(如矩形,圆形和三角形)的“最佳”答案 已知,但对于任意形状,您最好的“启发式”可能是:

  1. 在N。
  2. 开始你的形状计数器
  3. 添加最大的“包装形状”,您可以完全放入多边形边界内,而不会与任何其他包装形状重叠。
  4. 减少你的形状计数器。
  5. 如果你的形状计数器是> 0,转到第2步。
  6. 我说“可能”因为“最大的第一”并不总是把东西装进密闭空间的最佳方式。您可以通过阅读bin packing problemknapsack problem来深入了解这种特殊的疯狂风格。

    编辑:第2步本身很难。一个合理的策略是在多边形内部选取一个任意点作为中心并“膨胀”磁盘直到它接触边界或另一个磁盘(或两者),然后在继续充气的同时“滑动”磁盘它使得它保持在边界内而不与任何其他磁盘重叠,直到它被“捕获” - 与边界和/或其他磁盘至少有2个接触点。但要正式化这种“滑动过程”并不容易。即使你正确地进行滑动过程,这种策略并不能保证你会发现最大的“可写入的磁盘” - 你的“本地最大”磁盘可能被困在内部的“波瓣”中将自由空间的“颈部”缩小到较大的“叶片”,其中较大的圆盘适合。

答案 1 :(得分:3)

感谢您的回复,我的要求是这样的,我可以通过不必处理方向来进一步简化问题,然后我甚至进一步简化,只是真的担心填充元素的边界框。通过这两个简化,问题变得更加容易,我使用条带填充算法和空间哈希网格(因为现有的元素我不允许填充)。

通过这种方法,我简单地将填充区域划分为条纹并创建空间哈希网格以注册填充区域内的现有元素。我创建了第二个空间哈希网格来注册填充区域(因为我的条纹不能保证在边界区域内,这使我检查填充元素是否在填充区域中更快一点,因为我可以查询网格,如果我的填充元素放置的所有网格都已满,我知道填充元素位于填充区域内。之后,我遍历每个条带并在散列网格允许的位置放置一个填充元素。这当然不是一个最佳解决方案,但它最终成为我特定情况所需的一切,并且非常快。我找到了有关从here创建空间哈希网格的必要信息。我有了从this文章中填充条纹的想法。

答案 2 :(得分:1)

这种类型的问题在几何上解决起来非常复杂。

如果你能接受一个好的解决方案,而不是100%的最佳解决方案 解决方案然后你可以用光栅算法解决它。

将边界多边形绘制(栅格化)为一个内存中 图像和填充多边形到另一个内存中的图像。

然后,您可以更轻松地搜索填充多边形所在的位置 通过用两个图像重叠来拟合边界多边形 填充多边形和检查的各种(X,Y)偏移量 像素值。

当您找到填充多边形适合的位置时, 清除边界多边形中的像素并重复 直到没有更多填充多边形适合的地方。

谷歌搜索的关键词是:光栅化,叠加,算法

答案 3 :(得分:0)

如果填充多边形是拼图块的形状,许多算法将错过互锁对齐。 (我不知道在那种情况下建议什么)

当边界远大于时,一般问题的一种方法很有效 填充件是以尽可能最好的方式拼砌无限平面,然后在此平面上寻找边界的最佳对齐方式。