计算#或行和列

时间:2011-06-16 19:21:16

标签: algorithm language-agnostic

我有一组我正在拼接成精灵表的图像,如何计算行数和列数以均匀地拟合在一个偶数矩形中(没有空格)?

一些例子:

  

6张图片应该变为2行,3列

     

7张图片应该分为1行,7列

     

8张图片应该变为2行,4列

     

9张图片应该变为3行,3列

     

10张图片应该分为2行,5列

希望这有助于解释它。

想法?

6 个答案:

答案 0 :(得分:12)

这是一种非常快速简便的算法(其中N是图像数量)

rows = floor(sqrt(N))
while(N % rows != 0)
     rows = rows - 1

rows将是所需的行数。显然可以使用N / rows找到列。

我希望这有帮助!

答案 1 :(得分:0)

好像你必须找到这个数字的所有因子对,然后选择那对,给你最“理想”的行:列比。

例如:

bestRows = 1
bestRatio = ((double) 1) / N;
for (int i : 1 to N) {
  if ((N % i) == 0) {
    r = N % i
    c = N / i
    ratio = ((double) r) / N;
    if (firstIsBetter(ratio, bestRatio)) {
      bestRows = r;
      bestRatio = ratio;
    }
  }
}

答案 2 :(得分:0)

好好看看,如果数字是素数,你想要有x行的1行,其中x是素数。否则,如果数字是完美的正方形,则行将是数字的平方根(数字的平方根)(9 == 3x3)。其余因素也是如此。

答案 3 :(得分:0)

您的首要任务是什么?你想让它的高度,宽度之间的差异最小,或者类似的东西?

给出图像的数量n。你应该从1到sqrt(n)取每个数字i。如果n可以除以i(n%i == 0),则每次除数时除以并递增一个数组幂[i]。如果n不能再被i(也就是n%i!= 0)增加,则i再次除以。

你应该得到所有的除数和他们在给定数字n中的最大力量。

组合这些,你将获得你的方块的尺寸。

答案 4 :(得分:0)

由于您不太可能开始使用大量数据,因此您可以通过多种方式对其进行分解。

请参阅Best way to find all factors of a given number in C#了解其中一些内容。

最简单的是:   - 从1循环到平方根    号码,拨打索引“i”。

  • 如果number mod i为0,则添加i和 number / i到因子列表。

这将为您提供除数N之外的所有整数。“其他”数字当然是通过将N除以该整数得到的。

然后,您需要根据某些规则选择最佳对。您可以选择差异最小的那些:如果a * b = N,选择绝对值最小值为(a-b)的那些

答案 5 :(得分:-1)

查看Integer Factorization

也许这就是你所需要的。