在面板上放置随机不重叠的矩形

时间:2009-04-04 05:24:41

标签: algorithm random 2d puzzle

我有一个大小为X的面板Y.我想在这个面板上放置N个随机大小的矩形,但我不希望它们中的任何一个重叠。我需要知道这些矩形的X,Y位置。

算法,有人吗?

编辑:所有N个矩形在开始时都是已知的,可以按任何顺序进行选择。这会改变程序吗?

5 个答案:

答案 0 :(得分:15)

您可以通过一组“自由”矩形对此进行建模,从单个坐标为0,0,大小(x,y)开始。每次需要再添加一个矩形时,选择剩余的“自由”矩形之一,生成新的矩形(左上角坐标和大小,使其完全包含),并拆分该矩形以及任何其他重叠“免费的“矩形,让孩子们表达剩余的自由空间。这将导致0到4个新的矩形(如果新的矩形正好是旧的自由矩形的大小,则为0;如果它在中间,则为4,依此类推)。随着时间的推移,您将获得越来越多越来越小的自由区域,因此您创建的矩形也会更小。

好的,不是一个非常精细的解释,它更容易在白板上显示。但是这个模型是我用来寻找新切割的gui组件的起始位置的模型;可以很容易地跟踪可用的屏幕块,并选择(例如)左侧或最顶层的区域。

答案 1 :(得分:5)

这是关于2d打包算法的一篇不错的文章:http://www.devx.com/dotnet/Article/36005

您通常需要某种使用启发式算法来获得不错的结果。一个简单(但非最优)的解决方案将是第一个合适的算法。

答案 2 :(得分:3)

我在我的一个应用程序中使用了此Rectangle Packing algorithm,以C#源文件的形式提供。

使用面板的大小初始化算法,然后迭代所有矩形并获得它们的位置。矩形的顺序可能会影响结果,具体取决于封隔器。

答案 3 :(得分:0)

我建议您使用StaxMans建议。

这是我的2c:

随机添加大量矩形(彼此重叠)。 删除重叠的矩形:

for rectangle in list of rectangles:
    if rectangle not deleted:
        delete all rectangles touching rectangle.

要查找触及特定矩形的所有矩形,您可以使用四叉树或基于x1,y1 x2,y2值的不等式。

编辑:事实上,大多数游戏引擎如pygame等都包括矩形的碰撞检测,这是一个常见的问题。

答案 4 :(得分:-4)

或者维护已添加的矩形列表,并创建一个算法,根据该列表确定新矩形的放置位置。您可以创建一个基本的Rectangle类来保存有关矩形的信息。

创建自定义算法不应该那么难。