分离矩形Javascript

分离矩形Javascript,javascript,algorithm,Javascript,Algorithm,基本上,我所做的是将一组随机的宽度/高度矩形放置在网格上(靠近网格中心),然后将它们彼此推开,直到它们都不重叠。我有另一个版本,在我把它们放在网格上之前检查碰撞,但这不是我在这个构建中要做的 我想知道是否有人能解释一个更好的方法 到目前为止,我所做的尝试类似于: 设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)), o

基本上,我所做的是将一组随机的宽度/高度矩形放置在网格上(靠近网格中心),然后将它们彼此推开,直到它们都不重叠。我有另一个版本,在我把它们放在网格上之前检查碰撞,但这不是我在这个构建中要做的

我想知道是否有人能解释一个更好的方法

到目前为止,我所做的尝试类似于:

设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 */ )

随机性之所以存在,是因为我会遇到这样的情况:某个矩形被来回推,永远不会自由,并导致无限循环。然而,这种方法效率极低。

我相信您试图实现的目标被称为包装问题。如果您只是在堆栈溢出中搜索“二维装箱”,您应该能够找到运行更高效算法所需的所有内容。

那么您的问题是什么?你在寻找一种更有效的算法吗?你想知道为什么没有随机变量,你会得到一个无限循环吗?现在还不清楚你在问什么。是的,对不起。想知道是否有人能解释一个更好的方法来做这件事,或者引导我找到一个更好的解决方案TL:DR-它是否需要作为一个“网格”结束,或者您是否希望尽可能紧密地排列矩形?后者,将它们紧密地排列,但它不需要填充矩形之间的所有空间如果您希望最小化边界矩形,你的问题是有效的。还是要最小化边界圆?