我有一组我正在拼接成精灵表的图像,如何计算行数和列数以均匀地拟合在一个偶数矩形中(没有空格)?
一些例子:
6张图片应该变为2行,3列
7张图片应该分为1行,7列
8张图片应该变为2行,4列
9张图片应该变为3行,3列
10张图片应该分为2行,5列
希望这有助于解释它。
想法?
答案 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”。
这将为您提供除数N之外的所有整数。“其他”数字当然是通过将N除以该整数得到的。
然后,您需要根据某些规则选择最佳对。您可以选择差异最小的那些:如果a * b = N
,选择绝对值最小值为(a-b)的那些
答案 5 :(得分:-1)
也许这就是你所需要的。