打包正方形和矩形的算法是什么?

时间:2011-09-16 02:33:07

标签: algorithm

与Windows 8 Slate界面类似,如何在不留空的情况下很好地填充正方形和矩形的屏幕?

假设:

  • 矩形基本上是两个连接的正方形
  • 矩形可以是水平的或垂直的
  • 屏幕宽度是正方形宽度的3倍
  • 屏幕从上到下填充
  • 使得屏幕的最低部分可能无法完全对齐
  • 矩形和正方形的顺序随机出现(但可以在放入屏幕之前在小缓存中重新排序,缓存大小有限,例如12)

例如:

  +---++---++---+
  |   ||   ||   |
  +---++---+|   |
  +---++---+|   |
  |   ||   ||   |
  +---+|   |+---+
  +---+|   |+---+
  |   ||   ||   |
  +---++---++---+
  +--------++---+
  |        ||   |
  +--------+|   |
  +---++---+|   |
  |   ||   ||   |
  |   |+---++---+
  |   |
  |   |
  +---+

2 个答案:

答案 0 :(得分:3)

我认为这是Packing Problems的一个子集。

解决此问题的一种算法是使用Linear Programming

定义确保矩形不重叠的约束,然后解决。然后对算法进行加权以支持屏幕的左上角和最窄的宽度/高度。同时对算法进行加权以有利于间隔较大的矩形。

由于您具有目标屏幕分辨率,因此可以添加宽度和高度的约束,并在算法无法找到解决方案时放宽高度约束。

但这非常重。你可能使用一个不太稳健的算法来简化问题,仍然可以得到好的结果。 E.g:

Take items in order of display preference
Start at the top-left
For each item:
    Try to stack horizontally, going right ("favoring" left)
    if it won't fit on the screen:
        try to stack on the next row
        when trying to stack on the next row:
            if any "gaps" exist in the current row:
                see if you have a less "regular" rectangle that will fit in the gap
            else
                "favor" placing it farther left

编辑:

我在发布此答案后阅读了您现有的约束。

矩形具有相同尺寸的事实可能会让您优化问题 - 例如使用位数组和索引而不是某些基于树的空间容器。

它可能会让你做出某些决定的简短和特殊情况 - 例如放置所有1x1正方形,然后适合双高,移位正方形,然后适合双宽,取代正方形和矩形。或者相反,因为拟合较小的矩形总是比拟合较大的矩形更容易。只需确保以一种令人赏心悦目/稍微随意的方式将大矩形空间分开,然后先进行体积计数,这样就不会强制进行不必进行的滚动。

答案 1 :(得分:0)

它可能会帮助您研究一些被称为“纹理图集生成器”的计算机图形工具。这些程序试图将矩形纹理打包成一个更大的纹理,所以基本上和你的问题一样。

我认为还有一些名为Redcliff的人可以提供一些工作代码......