在边界内排列矩形而没有重叠和x约束

时间:2013-05-11 00:56:22

标签: javascript jquery algorithm d3.js

我正在尝试排列未知数量的矩形,以便它们不会相互重叠。重新排列矩形时存在许多限制:

  • 只能在正y(向上)方向上移动,除了 向上移动会将矩形推到外面的状态 集装箱边界。
  • 不能沿x(左或右)方向移动我们应该得到一些 在各方面的矩形之间合理填充。
  • 最顶部的矩形应该是第一个矩形(由jsbin link中的标签表示)

我写了一些可以产生主要问题here at jsbin的小东西。到目前为止,我唯一想到的就是我来回遍历这些矩形的情况。我想知道是否有人可以建议一种方法或更好地指出现有的解决方案。

2 个答案:

答案 0 :(得分:0)

您需要使用前面矩形的高度计算每个矩形的垂直位置。检查问题是否有解决方案可能很有用。

// Generate random rectangles, with the vertical position set to zero
var padding = 5;
var num_rectangles = 10;
var rectangles = [];
for (var k = 0; k < num_rectangles; k += 1) {
    rectangles.push({ 
        x: 50 * Math.random(),
        y: padding, 
        width: Math.max(50 * Math.random(), 20),
        height: Math.max(50 * Math.random(), 20)
    });
}

// Update the vertical position of the item j as the sum of the heigths 
// of the rectangles 0, ..., j - 1
for (var j = 1; j < num_rectangles; j += 1) {
    rectangles[j].y = rectangles[j - 1].y + rectangles[j - 1].height + padding;
}

然后像往常一样画出矩形。我写了一个小例子http://jsfiddle.net/FuepP/2/

答案 1 :(得分:0)

目前我唯一能想到的就是分支定界搜索。从底部开始,通过向上推动一个或另一个矩形(分支)迭代地解决碰撞对。如果超出限制,请回溯到上一个分支。

如果解决这个问题是NP-Complete,我不会感到惊讶。它是bin packing problem的更受约束的版本。另一方面,过度约束问题往往使它们变得非常容易,所以也许它不是NP-Complete。我试着考虑减少几分钟,但没有想出任何东西。