2012-07-29 138 views
1

我有一个矩形区域,我想要适应一定数量的sqaure项目。这是一个图像来帮助解决这个问题。网格视图高度/宽度公式

enter image description here

谁能帮我用公式推来计算项目的宽度/高度(BW/BH)?

我试过√(WxH/N)。

但是用W = 1400,H = 380,N = 16的例子给了我182.但是1400/182只给出7.7格宽和2.08高(乘以16我得到它,但我需要它们以适合在区域内)。

任何想法?

编辑:

越来越近,我认为我真正需要的是根据各地的长宽比以及如何制定出适合的项目一格就知道了。例如。下面254 X 133 16个箱是6由3

enter image description here

编辑:

现在我已经写了下面的代码工作出网格(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/来测试代码。我仍然确定有更好的方法。

+0

为什么7.7差?你为什么会认为一定数量的盒子总是能很好地适应任何矩形? – 2012-07-29 13:27:40

+0

应该说,如果有剩余的空间,我不会感到困扰,那里几乎总会有,但我可以将盒子居中。 – Ben 2012-07-29 13:43:10

回答

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 

EDIT2:

另外,也可以与固定纵横比这样做,如果空的空间(“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的搜索范围也可以通过求解二次问题来减少。

+0

类似于我想出的。但是,如果您需要考虑目标方面+填充,则会更好一些。感谢您的时间,绝对值得投票。干杯 – Ben 2012-07-29 17:03:27