我想布局一堆重叠的开出这样的矩形:铺设了重叠的矩形
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