Создать сетку из числа элементов

Хорошо, вот чего я пытаюсь добиться. Скажем, у меня есть 100 предметов. Я хочу создать «сетку» (каждый элемент, состоящий из точки x, y). Я хочу, чтобы сетка была как можно ближе к квадрату. Есть ли какая-либо математика для определения ширины сетки и высоты сетки, которая мне нужна всего одним числом? (Под шириной и высотой сетки я имею в виду количество элементов x и количество элементов Y)

Теперь, когда я думаю об этом, было бы эффективно извлечь квадратный корень из числа, скажем, varI=sqrt(45), удалить десятичный разряд из varI...X=varI... тогда Y будет varI+1?


person Kelly Elton    schedule 04.02.2010    source источник


Ответы (4)


Квадратный корень - это именно то, что вам нужно.

N
x=floor(sqrt(N))
y=raise(N/x)

Это минимальный прямоугольник, который имеет более N мест и находится ближе всего к квадрату.

Теперь... если вы хотите найти прямоугольник, который имеет ровно N мест и находится ближе всего к квадрату... это другая проблема.

Вам нужно найти коэффициент N, x, который ближе всего

Вы должны просмотреть факторы N и найти ближайший к sqrt (N). Тогда прямоугольник равен x на N/x, оба числа целые.

person Ezequiel    schedule 04.02.2010

Здесь необходимо рассмотреть несколько вопросов. Если вы хотите, чтобы ваша сетка была как можно более квадратной, для многих N в ней будут пустые ячейки. Простой пример: N=10. Вы можете создать для него сетку 3x4, но в ней будут две пустые ячейки. С другой стороны, сетка 2x5 не будет иметь пустых ячеек. Некоторые N (простые числа) всегда будут иметь пустые ячейки в сетке.

Но если вы просто хотите квадрат и не заботитесь о пустых полях, то, как правило, да, вы должны взять квадратный корень. Скажите, что ваш номер N. Затем возьмите R = int(sqrt(N)). Затем выполните целочисленное деление N/R, возьмите частное и прибавьте к нему 1. Это C. Сетка RxC. Обратите внимание, что когда N является квадратом (например, 100), это особый случай, поэтому не добавляйте 1 к частному.

Пример:

N = 40
R = int(sqrt(N)) = 6
C = int(40 / 6) + 1 = 7
grid is 6x7
person Eli Bendersky    schedule 04.02.2010
comment
Хорошая информация. Я считаю, что в моем случае лишние ячейки не были отрисованы (я даже не помню, над чем я вообще работал, ха-ха) - person Kelly Elton; 22.05.2013
comment
Как я мог добиться второго случая? Поиск наилучшей сетки с минимальными пустыми ячейками. - person Oswaldo Acauan; 19.02.2018

Я также пытался решить эту проблему для сетки в html/css с фиксированными размерами и в которой помещалось бы N элементов. Я закончил тем, что создал свой собственный скрипт для этого в javascript.

Если вам интересен метод и математика, которые я использовал, вы можете прочитать -grid/" rel="nofollow">http://machinesaredigging.com/2013/05/21/jgridder-how-to-fit-elements-in-a-sized-grid/, все это задокументировано там. Я использовал рекурсию, и она работает очень хорошо, вы можете использовать тот же метод для своего языка. Надеюсь это поможет.

person eloone    schedule 21.05.2013
comment
Я еще не смотрел, но спасибо, что поделились. Даже если это не поможет мне, надеюсь, это поможет другим людям, которые придут к нам. - person Kelly Elton; 22.05.2013

Я изучил ответ Эли и нашел кое-что, на что хотел бы обратить внимание. Ради общности к C нужно прибавлять 1 только в том случае, если R x C (C = int(N/R)) не равно точно N. Таким образом, исключение составляют как числа с квадратным корнем, так и числа, являющиеся в точности произведением два целых числа.

Например:

N = 12
R = 3
C = 4 (int(N/R))

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

person Daniel Casas-Orozco    schedule 16.08.2016