function pick(tiles, grid_width, grid_height)
{
var max_area = ~~(grid_width * grid_height/tiles);
for (var area = max_area; area > 0; area--)
{
var result = [grid_width * grid_height - area * tiles];
divisors_do(area,
function (tile_width)
{
var tile_height = area/tile_width;
if (tile_width > grid_width) return true;
if (tile_height > grid_height) return true;
var count_horizontal = ~~(grid_width/tile_width);
var count_vertical = ~~(grid_height/tile_height);
if (count_horizontal * count_vertical < tiles) return true;
result.push([
tile_width, tile_height,
count_horizontal, count_vertical
]);
});
if (result.length > 1) return result;
}
return null;
}
function divisors_do(x, f)
{
var history = [1];
if (f(1) === false) return false;
// for each prime factor
return prime_factors_do(x,
function(prime, primePower)
{
var len = history.length;
for (var iHistory = 0; iHistory < len; iHistory++)
{
var divisor = history[iHistory];
for (var power = 1; power <= primePower; power++)
{
divisor *= prime;
history.push(divisor);
if (f(divisor) === false) return false;
}
}
return true;
});
}
function prime_factors_do(x, f)
{
for (var test = 2; test*test <= x; test++)
{
var power = 0;
while ((x % test) == 0)
{
power++;
x /= test;
}
// If we found a prime factor, report it, and
// abort if `f` returns false.
if (power > 0 && f(test, power) === false)
return false;
}
if (x > 1) return f(x,1);
return true;
}
예 :
> pack(5, 12, 8);
[16, [2, 8, 6, 1], [4, 4, 3, 2]]
> pack(47,1024,768);
[16384, [64, 256, 16, 3], [128, 128, 8, 6], [256, 64, 4, 12], [512, 32, 2, 24]]
첫번째 예는 두 개의 동등한 결과를 생성 3 두 행에 충전 6 개
의 4x4 타일의 한 행에 충전
각각 하나의 슬롯이 사용되지 않은 상태로 남겨지며 총 16 개의 셀이 사용되지 않습니다.
### ### ### ### ### . . ####### ####### #######
### ### ### ### ### ####### ####### #######
### ### ### ### ### . . ####### ####### #######
### ### ### ### ### ####### ####### #######
### ### ### ### ### . . ####### ####### #######
### ### ### ### ### ####### ####### #######
### ### ### ### ### . . ####### ####### #######
### ### ### ### ###
### ### ### ### ### . . ####### ####### . . .
### ### ### ### ### ####### #######
### ### ### ### ### . . ####### ####### . . .
### ### ### ### ### ####### #######
### ### ### ### ### . . ####### ####### . . .
### ### ### ### ### ####### #######
### ### ### ### ### . . ####### ####### . . .
도움이 될 수 있습니다. 그 비슷한 질문이지만 완전히 동일하지는 않습니다. 그래도 아이디어를 줄 수 있습니다. http://stackoverflow.com/questions/3513081/create-an-optimal-grid-based-on-n-items-total-area-and-hw-ratio/ – Chris
더 작은 직사각형은 특정 높이/너비 또는 이와 비슷한 것? – Chris
@Chris, 글쎄, 1 픽셀 너비 200 높이, 예를 들면 ... – Alnitak