Расположение n объектов в квадрате n x n - PullRequest
1 голос
/ 17 марта 2010

если есть кратный объект, как расположить его так, чтобы каждое число объектов в столбце строки x образовывало квадрат?

exp: 14 объектов располагаются примерно так:

0 0 0 0
0 0 0 0
0 0 0 0
0 0

Ответы [ 5 ]

6 голосов
/ 17 марта 2010

Возьмите лимит квадратного корня?

в питоне:

import math
ceil(14**(.5))

Что возвращает:

>>> from math import ceil
>>> ceil(14**(.5))
4.0
2 голосов
/ 17 марта 2010

Это зависит. Предполагая, что количество столбцов должно быть равно или больше, чем количество строк, тогда следующее вычисляет количество столбцов (в псевдокоде):

Ceiling(Sqrt(n))

где n - количество предметов.

2 голосов
/ 17 марта 2010

Получите квадратный корень из числа предметов:

n = 14 ^ 0.5 ~ 3.7417

Округление до ближайшего целого числа:

n = ceil(14 ^ 0.5) = 4

Теперь просто расположите элементы в рядах из n элементов, пока не закончится.

1 голос
/ 13 марта 2017

Если вы хотите центрировать сетку, вам нужно знать, сколько строк у вас будет заранее, эта функция (это javascript, но я думаю, что ее легко перенести на другой язык) сгенерирует сетку из позиционирует и поддерживает центрирование и расстояние.

в псевдокоде

columns = Ceiling(Sqrt(n))
rows    = (columns - 1) if (Round(Sqrt(n)) < columns) else columns

Если center равно false, функция сгенерирует что-то вроде этого (o является источником):

+———————+
|oxx    |
|xxx    |
|xx     |
|       |
|       |
+———————+

Если center равно true

+———————+
|       |
|  xxx  |
|  xox  |
|   x   |
|       |
+———————+

код

/**
 * Creates a grid of positions for the given items count and size.
 * It assumes items anchor are centered.
 *
 * @param {number}  x             - The grid x position
 * @param {number}  y             - The grid y position
 * @param {number}  count         - The number of positions you wish to create
 * @param {number}  size          - The item size
 * @param {boolean} [center=true] - If true wil center the grid according to `x`, `y`
 * @param {number}  [spacing=0]   - Item spacing
 * @return {Array.<{x: number, y: number}>} The generated positions
 */
export const makeGrid = (x, y, count, size, { center = true, spacing = 0 } = {}) => {
    // avoid computing trivial cases
    if (count === 0) return []
    if (count === 1) return [{ x, y }]

    const sqrt           = Math.sqrt(count)
    const columns        = Math.ceil(sqrt)
    const rows           = Math.round(sqrt) < columns ? columns - 1 : columns
    const sizeAndSpacing = size + spacing

    let offsetX = x
    let offsetY = y

    // if grid is centered apply offset according to `columns` and `rows`
    if (center === true) {
        offsetX -= (columns - 1) * sizeAndSpacing * .5
        offsetY -= (rows    - 1) * sizeAndSpacing * .5
    }

    let column = 0
    let row    = 0

    return _.range(count).map(() => {
        // if we're on last row's first column and grid is centered
        if (row === rows - 1 && column === 0 && center === true) {
            // if last row's items doesn't completely fill the line
            // we apply an extra offset to center them
            const modulus = count % columns
            if (modulus > 0) {
                offsetX += (columns - modulus) * sizeAndSpacing * .5
            }

        }
        const pos = {
            x: offsetX + column * sizeAndSpacing,
            y: offsetY + row    * sizeAndSpacing,
        }

        column++
        if (column === columns) {
            column = 0
            row++
        }

        return pos
    })
}
1 голос
/ 17 марта 2010

Учитывая n объектов, размер получившегося "квадрата" равен ceil(sqrt(n)), со специальными сочетаниями клавиш для n = 0 (ничего не рисовать) или n = 1 (просто квадрат 1x1).

Кроме того, название вопроса немного вводит в заблуждение. Вы никогда не можете расположить N объектов в квадрате NxN, если N не равно 1.

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