好的,这就是我想要完成的事情。说我有100个项目。我想创建一个“网格”(每个项目由一个x,y点组成)。我希望网格尽可能接近正方形。 是否有任何类型的数学来确定网格宽度,网格高度只需要一个数字?(按网格宽度和高度我的意思是x项目的数量,以及Y项目的数量)
现在我想一下,取数字的平方根是有效的,比如varI = sqrt(45),从varI中删除小数位... X = varI ...然后Y将是varI 1?
答案 0 :(得分:3)
平方根正是你所需要的。
N
x=floor(sqrt(N))
y=raise(N/x)
这是具有多于N个位置且最接近正方形的最小矩形。
现在......如果你想找到一个正好有N个位置并且最接近正方形的矩形......这是一个不同的问题。
您需要找到最接近的因子N,x
您必须遍历N的因子并找到最接近sqrt(N)的因子。然后矩形是x乘N / x,两个整数。
答案 1 :(得分:2)
这里有几个问题需要考虑。如果您希望网格尽可能为正方形,对于许多N,它将包含空单元格。一个简单的例子是N = 10。您可以为它创建一个3x4网格,但它将有两个空单元格。另一方面,2x5网格将没有空单元格。一些Ns(素数)在网格中总是有空单元格。
但是如果你只是想要这个方块并且不关心空场那么一般是的,你应该采用平方根。说你的号码是N.然后,取R = int(sqrt(N))
。接下来,进行整数除法N/R
,取商并将1加1。这是C
。网格为RxC
。请注意,当N
为正方形(如100)时,这是一种特殊情况,因此请勿向商添加1。
示例:
N = 40
R = int(sqrt(N)) = 6
C = int(40 / 6) + 1 = 7
grid is 6x7
答案 2 :(得分:1)
我也希望解决这个问题,因为html / css中的网格具有固定的尺寸和N个项目适合的位置。我最终在javascript中创建了自己的脚本。
如果您对我使用的方法和数学感兴趣,可以阅读http://machinesaredigging.com/2013/05/21/jgridder-how-to-fit-elements-in-a-sized-grid/,这些都记录在那里。我使用递归并且它工作得非常好,您可以使用相同的方法为您自己的语言。希望这会有所帮助。
答案 3 :(得分:0)
我探索了Eli的答案并发现了一些我想指出的内容。为了通用性,只有当R x C(C = int(N / R))不完全为N时,才必须将1加到C.因此,例外包括平方根和数字都是正确的乘积两个整数。
例如:
N = 12
R = 3
C = 4 (int(N/R))
希望它有所帮助。