我想佈局一堆重疊的開出這樣的矩形:鋪設了重疊的矩形
alt text http://img690.imageshack.us/img690/209/picture1bp.png
我想了兩遍算法大致是:
// 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;
}
}
這(很可能)以矩形佈局如下: alt text http://img685.imageshack.us/img685/9963/picture2bc.png
這並不美觀,所以我認爲這將移動他們都離開了從最上層重新開始第二遍的:
// 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;
}
}
}
我想這應該結束了看上去像下面(看起來完全正確的做法):
alt text http://img511.imageshack.us/img511/7059/picture3za.png
但是,我對這種算法很謹慎,因爲我不確定它是否會在所有情況下正確佈局,並且可能會非常慢。你認爲這個算法可以工作嗎?你能提出一些更好的算法的建議嗎?
你的僞代碼需要一點工作... 「rect.size - = RECT_SIZE;」應該是「rect.x - = RECT_SIZE;」,並且如果導致衝突,則需要在最後一次左移之後將其右移一次。 – Sparr 2010-01-02 01:12:54
是的,你是對的。我注意到在執行僞代碼之後。我會在問題中解決它。執行後,它的表現通常非常糟糕: -/ – cheez 2010-01-02 01:22:15
嗯,我撒謊,它實際上工作得很好(一些小的邊界矩形問題)。x排序不會保留,但我需要x排序儘可能保留 – cheez 2010-01-02 01:33:05