基本上,我正在做的是将一堆随机宽度/高度放置在网格上(靠近它的中心),然后将它们全部推离彼此,直到它们都没有重叠。我有另一个版本,我在将它们放在网格上之前检查碰撞,但这不是我在这个版本中的目的。
我想知道是否有人可以解释一个更好的方法来解决这个问题?
到目前为止我尝试过的是类似于:
让r1 / r2 = rect1 / rect2
do {
var ox = Math.max(0, Math.min(r1.x + r1.w, r2.x + r2.w) - Math.max(r1.x, r2.x)),
oy = Math.max(0, Math.min(r1.y + r1.h, r2.y + r2.h) - Math.max(r1.y, r2.y)),
dx = r2.x - r1.x,
dy = r2.y - r1.y;
if (ox > 0 && oy > 0) {
if (ox >= oy) {
if (r1.x >= r2.x && Math.random() > .1) {
r1.x += ox;
spaced = true;
continue;
} else {
r1.x -= ox;
spaced = true;
continue;
}
} else {
if (r1.y >= r2.y && Math.random() > .1) {
r1.y += oy;
spaced = true;
continue;
} else {
r1.y -= oy;
spaced = true;
continue;
}
}
}
} while ( /* stuff */ )
只有那里的随机因为我会遇到某个矩形被来回推动而永远不会自由并导致无限循环的时间。然而,这种方式非常低效。
答案 0 :(得分:0)
我相信你想要完成的事情被称为包装问题http://en.wikipedia.org/wiki/Packing_problem。如果您只是搜索堆栈溢出的“2d bin packing”,您应该能够找到所需的所有内容,以便提供更高效的算法。