gpt4 book ai didi

使用缩放图 block 最大化矩形区域覆盖的算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:29:06 24 4
gpt4 key购买 nike

我有 N 个可缩放的方形图 block (按钮),它们需要放置在固定大小的矩形表面(工具箱)内。我想以相同的尺寸展示按钮。

我如何才能找到最佳尺寸的瓷砖,以提供被瓷砖覆盖的矩形表面的最大面积。

最佳答案

WH是矩形的宽度和高度。

s是正方形的边长。

然后是方格数n(s)您可以放入矩形的是 floor(W/s)*floor(H/s) .你想找到 s 的最大值为此 n(s) >= N

如果根据 s 绘制方 block 数你会得到一个分段常数函数。不连续点的值是 W/iH/j , 其中ij遍历正整数。

您想找到最小的 i为此 n(W/i) >= N ,同样最小的j为此 n(H/j) >= N .将这些最小值称为 i_minj_min .那么最大的W/i_minH/j_mins你要的那个。

s_max = max(W/i_min,H/j_min)

寻找i_minj_min ,只需进行强力搜索:对于每个,从 1 开始,测试并递增。

如果N很大,搜索i可能会令人反感的和j是从 1 开始的(尽管很难想象在性能上会有什么明显的差异)。在这种情况下,我们可以按如下方式估算起始值。首先,瓷砖面积的粗略估计是 W*H/N , 对应于 sqrt(W*H/N) 的一侧.如果W/i <= sqrt(W*H/N) , 然后 i >= ceil(W*sqrt(N/(W*H))) , 同样 j >= ceil(H*sqrt(N/(W*H)))

因此,与其在 i=1 开始循环和 j=1 , 我们可以在 i = ceil(sqrt(N*W/H)) 启动它们和 j = ceil(sqrt(N*H/W))) . OP 建议 roundceil 效果更好- 最坏的情况是额外的迭代。

这是用 C++ 拼写的算法:

#include <math.h>
#include <algorithm>
// find optimal (largest) tile size for which
// at least N tiles fit in WxH rectangle
double optimal_size (double W, double H, int N)
{
int i_min, j_min ; // minimum values for which you get at least N tiles
for (int i=round(sqrt(N*W/H)) ; ; i++) {
if (i*floor(H*i/W) >= N) {
i_min = i ;
break ;
}
}
for (int j=round(sqrt(N*H/W)) ; ; j++) {
if (floor(W*j/H)*j >= N) {
j_min = j ;
break ;
}
}
return std::max (W/i_min, H/j_min) ;
}

以上是为了清楚起见而写的。代码可以大大收紧,如下所示:

double optimal_size (double W, double H, int N)
{
int i,j ;
for (i = round(sqrt(N*W/H)) ; i*floor(H*i/W) < N ; i++){}
for (j = round(sqrt(N*H/W)) ; floor(W*j/H)*j < N ; j++){}
return std::max (W/i, H/j) ;
}

关于使用缩放图 block 最大化矩形区域覆盖的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3859891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com