如何获得包含特定矩形的最小尺寸矩形?

时间:2014-07-24 07:04:37

标签: algorithm geometry

最近我想到的算法可以计算出包含某些矩形的最小尺寸矩形。

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

有人有关于它的一些线索吗?

1 个答案:

答案 0 :(得分:0)

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

很遗憾没有一篇文章可以解决我的问题。因为我想要的不是检查是否可以将某些矩形放入固定大小的大矩形中,也不检查是否需要花费很长时间才能得到最佳的区域分配方法。所以我必须在时间和效果之间取得平衡。我这样做: 1.我准备一个候选点列表并添加左上角点。 我将矩形逐个放入大矩形中。 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);
 }
}