3

基本的に、私がやっていることは、ランダムな幅/高さの四角形の束をグリッド (その中心近く) に配置し、重ならないようにそれらをすべて互いに押し離すことです。グリッドに配置する前に衝突をチェックする別のバージョンがありますが、このビルドではそれを目指していません。

誰かがこれについてもっと良い方法を説明できるかどうか疑問に思っていますか?

私がこれまでに試したことは、次のようなものです。

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

ランダムが存在するのは、特定の四角形が前後に押し出されて解放されず、無限ループが発生する場合があるためです。ただし、この方法は恐ろしく非効率的です。

4

1 に答える 1