【问题标题】:How to get minimum-sized rectangle that contains certain rectangles?如何获得包含某些矩形的最小尺寸矩形?
【发布时间】:2023-03-06 01:15:01
【问题描述】:

最近我在想一种算法,可以计算包含某些矩形的最小矩形。

此算法的目标是生成一个大矩形,我可以将所有给定的较小矩形放入其中。这些较小矩形中的一个不应部分或完全与另一个重叠。在我将较小的矩形放入大矩形之前,我可以将它们旋转 90 度或不旋转。大矩形应该尽可能小。

有人知道吗?

【问题讨论】:

  • 你能把小长方形切成小块吗?
  • 没有。实际上,该算法用于图集合并。输入图像无法重新整形。
  • 我以“Hi All.\n”开始这个问题,但系统删除了“Hi”和换行符。我是新来的,我不知道为什么会这样。 :-p
  • 这被称为“矩形包装问题”。去谷歌上查询。由于每个用片材制造东西的人都需要这种或另一种形式,因此这是一个发达的研究领域。
  • @n.m.谢谢。我想这正是我想要的。现在我应该如何处理这个问题?有没有办法取消呢?还是我什么都不做?

标签: algorithm geometry


【解决方案1】:

我研究这个问题已经有一段时间了。我已经提出了一些关于这个问题的链接和文章的解决方案参考。这里有两个文章的名称:,。如果您想阅读这些文章,可以 google 并下载它们。

可惜没有一篇文章能完全解决我的问题。因为我想要的既不是检查某些矩形是否可以放入固定大小的大矩形中,也不是需要很长时间才能产生的最佳区域分配方法。所以我必须在时间和效果之间取得平衡。我这样做: 1.我准备一个候选点列表并将左上点添加到其中。 2.我将矩形一个接一个地放入大矩形中。 3.每次放置矩形时,我都会检查所有候选点,看看是否可以将矩形放在该点上。我只保留最好的两个或三个(如果这个矩形是最后一个,最好的意思是最小尺寸)。 4.我选择一个候选点来放置矩形并将一个点替换为两个点(矩形的右上角和左下角),如果它们被检查为有效放置下一个矩形。 5.我递归地执行第3步来放置下一个矩形。

我使用 C++ 语言进行编码,所以我可以这样编码:

void computeMinimunRects(int index, Array objects, Array candidates, RectChecker checker)
{
 if (index == objects.count()){
  checkresult(objects);// finished putting all rectangles
  return;
 }
 int c = 2;// or 3 which based on objects.count()
 SortPoint possibles;// SortPoint sort all input points by total area from small to big.
 for (int i = 0; i<candidates.count(); i++){
  if (checkput(candidates[i], objects[index].size))// check if objects[index].size can put on candidates[i] point
   possibles.insert(candidates[i], objects[index].size);// input all needed value and sort them.
 }
 for(int i = 0; i<c; i++){
  Point pt = possibles[i].pt;
  Size size = possibles[i].size;
  Rect rect(pt, size);
  candidate.remove(pt);// replace point with two ones.
  candidate.add(rect.right_top());
  candidate.add(rect.left_bottom());
  computeMinimunRects(index+1, objects, candidates, checker);// recursively input rectangle
  candidates.remove(rect.right_top());// revert all changes
  candidates.remove(rect.left_bottom());
  candidates.add(pt);
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多