Как подобрать размер прямоугольника заполняемого N одинаковыми прямоугольниками?
Необходимо высчитать размер прямоугольника, в который гарантировано поместится определённое количество копий произвольного прямоугольника.
Стороны результирующего прямоугольника должна быть степенью двойки. Желательно добиться того, чтоб результирующий прямоугольник был приближён к квадрату.
Все прямоугольники должны быть ориентированы по осям.
Меня хватило только на то, чтоб начать заполнять пространство и просто увеличивать размер при переполнении. Но при некоторых значениях на выходе получается уж слишком растянутый прямоугольник.
const nextPow2 = num => num > 0 && (num & num - 1) === 0 ? num : 1 << 32 - Math.clz32(num);
const textureSize = (w, h, count) => {
let xw = nextPow2(w);
let xh = nextPow2(h);
let x = 0;
let y = 1;
for (let i = 0; i < count; i++) {
x++;
if (x * w <= xw) {
continue;
}
if (x < y) {
xw *= 2;
continue;
}
y++;
if (y * h > xh) {
x = 0;
xh *= 2;
}
}
const col = Math.floor(xw / w);
const row = Math.ceil(count / col);
return [nextPow2(col * w), nextPow2(row * h), col, row];
};
console.log(textureSize(128, 10, 12));
Источник: Stack Overflow на русском