【问题标题】:Split Rectangle in Categories of sub rectangles在子矩形类别中拆分矩形
【发布时间】:2019-05-29 13:24:21
【问题描述】:

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

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

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

我应该有这样的伪代码:

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;
}

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

【问题讨论】:

  • 请分享您对算法的“想法”,以及您对此算法的实际问题。
  • 好吧。我不是在想,我是在问。如何将矩形拆分为多个(定义数量)递减的较小矩形类别。
  • 请提供输入和预期输出的示例;您的规范严重不足(无法针对“相对和未定义”进行编码)。
  • 现在好点了吗?
  • 请提供输入和预期输出的示例。

标签: algorithm


【解决方案1】:

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

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));
&lt;canvas id="output" height="300px" width="300px" style="background-color: grey"&gt;

【讨论】:

  • 我不分割我的区域,但我希望子矩形的区域是 small、medium 或 big 的区域。所以一组面积为 X 的矩形。一组面积为Y的矩形和一组面积为Z的矩形
  • 但是 X + Y + Z 应该总是等于主区域,不可能给出 X、Y 和 Z,因为每个区域都依赖于其他区域。也许你的问题没有很好地表达,你正在寻找一种算法,给定一个区域和一个子区域,将第一个分割成不同的子区域矩形?
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 2020-12-23
相关资源
最近更新 更多