算法: 大长方形最多可以放多少个个小的长方形,大小长方形长宽都只有一种,托盘最大最大化摆放箱数
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)
update 2024年12月10日
托盘和纸箱都要旋转后对比最大数量
def box_calc(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)
maxPosY = posY
if not maxDone:
maxPosX = posX
maxDone = True
posX = 0
posY = round(posY + sh)
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)
pass
return len(recArray), recArray,(rw, rh)
def get_box_rotate_num(rw, rh, sw, sh):
"""
比较数量, 有4种组合
"""
dict_location = {}
num1,list_rectangle1,outer1 = box_calc(rw, rh, sw, sh)
dict_location.update({num1: (list_rectangle1, outer1)})
# 考虑到巨形旋转的情况
num2,list_rectangle2,outer2 = box_calc(rw, rh, sh, sw)
dict_location.update({num2: (list_rectangle2, outer2)})
num3,list_rectangle3,outer3 = box_calc(rh, rw, sw, sh)
dict_location.update({num3: (list_rectangle3, outer3)})
# 考虑到巨形旋转的情况
num4,list_rectangle4,outer4 = box_calc(rh, rw, sh, sw)
dict_location.update({num4: (list_rectangle4, outer4)})
max_num = max(dict_location.keys())
list_rectangle,outer = dict_location[max_num]
return list_rectangle,outer
本文来自博客园,作者:那时一个人,转载请注明原文链接:https://www.cnblogs.com/qianxunman/p/17937121