0

这不完全是打包,因为我可以自己分配矩形大小,我只需要打包的结果。我有相同比例和不同大小的矩形
FULL、
HALF(面积 = 1/4 * FULL)、
QUARTER(面积 = 1/4 * HALF)。
所有将仅水平放置。容器的宽度是 FULL 的 3 倍,高度将调整以适合矩形。

将有 150 个矩形,它们将从数组(全、半、四分之一)中获得随机大小。现在我想在容器中排列这些矩形,这样就没有间隙了。

容器和矩形是 HTML DIV。我正在使用 JavaScript 来打包它们。

这是一个小提琴http://jsfiddle.net/MywQ2/1/

在上面的代码中,我试图根据当前一个框来限制下一个框的选择。
可能是我不清楚,我会再次尝试解释。我有 150 个盒子,我只想用 150 个盒子装满容器,它们的尺寸应该是随机的,大小为满、半、四分之一。我们也可以拒绝随机选择的尺寸,如果发现它会造成间隙,则另取一个。

4

2 回答 2

1

我认为你要么想要一些不可能的东西,要么你把它制定错了。如果您选择真正随机的矩形,您最终会在容器中出现间隙。

在您现在拥有的示例代码中,您选择它们​​是半随机的,因为它取决于status.

如果您的目标是用看似随机的矩形填充容器,那么下一个算法可能适合您(peude 代码):

for rectangle in ['large', 'medium', 'small']:
    try:
        place_rectangle_randomly_in_container(rectangle)
    except NoFreeSpace:
        if rectangle == 'small':
            # container filled
            break

其中 place_rectangle_randomly_in_container 尝试将矩形随机放置在容器中的任何位置。

要实现放置,请使用二维布尔数组跟踪容器,该数组指示该位置是否仍然空闲;数组中的每个元素都代表一个小矩形将填充的空间,因此如果容器可以包含 12x12 个小矩形,那将是数组的维度。要检查中等矩形是否适合 [2,3],您需要检查数组中的 [2,3]、[2,4]、[3,3] 和 [3,4]。

然后通过定位它们而不是向左浮动来放置矩形。

于 2012-01-17T08:59:53.427 回答
1

在 Wesley 的大力帮助下,我找到了一个不错的解决方案。它确实不是一种包装解决方案,而是一种生产看似随机包装的盒子而没有间隙的解决方案。我不需要像优化这样的东西。

解决方案是将画布划分为 4x4 网格,并使用一个矩阵来跟踪空缺位置,看似随机地填充每个网格。

这个示例小提琴很好地解释了它http://jsfiddle.net/Ua8Cv/

(韦斯利的解决方案应该标记为答案,我正在编写一个单独的解决方案只是为了帮助人们从谷歌来到这个页面,所以先看看他的答案)

于 2012-01-19T20:41:36.693 回答