我需要找到一个算法来找到给定矩形R中的最少个重叠矩形,它们与一组其他矩形的并集不相交在R内。这些内部矩形可以重叠。这是一个示例R的可怕的ASCII绘图:
A-----------------B-------------------------+
| |
| |
| |
| |
| +--------+ |
| |........| |
| |........| |
C +---D........| |
| |.........+--+ |
| |.........| |
| ++........+------+ |
| |...............| |
G +---H...........| |
| |...........| |
| |...........| |
| |...........| |
| +-----------+ |
| |
| |
| |
E-------------I----F------------------------+
这里的矩形包括(A,D),(A,I),(G,F)。这似乎是一个解决方案很容易理解的问题,但我只是缺乏词汇量。任何答案,指针,RTFM都乐呵呵地接受。谢谢!
编辑:根据@Paul在下面的观察,我要做的是找到一组覆盖R中空间的矩形,而不覆盖由内部集合组成的任何多边形。如果这是有道理的。答案 0 :(得分:0)
我相信这是一种可能的解决方法。
我将重叠的矩形称为“白色”,将解决方案中的矩形称为“黑色”
首先,我们假设我们有一个适合在交叉点上搜索的数据结构。一个可能的数据结构是Interval Tree,使用其中一个坐标上的点作为间隔(例如,如果矩形由两个点(x0,y0)和(x1,y1)定义,则使用(x0,y1)作为间隔。该链接还解释了如何扩展到更高的维度(在您的情况下,您需要2)。
我不会详细介绍这种数据结构的实现,但我们假设我们有一个名为Rectangles
,并定义了以下API:
void add(Rectangle r)
void remove(Rectangle r)
Rectangle[] getIntersecting(Rectangle r)
Rectangle[] getAdjacent(Rectangle r)
好的,现在创建两个名为Rectangles
和black
的{{1}}个实例。使用所有白色矩形初始化white
。具有white
矩形(整个域)的Initializie black
。
R
中的每个矩形rw
,获取黑色交叉矩形的数组white
。 arr
中的每个矩形rb
,确定black
的结果。这是0,1,2,3或4个矩形的集rw-rb
,具体取决于两个矩形的交叉方式。 set
移除rw
,并向其添加white
的内容。这可能需要将set
中的矩形与set
中已有的矩形合并,如果这样的矩形一起形成一个更大的矩形(它们相邻共享一侧)white
rb
black
答案 1 :(得分:0)
使用一些基本的数学,我们可以说你的问题的解决方案是直线多边形R \ union(rs)
的分解,其中union(rs)
表示R
内的多边形。可以使用Greiner-Hormann-algorithm计算R \ union(rs)
。请注意,此步骤将生成带孔的多边形,并且 - 仅当内部多边形包含孔时 - 多个其他多边形。分解描述为here(这只是一种近似,但到目前为止我无法找到精确的算法)。