如何在不改变X位置的情况下堆叠矩形?

时间:2011-12-14 03:15:08

标签: c++ algorithm qt

我有一组矩形(QGraphicsSectne中的QGraphicsRectItem),其X位置是固定的,Y位置可以修改。如果有任何重叠,我想堆叠这些矩形。矩形的位置可以通过移动/调整这些矩形来动态地改变,并且每次必须优化空间以使得没有间隙。重要的限制是,当我们移动一个特定的矩形时,它必须堆叠矩形而不修改任何其他矩形的X位置。

我有一个简单的强力算法,遍历所有矩形,然后得到collidng矩形,为所有碰撞矩形增加Y位置,增加一些delta值。

针对此问题的最佳解决方案?

2 个答案:

答案 0 :(得分:1)

您必须将每个矩形指定为一个级别,以便在给定级别上,没有两个矩形重叠。正确?因此,分配一个级别数组,为每个级别的最坏情况留出空间,只包含一个矩形:

std::vector<int> LevelFreeAt (nRectangles) ;

当您遍历矩形列表时,LevelFreeAt[i]将包含i级别空闲的时间。现在,对于每个矩形,按照开始时间的顺序,只需将其分配给在开始时间空闲的第一个级别,并相应地更新该级别的LevelFreeAt条目。

答案 1 :(得分:1)

您可以按Y-Position(最小y位置)对矩形进行排序。然后你浏览列表。第一个将按原样进行,列表中的第二个必须检查它是否与前一个重叠。如果是,请将Y位置调整为不与前一位置重叠并继续。对列表中的每个矩形执行此操作。在此之后,它们不重叠。

限制:如果某些矩形完全位于其他矩形内(y坐标),则不起作用。