与Windows 8 Slate界面类似,如何在不留空的情况下很好地填充正方形和矩形的屏幕?
假设:
例如:
+---++---++---+
| || || |
+---++---+| |
+---++---+| |
| || || |
+---+| |+---+
+---+| |+---+
| || || |
+---++---++---+
+--------++---+
| || |
+--------+| |
+---++---+| |
| || || |
| |+---++---+
| |
| |
+---+
答案 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的人可以提供一些工作代码......