Ich versuche, eine Reihe von überlappenden Rechtecken zu layouten, die wie folgt beginnen:
Alt-Text http://img690.imageshack.us/img690/209/picture1bp.png
Der 2-Pass-Algorithmus, den ich mir ausgedacht habe, ist ungefähr so:
// Pass 1 - Move all rectangles to the right until they do not overlap any other rectangles
rects = getRectsSortedOnTopLeft(); // topmost first, all rects same size
foreach(rect in rects)
{
while(rect.collidingRects().size() != 0)
{
rect.x += RECT_SIZE;
}
}
Dies führt (wahrscheinlich) dazu, dass die Rechtecke wie folgt angeordnet sind: Alt-Text http://img685.imageshack.us/img685/9963/picture2bc.png
Das ist ästhetisch nicht sehr ansprechend, also dachte ich an einen zweiten Durchgang, bei dem ich sie alle nach links verschieben würde, wobei ich wieder mit dem obersten Punkt beginnen würde:
// Pass 2
foreach(rect in rects)
{
while(rect.x >= LEFT_MARGIN)
{
assert(rect.collidingRects().size() == 0);
rect.x -= RECT_WIDTH;
if(rect.collidingRects().size() != 0)
{
rect.x += RECT_WIDTH;
break;
}
}
}
Ich denke, das sollte am Ende so aussehen wie unten (sieht in der Praxis genau richtig aus):
Alt-Text http://img511.imageshack.us/img511/7059/picture3za.png
Ich stehe diesem Algorithmus jedoch skeptisch gegenüber, da ich nicht sicher bin, ob er in allen Fällen korrekt funktioniert und möglicherweise sehr langsam ist. Glauben Sie, dass dieser Algorithmus funktionieren kann? Können Sie Vorschläge für einen besseren Algorithmus machen?