在子矩形的类别中分割矩形

时间:2019-05-29 13:24:21

标签: algorithm

给出一个矩形,我想将其分割为n个给定数量的子矩形,其中:

  • a是应该具有定义的z SMALL区域的子矩形的数量
  • b是应该具有定义的y MEDIUM区域的子矩形的数量
  • c是应该具有定义的x BIGGER区域的子矩形的数量 也许我应该能够定义d和e。但是,让我们暂时离开它们。

“定义的区域”是指几何区域应该相同,但是矩形可以具有不同的形状。 请问您在这种情况下建议采用哪种算法。

我应该具有类似PSEUDO代码的功能:

RectBoundaries[] function getRectangles(screenRectangle, amountOfRectangleCategories, amountOfRectanglesPerCategory[]) {
   function1 => getRectanglesForCategory1(amountOfRectanglesPerCategory[0], screenRectangle)
   function2 => getRectanglesForCategory2(amountOfRectanglesPerCategory[1], screenRectangle)
   function3 => getRectanglesForCategory3(amountOfRectanglesPerCategory[2], screenRectangle)

   return function1 + function2 + function3;
}

编辑: 如何将矩形拆分为多个(定义数量的)递减的较小矩形。

1 个答案:

答案 0 :(得分:0)

根据您的问题,我了解您首先将主要区域分为3个区域。一大,一中,一小。鉴于此,我用Java语言编写了一个小算法,希望它能解决您的问题

let canvas = document.getElementById("output");
let ctx = canvas.getContext('2d');
ctx.strokeStyle = 'rgb(255, 255, 255)';

function draw(rect) {
  ctx.rect(rect[0], rect[1], rect[2], rect[3]);
  ctx.stroke();
}

function splitArea(rect, nbRect) {
  let [nbColumns, nbLines] = getBestRatio(nbRect);
  let x=rect[0];
  let y=rect[1];
  let width = rect[2]/nbColumns;
  let height = rect[3]/nbLines;
  let result = new Array();

  
  for(let i=0; i<nbLines; i++) {
    for(let j=0; j<nbColumns; j++) {
      result.push([x+j*width, y+i*height, width, height]);
    }
  }
  
  return result;
}

function getBestRatio(nb) {
  for(let i=Math.round(Math.sqrt(nb)); i>0; i--) {
    if(nb%i==0) {
      return [i, nb/i];
    }
  }
}

//main rectangle
let rect = [10, 10, 280, 280]; //x, y, width, height

// 3 differents area
let bigArea = [rect[0], rect[1], rect[2], rect[3]*2/3]; // 2∕3 area
let mediumArea = [rect[0], rect[1]+rect[3]*2/3, rect[2]*2/3, rect[3]*1/3]; // 2/3 * 1/3 area
let smallArea = [rect[0]+rect[2]*2/3, rect[1]+rect[3]*2/3, rect[2]*1/3, rect[3]*1/3]; // 1/3 * 1/3 area

draw(bigArea);
draw(mediumArea);
draw(smallArea);

splitArea(bigArea, 6).forEach(area => draw(area));
splitArea(mediumArea, 12).forEach(area => draw(area));
splitArea(smallArea, 3).forEach(area => draw(area));
<canvas id="output" height="300px" width="300px" style="background-color: grey">