基本上,我所做的是将一堆随机宽度/高度的矩形放置在网格上(靠近中心),然后把它们全部推开,直到它们不重叠。我有另一个版本,在将它们放置在网格上之前会检查碰撞,但这不是我在此版本中追求的目标。
我想知道是否有人可以解释一种更好的方法?
到目前为止,我尝试过类似于以下内容: let r1/r2 = rect1/rect2
我想知道是否有人可以解释一种更好的方法?
到目前为止,我尝试过类似于以下内容: let 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 */ )
加入随机数是为了避免某个矩形被反复推挤而无法解放,从而导致无限循环。然而,这种方法效率极低。