Создать сетку из числа элементов - PullRequest
1 голос
/ 04 февраля 2010

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

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

Ответы [ 4 ]

4 голосов
/ 04 февраля 2010

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

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

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

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

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

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

2 голосов
/ 04 февраля 2010

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

Но если вы просто хотите квадрат и не заботитесь о пустых полях, то обычно да, вы должны взять квадратный корень. Скажите, что ваш номер 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
1 голос
/ 22 мая 2013

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

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

0 голосов
/ 16 августа 2016

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

Например:

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

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

...