合并和分割重叠的矩形以产生不重叠的矩形

时间:2010-05-02 23:36:48

标签: algorithm computational-geometry mathematical-optimization rectangles graphics

我正在寻找如下算法:

给定一组可能重叠的矩形(所有这些都是“未旋转”,可以统一表示为(左,上,右,下)连音符等...),它返回一组最小值(非旋转的非重叠矩形,占据相同的区域。

乍一看似乎很简单,但有点难度(至少要有效地完成)。

这个/ ideas /指针有一些已知的方法吗?

不一定是最小但是启发式小的集合的方法也很有趣,所以产生任何有效输出集的方法也是如此。

2 个答案:

答案 0 :(得分:7)

基于线扫描算法的东西可行,我想:

  • 将所有矩形的min和max x坐标分类为数组,作为“start-rectangle”和“end-rectangle”事件
  • 逐步执行数组,将遇到的每个新矩形(start-event)添加到当前集合
  • 同时,维护一组“非重叠矩形”,这将是您的输出集
  • 每次遇到新的矩形时,您都可以检查它是否已完全包含在当前/输出集中(y的简单比较 - 坐标就足够了)
  • 如果不是,请在输出集中添加一个新矩形,y - 坐标设置为尚未覆盖的新矩形部分。
  • 每当您点击矩形结束事件时,请停止输出集中任何不再覆盖任何内容的矩形。

我不完全确定这涵盖了一切,但我认为通过一些调整它应该完成工作。或者至少给你一些想法...... :)

答案 1 :(得分:1)

所以,如果我试图这样做,我要做的第一件事就是想出一个统一的网格空间。找到所有唯一的x和y坐标,并创建到索引空间的映射。因此,如果您有x值{-1,1.5,3.1},那么将它们映射到{0,1,2},同样映射到y。然后可以用这些打包的整数坐标精确地表示每个矩形。

然后我会分配一个覆盖整个网格的位向量或东西,并栅格化网格中的矩形。有一个网格的好处在于它非常容易使用,并且通过将其限制为唯一的x和y坐标,它是最小和精确的。

提出一个非常快速的解决方案的一种方法是转储网格的每个“像素”..通过映射运行它们,然后就完成了。如果您正在寻找更优化的矩形数量,那么您手上就会遇到某种搜索问题。

让我们看看4个相邻的像素,一个2x2的小方块。当我编写像这样的算法时,通常我会考虑顶点,边和面。所以,这些是一个顶点周围的面。如果其中3个打开而1个打开,那么你有一个凹角。这是唯一无效的情况。例如,如果我没有任何凹角,我只需抓住范围并将整个事物作为单个矩形转储。对于每个凹角,您需要决定是水平,垂直还是两者分开。我认为在找到范围时,分割为标记边不交叉。您也可以将它作为着色集,对您来说更容易。

凹角及其分割方向是您的搜索空间..您可以使用您想要的任何优化算法。分支/绑定可能运行良好。我敢打赌你可以找到一个表现良好的简单启发式(例如,如果你正在考虑的那个正对面有另一个凹角,总是在那个方向上分开。否则,在较短的方向上分开)。你可以贪得无厌。或者你可以在两个方向上分割每个凹顶点,这通常会比将每个'像素'作为矩形输出更少的矩形,并且非常简单。

阅读本文后,我意识到可能还有一些领域尚不清楚。如果您要我澄清任何内容,请告诉我。