2012-07-29 212 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