https://www.engineeringtoolbox.com/smaller-rectangles-within-larger-rectangle-d_2111.html
function calculateRectangle() {
var rw = parseFloat($j('#rw').val());
var rh = parseFloat($j('#rh').val());
var sw = parseFloat($j('#sw').val());
var sh = parseFloat($j('#sh').val());
var cs = parseFloat($j('#cs').val());
if (rw > 0 && rh > 0 && sh > 0 && sw > 0) {
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
context.clearRect(0, 0, canvas.width, canvas.height);
var scale = canvas.width / rw;
if (canvas.height / rh < scale) scale = canvas.height / rh;
var rectangleOuter = new Rectangle(0, 0, rw, rh);
drawRectangle(rectangleOuter, 'yellow', 2, 'black');
var maxPosX = 0;
var maxDone = false;
var maxPosY = 0;
var recArray = [
];
if ((sw + cs) < rw && (sh + cs) < rh) {
var posX = 0 + cs;
var posY = 0 + cs;
do {
if (posY + 2 * sh + cs > rh) {
if (posY + sw <= rh) {
var swt = sw;
sw = sh;
sh = swt;
}
}
do {
var rec = new Rectangle(posX, posY, sw, sh);
recArray.push(rec);
posX = Math.round((posX + sw + cs) * 1000) / 1000;
maxPosY = posY;
} while (posX + sw + cs <= rw);
if (!maxDone) {
maxPosX = posX;
maxDone = true;
}
posX = 0 + cs;
posY = Math.round((posY + sh + cs) * 1000) / 1000;
} while (posY + sh <= rh);
if (maxPosX + sw <= rw) {
posY = 0 + cs;
posX = maxPosX;
if (sw > sh) {
var sht = sw;
sw = sh;
sh = sht;
}
do {
var rec = new Rectangle(posX, posY, sw, sh);
recArray.push(rec);
posY = Math.round((posY + sh + cs) * 1000) / 1000;
} while (posY + sw <= maxPosY);
} //$j("#results").html("Maximum number of smaller rectangles inside larger rectangle: <b><u>" + recArray.length + "</u></b>");
var msg = '<p style="padding-left: 30px;">Maximum number of smaller rectangles inside larger rectangle: <span class="result"><u>' + recArray.length + '</u></span></p>';
var areaLargeRectangle = rw * rh;
var areaSmallRectangle = sw * sh;
var areaAllRectangles = areaSmallRectangle * recArray.length;
msg += '<p style="padding-left: 30px;">Area Rectangle (in<sup>2</sup>, mm<sup>2</sup>, m<sup>2</sup>): <span class="result">' + Conv.rounding(areaLargeRectangle) + '</span></p>';
msg += '<p style="padding-left: 30px;">Area Small Rectangle (in<sup>2</sup>, mm<sup>2</sup>, m<sup>2</sup>): <span class="result">' + Conv.rounding(areaSmallRectangle) + '</span></p>';
msg += '<p style="padding-left: 30px;">Area all Rectangles (in<sup>2</sup>, mm<sup>2</sup>, m<sup>2</sup>): <span class="result">' + Conv.rounding(areaAllRectangles) + '</span></p>';
msg += '<p style="padding-left: 30px;">Small Rectangles to Large Rectangle Area Ratio (%): <span class="result">' + Conv.rounding(100 * areaAllRectangles / areaLargeRectangle) + '</span></p>';
$j('#results').html(msg);
}
for (var i = 0; i < recArray.length; i++) {
drawRectangle(recArray[i], 'white', 1, ' #21618c ')
}
} else {
alert('Check values! Dimensions can not be 0.');
}
人家用js 实现了,后边用python 实现下
def main(rw, rh, sw, sh):
rw, rh, sw, sh = rw, rh, sw, sh
maxPosX = 0
maxDone = False
maxPosY = 0
recArray = []
posX, posY = 0, 0
if not (sw < rw and sh < rh):
raise Exception('长度设置不合理!')
while (posY + sh <= rh):
if (posY + 2 * sh > rh) and (posY + sw <= rh):
swt = sw
sw = sh
sh = swt
while (posX + sw <= rw):
rec = (posX, posY, sw, sh)
recArray.append(rec)
posX = round((posX + sw) * 1000) / 1000
maxPosY = posY
if not maxDone:
maxPosX = posX
maxDone = True
posX = 0
posY = round((posY + sh) * 1000) / 1000
if (maxPosX + sw <= rw):
posY = 0
posX = maxPosX
if (sw > sh):
sht = sw
sw = sh
sh = sht
while posY + sw <= maxPosY:
rec = (posX, posY, sw, sh)
recArray.append(rec)
posY = round((posY + sh) * 1000) / 1000
pass
print(len(recArray))
from pprint import pprint
pprint(recArray)
return len(recArray)
def main2(rw, rh, sw, sh):
num1 = main(rw, rh, sw, sh)
# 考虑大巨形旋转的情况
num2 = main(rh, rw, sw, sh)
print('最大数量:', max(num1, num2))
return max(num1, num2)
if __name__ == '__main__':
main2(96, 116, 27, 35)