1

我有一个矩形区域,我想容纳不同数量的方形项目。这是帮助解决问题的图像。

在此处输入图像描述

谁能帮我用公式计算物品的宽度/高度(Bw/Bh)?

我试过√(WxH/N)。

但是以 W = 1400、H = 380、N = 16 为例,它给了我 182。但 1400/182 只给了 7.7 框宽和 2.08 高(乘以我得到我的 16,但我需要它们适合该区域) .

有任何想法吗?

编辑:

越来越近我认为我真正需要知道的是基于纵横比以及如何计算出容纳项目的网格。例如,254 x 133 下面的 16 个框是 6 x 3。

在此处输入图像描述

编辑:

我现在编写了以下代码来计算网格(javascript)。问题是它使用的是跟踪和错误方法。

var W = 254,
    H = 133,
    N = 16,
    Bh = H;

while( ((Math.floor(W/Bh)) * (Math.floor(H/Bh))) < N ){
    Bh--;            
}

alert('Columns: '+Math.floor(W/Bh)+', Rows: '+Math.floor(H/Bh)+', Bow width: '+(Bh) );

请参阅http://jsfiddle.net/GVp4X/以测试代码。我仍然确定有更好的方法。

4

1 回答 1

1

您应该为(小)框的纵横比定义一些有意义的约束。例如,您总是可以将大盒子垂直或水平分成N个部分,但我认为这不是您想要做的。对于素数 N,这是你唯一能做的。在这种情况下添加空框的“填充”可以吗?

编辑:

如果 N 相当小,您可以遍历所有可能的 w,每行的框数,并针对错误的纵横比和未使用的框数最小化一些合适的惩罚函数。这是一个例子(在 Matlab 代码中)

N = 123;
target_aspect = 4/3;
W = 80;
H = 60;

min_F = inf;
for w=1:N,
   h = ceil(N/w);
   Bh = H/h;
   Bw = W/w;

   padding = h*w-N;
   aspect = Bw / Bh;

   %# The penalty function to minimize
   F = abs(aspect-target_aspect) + padding * 0.05;

   if F < min_F,
       min_F = F;
       best_w = w;        
   end
end

编辑2:

如果允许空白空间(“ypadding”),例如在底部边缘,也可以使用固定的纵横比来执行此操作。然后循环体可能类似于

Bw = W/w;
Bh = Bw/aspect;
h = floor(H/Bh);

n = w*h;

if n >= N,
   ypadding = H-Bh*h;
   padding = h*w-N;

   %# penalty function
   F = (ypadding/Bh)*0.3 + (padding / w)*0.2

   if F < min_F,
      min_F = F;
      best_w = w;
   end        
end

在这种情况下,也可以通过求解二次问题来减小 w 的搜索范围。

于 2012-07-29T13:36:38.417 回答