Я думаю, что алгоритм будет работать быстрее, если вы будете проверять наличие коллизий DIV при добавлении их в окно. Вместо того, чтобы расставлять их в произвольном порядке, а затем проверять, нет ли столкновений, случайным образом рассчитать положение каждого DIV и проверить, сталкивается ли эта позиция, прежде чем добавлять его. Если это произойдет, пересчитайте новую позицию и проверьте снова. Я думаю, что это уменьшает big-O с N ^ 2 до N * log (N).
Редактировать - вот пример кода:
function Rect( x, y, w, h )
{
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.hitTest = function( x, y )
{
return( x >= this.x && x <= this.x + this.width &&
y >= this.y && y <= this.t + this.height );
}
}
var numDivs = 10;
var divList = new Array();
for( var i = 0 ; i < numDivs ; i++ )
{
var doesOverlap = false;
do
{
divList[i] = new Rect( Math.random() * ( window.innerWidth - 50 ), Math.random() * ( window.innherHeight - 50 ), 50, 50 );
for( var y = 0 ; y < i && !doesOverlap ; y++ )
{
doesOverlap |= divList[y].hitTest( divList[i].x, divList[i].y );
doesOverlap |= divList[y].hitTest( divList[i].x + divList[i].width, divList[i].y );
doesOverlap |= divList[y].hitTest( divList[i].x, divList[i].y + divList[i].height );
doesOverlap |= divList[y].hitTest( divList[i].x + divList[i].width, divList[i].y + divList[i].height );
}
}
while( doesOverlap );
// No colision, add div
}
Я не проверял это на правильность, просто списал это с моей головы. Надеюсь, это даст вам представление о том, где вы ошиблись.