【发布时间】:2010-12-31 16:22:16
【问题描述】:
我正在尝试布局一堆重叠的矩形,它们的开头是这样的:
alt text http://img690.imageshack.us/img690/209/picture1bp.png
我想到的2-pass算法大致是:
// 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;”,如果这会导致碰撞,您需要在最后一次向左移动后向右移动一次。
-
是的,你是对的。我注意到在实现伪代码之后。我会在问题中解决它。实施后,它的总体表现非常糟糕:-/
-
嗯,我撒了谎,它实际上工作得很好(一些小的边界矩形问题)。但是,x 排序没有保留,我需要“尽可能”保留 x 排序
-
这就是我们不再使用 imageshack 的原因。
标签: algorithm user-interface qt layout