Javascript打包有很多约束,寻找一个简单的解决方案

时间:2012-01-17 08:44:46

标签: javascript jquery mathematical-optimization packing

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

将有150个矩形从阵列中给出随机大小(全部,一半,四分之一)。现在我想在容器中排列这些矩形,这样就没有间隙了。

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

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

在上面的代码中,我尝试根据当前的代码约束下一个框的选择 可能我不清楚,我会再次尝试解释。我有150个盒子,我只想填充150个盒子的容器,它们应该是随机的大小,一半,四分之一。我们也可以拒绝随机选择的尺寸,如果发现它会产生间隙,我们也可以获得另一个。

2 个答案:

答案 0 :(得分:1)

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

在示例代码中,您现在可以半随机选择它们,因为它取决于status的模数。

如果你的目标是用看似随机的矩形填充容器,也许下一个算法适合你(peude code):

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]的数组。

然后放置矩形,方法是放置它们而不是将它们向左浮动。

答案 1 :(得分:1)

在韦斯利的大力帮助下,我找到了一个解决问题的好方法。它确实不是一种包装解决方案,而是一种无间隙生产看似随机包装盒的解决方案。我不需要优化。

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

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

(Wesley的解决方案应该标记为答案,我正在编写一个单独的解决方案,仅用于帮助人们从Google访问此页面,因此请先查看他的答案)