【问题标题】:How to stack rectangles without changing their X positions?如何在不改变 X 位置的情况下堆叠矩形?
【发布时间】:2011-12-14 03:15:08
【问题描述】:

我有一组矩形( QGraphicsScene 中的 QGraphicsRectItem ),其 X 位置是固定的,Y 位置可以修改。如果有任何重叠,我想堆叠这些矩形。可以通过移动/调整这些矩形的大小来动态更改矩形的位置,并且每次都必须优化空间以确保没有间隙。重要的约束是,当我们移动一个特定的矩形时,它必须在不修改任何其他矩形的 X 位置的情况下堆叠这些矩形。

我有一个简单的蛮力算法,它遍历所有矩形,然后获取碰撞矩形,用所有碰撞矩形的一些增量值增加 Y 位置。

这个问题有什么最优解吗?

【问题讨论】:

  • 动态改变?是一些类似俄罗斯方块的游戏吗?
  • 没有。这不像俄罗斯方块。想象每个矩形都有一个时间范围。因此,当我移动/调整特定矩形的大小时,它的时间范围可以改变,比如矩形的新宽度将从 5 秒到 10 秒。现在在不触及其他重叠矩形的时间范围的情况下,它必须堆叠和优化空间。有一个时间刻度,每个矩形都在时间刻度下绘制,宽度不定,高度固定。

标签: c++ algorithm qt


【解决方案1】:

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

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

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

【讨论】:

  • 如果所有矩形都具有相同的高度,这将很有效。提问者能否确认这个假设是否正确?
  • 是的,矩形的高度相同但宽度不同。
  • 谢谢托尼。我使用这种方法有一些额外的限制。它有效!
【解决方案2】:

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

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

【讨论】:

  • 在我的例子中,一组矩形在不同的 X 位置重叠。 Y 保持不变。
  • 其实你说y可以修改,x保持不变。无论如何,这不会改变算法。只需使用其他坐标即可。
猜你喜欢
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多