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

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 の探索範囲を縮小することもできます。

于 2012-07-29T13:36:38.417 に答える