n个n方形中n个对象的排列

时间:2010-03-17 14:18:45

标签: math

如果有多个对象,如何排列它以使行x列中的每个对象数量形成一个近似正方形?

exp:14个对象排列如下:

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

5 个答案:

答案 0 :(得分:6)

拿平方根的细胞?

在python中:

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

返回:

>>> from math import ceil
>>> ceil(14**(.5))
4.0

答案 1 :(得分:2)

获取项目数的平方根:

n = 14 ^ 0.5 ~ 3.7417

四舍五入到最接近的整数:

n = ceil(14 ^ 0.5) = 4

现在只需将项目排列在n个项目的行中,直到用完为止。

答案 2 :(得分:2)

这取决于。假设列数应该等于或大于行数,则以下计算列数(以伪代码形式):

Ceiling(Sqrt(n))

其中n是项目数。

答案 3 :(得分:1)

给定n个对象,得到的“square”的大小为ceil(sqrt(n)),n = 0(不绘制任何东西)或n = 1(仅1x1平方)的特殊快捷情况)。

此外,问题标题有点误导。除非N为1,否则永远不能在NxN方格中排列N个对象。

答案 4 :(得分:1)

如果您希望将网格居中,那么您必须提前知道您有多少行,这个功能(它的javascript,但我认为它应该很容易移植到另一种语言)将生成一个位置网格,并支持居中和间距。

在伪代码中

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

如果centerfalse,则该函数将生成类似这样的内容(o是原点):

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

如果centertrue

+———————+
|       |
|  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
    })
}