我正在寻找如下算法:
给定一组可能重叠的矩形(所有这些都是“未旋转”,可以统一表示为(左,上,右,下)连音符等...),它返回一组最小值(非旋转的非重叠矩形,占据相同的区域。
乍一看似乎很简单,但有点难度(至少要有效地完成)。
这个/ ideas /指针有一些已知的方法吗?
不一定是最小但是启发式小的集合的方法也很有趣,所以产生任何有效输出集的方法也是如此。
答案 0 :(得分:7)
基于线扫描算法的东西可行,我想:
x
坐标分类为数组,作为“start-rectangle”和“end-rectangle”事件y
的简单比较 - 坐标就足够了)y
- 坐标设置为尚未覆盖的新矩形部分。 我不完全确定这涵盖了一切,但我认为通过一些调整它应该完成工作。或者至少给你一些想法...... :)
答案 1 :(得分:1)
所以,如果我试图这样做,我要做的第一件事就是想出一个统一的网格空间。找到所有唯一的x和y坐标,并创建到索引空间的映射。因此,如果您有x值{-1,1.5,3.1},那么将它们映射到{0,1,2},同样映射到y。然后可以用这些打包的整数坐标精确地表示每个矩形。
然后我会分配一个覆盖整个网格的位向量或东西,并栅格化网格中的矩形。有一个网格的好处在于它非常容易使用,并且通过将其限制为唯一的x和y坐标,它是最小和精确的。
提出一个非常快速的解决方案的一种方法是转储网格的每个“像素”..通过映射运行它们,然后就完成了。如果您正在寻找更优化的矩形数量,那么您手上就会遇到某种搜索问题。
让我们看看4个相邻的像素,一个2x2的小方块。当我编写像这样的算法时,通常我会考虑顶点,边和面。所以,这些是一个顶点周围的面。如果其中3个打开而1个打开,那么你有一个凹角。这是唯一无效的情况。例如,如果我没有任何凹角,我只需抓住范围并将整个事物作为单个矩形转储。对于每个凹角,您需要决定是水平,垂直还是两者分开。我认为在找到范围时,分割为标记边不交叉。您也可以将它作为着色集,对您来说更容易。
凹角及其分割方向是您的搜索空间..您可以使用您想要的任何优化算法。分支/绑定可能运行良好。我敢打赌你可以找到一个表现良好的简单启发式(例如,如果你正在考虑的那个正对面有另一个凹角,总是在那个方向上分开。否则,在较短的方向上分开)。你可以贪得无厌。或者你可以在两个方向上分割每个凹顶点,这通常会比将每个'像素'作为矩形输出更少的矩形,并且非常简单。
阅读本文后,我意识到可能还有一些领域尚不清楚。如果您要我澄清任何内容,请告诉我。