矩形项目的优化网格

pet*_*hen 5 algorithm math layout mathematical-optimization

我有N个长宽比为Aitem(X:Y)的矩形项目。
我有一个长宽比为Aview的矩形显示区域

这些项目应以表格形式布置(即r行,c列)。

什么是理想的网格行x列,以使单个项目最大?(当然,行*列> = N-即可能有“未使用的”网格位置)。

一个简单的算法可以遍历行= 1..N,计算所需的列数,并使行/列对具有最大的项。

我想知道是否有一个非迭代算法(例如,对于Aitem = Aview = 1,行/列可以由sqrt(N)近似)。

mck*_*eed 5

注意:我不太明白 Frédéric 的回答,所以我自己解决了这个问题,并提出了似乎相同的解决方案。我想我不妨解释一下我做了什么,以防万一。

首先,我将视图的纵横比标准化为项目的纵横比。(我假设您不想旋转项目。)

a = (view_width/view_height) / (item_width/item_height)
Run Code Online (Sandbox Code Playgroud)

现在a用正方形包装一个宽/高比的矩形相当于用项目包装视图。理想的情况是我们的网格(现在是正方形)完全填充矩形,这会给我们

a = c/r
Run Code Online (Sandbox Code Playgroud)

其中rc是行数和列数:

N = r*c
Run Code Online (Sandbox Code Playgroud)

将这两个方程相乘/相除得到

N*a = c^2              N/a = r^2
c = sqrt(N*a)          r = sqrt(N/a)
Run Code Online (Sandbox Code Playgroud)

如果网格是完美的,r并且c是整数,但如果不是,则必须尝试 Frédéric 提到的三个选项,并保留r*c最小但仍大于 的选项N

  • floor(r), ceil(c)
  • ceil(r), floor(c)
  • ceil(r), ceil(c)