如果有多个对象,如何排列它以使行x列中的每个对象数量形成一个近似正方形?
exp:14个对象排列如下:
0 0 0 0
0 0 0 0
0 0 0 0
0 0
答案 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
如果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
})
}