我有N个矩形,它们的尺寸都相同为rectWidth*rectHeight。
我有一个区域,其尺寸为areaWidth*areaHeight。
我想将这N个矩形放入该区域内,保持矩形的纵横比,调整矩形大小以使其适合区域内。
在矩形之间,我希望有一个间距为space。
如何确定矩形的尺寸,以便它们都适应矩形内并保持其纵横比?
我有N个矩形,它们的尺寸都相同为rectWidth*rectHeight。
我有一个区域,其尺寸为areaWidth*areaHeight。
我想将这N个矩形放入该区域内,保持矩形的纵横比,调整矩形大小以使其适合区域内。
在矩形之间,我希望有一个间距为space。
如何确定矩形的尺寸,以便它们都适应矩形内并保持其纵横比?
c <= 1
和在第一个循环中检查可行性(即没有“水槽”以外的空闲空间)。你们都假设一个方向将被填充(除了“水槽”以外没有空闲空间),在每个方向上迭代所有可能的矩形数量,取最大可行值,然后取两个方向的最大结果。无论你像 Timothy 一样做两个 O(n) 循环和一个 O(2n) 循环,还是像你一样做两个 O(n) 循环但指令数翻倍,都是严格相同的。 - Cimbalivar areaHeight = window.innerHeight; //set here your area height
var areaWidth = window.innerWidth; //set here your area width
var N = 216; //set amount of rectangles you want to fit
var rectRatio = 9/4; //set rectangle ratio
var gutter = [5, 10]; //set x and y spacing between rectangles
var cols, rows, rectHeight, rectWidth; //variables that we need to calculate
该函数假设矩形网格(画布)始终适合容器区域的高度。您将行数提供给函数,它会计算矩形大小并确定画布宽度是否大于容器宽度。如果画布更大,则会增加行数并再次调用该函数。
function rowIterator(iterator) {
rows = iterator;
cols = Math.ceil(N/rows);
rectHeight = (areaHeight - (rows-1)*gutter[1])/rows;
rectWidth = rectHeight*rectRatio;
if (cols * rectWidth + (cols - 1)*gutter[0] > areaWidth) {
rowIterator(rows + 1);
}
}
rowIterator(1); //feed initial value
var size1 = [rectWidth, rectHeight];
如果您也关心查找最大矩形大小,而不仅仅是适合它,那么迭代还应该针对列进行,并选择更大的矩形大小:
function colIterator(iterator) {
cols = iterator;
rows = Math.ceil(N/cols);
rectWidth = (areaWidth - (cols - 1)*gutter[0])/cols;
rectHeight = rectWidth/rectRatio;
if (rows * rectHeight + (rows - 1)*gutter[1] > areaHeight) {
colIterator(cols + 1);
}
}
colIterator(1);
var size2 = [rectWidth, rectHeight];
两个迭代器的总迭代次数大约为N,最大矩形大小为:
optimalRectSize = [Math.max(size1[0], size2[0]), Math.max(size1[1], size2[1])]