分布图像形成正方形的算法
Algorithm for distributing images to form a square
我正在构建一个从一系列图像创建精灵的应用程序sheet。目前,该应用程序需要由用户指示列数,但我想添加一个自动建议此参数的选项,它允许获得几乎正方形的精灵sheet。
如果图像是方形的,则图像总数的平方根就足够了,但事实并非如此。
图片的尺寸必须相同,但可以高大于宽或相反。
例如:精灵sheet有一个行走的角色,每张图片高331,宽160。帧数为25。
我应该找到一种算法来建议列(和行)的数量,使我能够获得尽可能正方形的 sheet 。
不幸的是,我没有代码可以展示,因为我不知道要进行什么样的推理。
您对工作有什么建议吗?
在数学上,这是一个有趣的问题。
我没有时间仔细考虑,但这是我的两分钱:
设精灵的宽高分别为w和h,设精灵的个数为n.
如果将它们放在由 c 列和 r 行组成的网格中,则网格的总宽度将为 cw和总高度rh。您希望商 cw/rh 尽可能接近 1。
现在,如果你自由选择c和r,网格单元格的数量,N := cr ,可能略大于 n。在大多数情况下,我希望您接受最后一行部分留空。
由于N接近n,
因此,我们想要找到 c 使得
越小越好。显然这发生在
因此,如果让列数为 √(nh/w) 四舍五入到最接近的整数,您可能会得到一个相当正方形的网格。
基本思路是,如果图像高度是宽度的两倍,则需要的列数是行数的两倍。
如果:
- q 是图像比例 (width/height)
- c是列数
- r 是行数
- n为图片总数
那么我们有:
r / c = q 和 r * c = n
几次换人后:
c = sqrt(n / q)
r = q * c
在你的例子中,q = 160 / 331 = 0.48
c = sqrt(25 / 0.48) = 7.2
r = 0.48 * c = 3.5
所以(四舍五入后)答案是 4 行 7 列。
我正在构建一个从一系列图像创建精灵的应用程序sheet。目前,该应用程序需要由用户指示列数,但我想添加一个自动建议此参数的选项,它允许获得几乎正方形的精灵sheet。 如果图像是方形的,则图像总数的平方根就足够了,但事实并非如此。 图片的尺寸必须相同,但可以高大于宽或相反。 例如:精灵sheet有一个行走的角色,每张图片高331,宽160。帧数为25。 我应该找到一种算法来建议列(和行)的数量,使我能够获得尽可能正方形的 sheet 。 不幸的是,我没有代码可以展示,因为我不知道要进行什么样的推理。 您对工作有什么建议吗?
在数学上,这是一个有趣的问题。
我没有时间仔细考虑,但这是我的两分钱:
设精灵的宽高分别为w和h,设精灵的个数为n.
如果将它们放在由 c 列和 r 行组成的网格中,则网格的总宽度将为 cw和总高度rh。您希望商 cw/rh 尽可能接近 1。
现在,如果你自由选择c和r,网格单元格的数量,N := cr ,可能略大于 n。在大多数情况下,我希望您接受最后一行部分留空。
由于N接近n,
因此,我们想要找到 c 使得
越小越好。显然这发生在
因此,如果让列数为 √(nh/w) 四舍五入到最接近的整数,您可能会得到一个相当正方形的网格。
基本思路是,如果图像高度是宽度的两倍,则需要的列数是行数的两倍。
如果:
- q 是图像比例 (width/height)
- c是列数
- r 是行数
- n为图片总数
那么我们有:
r / c = q 和 r * c = n
几次换人后:
c = sqrt(n / q)
r = q * c
在你的例子中,q = 160 / 331 = 0.48
c = sqrt(25 / 0.48) = 7.2
r = 0.48 * c = 3.5
所以(四舍五入后)答案是 4 行 7 列。