layout - 给定容器大小和项目固定纵横比的计算网格布局的算法
问题描述
我正在寻找一种算法来计算网格布局。最后我会用 javascript 编写它,但我正在寻找一个不可知论语言的答案。
我有一个容器(具有固定尺寸)和可变数量的元素。所有元素都具有相同的固定纵横比,并且所有元素将具有相同的宽度/高度,但它会根据元素数量的比例发生变化以适应容器。
作为一个加号,我想知道每个元素之间的边距以平均间隔它们。
理想情况下,我想象一个具有此签名的函数:
function computeLayout(containerWidth, containerHeight, numElements) {
// ...
return { itemWidth, itemHeight, margin }
}
解决方案
设元素宽高比为C
。我们需要用给定的和将n
矩形元素放在矩形容器上。Width
Height
设未知元素高度为h
, 宽度w = C * h
每行网格都包含nr
元素
nr = Floor(Width / (C * h)) // rounding down
每列包含nc
行
nc = Floor(Height / h)
所以我们可以写不等式来为n
元素提供位置:
n <= nc * nr
n <= Floor(Width / (C * h)) * Floor(Height / h)
并解决它h
(所以找到最大可能h
值)
的初始近似值h
:
h0 = Ceil(Sqrt(Width * Height / (n * C))) //rounding up
然后我们可以递减h
值直到不等式变为真,如下所示:
while (n > Floor(Width / (C * h)) * Floor(Height / h))
h--;
边距引入了额外的可变性。我们可以预定义边距值并在nc, nr
公式中使用它(使用h + margin
, C * h + margin
)
如果您想获得最小的保证金(可能为零)-只需根据Height
和nr*h
推荐阅读
- html - dateClick 未以全日历角度发出
- vb.net - 在 VB.Net 中添加验证器后,.aspx 页面不加载
- maven - 春季云数据流和远程存储库的问题:已安装应用程序但我无法部署流
- wordpress - 受益于在 WordPress Gutenberg 块中使用属性的选择器属性
- reactjs - React App突然无法编译-scss无法导入
- python - Python PermissionError 上传到 Azure Datalake 文件夹
- python - 未在 Amazon EC2 中为 Django 加载静态文件
- python - Scribus 专色 PDF
- html - 使用 flexbox 在单行中获取具有不同高度的项目的布局
- spring - 通过另一个注释设置时,Spring Boot 无法识别模式