Вычисление # или строк и столбцов - PullRequest
8 голосов
/ 16 июня 2011

У меня есть # изображений, которые я склеиваю в лист спрайта, как я могу рассчитать количество строк и столбцов, чтобы они одинаково поместились в четном прямоугольнике (без пробелов)?

Некоторыепримеры:

6 изображений должны стать 2 строками, 3 столбца

7 изображений должны стать 1 строками, 7 столбцов

8 изображений должны стать 2 строками, 4 столбцами

9 изображений должны стать 3 строками, 3 столбцами

10 изображений должны стать 2 строками, 5 столбцами

Надеюсь, это поможет объяснить это.

Идеи

Ответы [ 6 ]

12 голосов
/ 16 июня 2011

Вот очень быстрый и простой алгоритм (где N - количество изображений)

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

И rows - количество необходимых строк.Очевидно, столбцы можно найти с помощью N / rows.

Надеюсь, это поможет!

0 голосов
/ 16 июня 2011

Поскольку маловероятно, что для начала у вас будет большое число, существует множество способов его факторинга.

См. Лучший способ найти все факторы заданного числа в C # для некоторых из них.

Самое простое это: - Цикл от 1 до квадратного корня из номер, позвоните в индекс "я".

  • если число mod i равно 0, добавьте i и число / я к списку факторов.

Это даст вам все целые числа, которые делят ваше число N. «Другое» число, конечно, получается делением N на это целое число.

Затем вам нужно выбрать лучшую пару согласно некоторому правилу. Вы можете выбрать те с наименьшей разницей: если a * b = N, выберите те с наименьшим абсолютным значением (a-b)

0 голосов
/ 16 июня 2011

Каков твой приоритет? Вы хотите, чтобы разница между высотой, шириной была минимальной или чем-то подобным?

Учитывая количество n изображений. Вы должны взять каждое число от 1 до sqrt (n). Если n можно разделить на i (n% i == 0), делите и увеличивайте мощность массива [i] каждый раз, когда он делится. Если n больше не может быть разделено на i (то есть n% i! = 0), я делю еще раз.

Вы должны получить все делители и их наибольшую силу в заданном числе n.

Составьте их комбинации, и вы получите размеры своего квадрата.

0 голосов
/ 16 июня 2011

Хорошо посмотрим, если число простое, вы хотите иметь 1 строку с x столбцами, где x - простое число. Иначе, если число является идеальным квадратом, строки будут корнем квадратным из числа на квадратный корень из числа (9 == 3x3). Остальное множит остаток.

0 голосов
/ 16 июня 2011

Похоже, вам нужно найти все пары факторов числа, а затем выбрать пару, которая даст вам наиболее «желательное» соотношение строк: столбцов.

Так, например:

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;
    }
  }
}
0 голосов
/ 16 июня 2011

Взгляните на Целочисленная факторизация

Может быть, это то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...