算法: 大长方形最多可以放多少个个小的长方形,大小长方形长宽都只有一种,托盘最大最大化摆放箱数

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
posted @ 2023-12-31 00:16  那时一个人  阅读(86)  评论(0编辑  收藏  举报