我正在尝试排列未知数量的矩形,以便它们不会相互重叠。重新排列矩形时存在许多限制:
我写了一些可以产生主要问题here at jsbin的小东西。到目前为止,我唯一想到的就是我来回遍历这些矩形的情况。我想知道是否有人可以建议一种方法或更好地指出现有的解决方案。
答案 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。我试着考虑减少几分钟,但没有想出任何东西。