查找给定矩形内不与任意形状相交的所有矩形

时间:2015-06-08 22:22:17

标签: algorithm rectangles

我需要找到一个算法来找到给定矩形R中的最少个重叠矩形,它们与一组其他矩形的并集不相交在R内。这些内部矩形可以重叠。这是一个示例R的可怕的ASCII绘图:

A-----------------B-------------------------+
|                                           |
|                                           |
|                                           |
|                                           |
|                 +--------+                |
|                 |........|                |
|                 |........|                |
C             +---D........|                |
|             |.........+--+                |
|             |.........|                   |
|             ++........+------+            |
|              |...............|            |
G              +---H...........|            |
|                  |...........|            |
|                  |...........|            |
|                  |...........|            |
|                  +-----------+            |
|                                           |
|                                           |
|                                           |
E-------------I----F------------------------+

这里的矩形包括(A,D),(A,I),(G,F)。这似乎是一个解决方案很容易理解的问题,但我只是缺乏词汇量。任何答案,指针,RTFM都乐呵呵地接受。谢谢!

编辑:根据@Paul在下面的观察,我要做的是找到一组覆盖R中空间的矩形,而不覆盖由内部集合组成的任何多边形。如果这是有道理的。

2 个答案:

答案 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)

好的,现在创建两个名为Rectanglesblack的{​​{1}}个实例。使用所有白色矩形初始化white。具有white矩形(整个域)的Initializie black

  1. 对于R中的每个矩形rw,获取黑色交叉矩形的数组white
  2. 对于arr中的每个矩形rb,确定black的结果。这是0,1,2,3或4个矩形的集rw-rb,具体取决于两个矩形的交叉方式。
  3. set移除rw,并向其添加white的内容。这可能需要将set中的矩形与set中已有的矩形合并,如果这样的矩形一起形成一个更大的矩形(它们相邻共享一侧)
  4. white
  5. 中移除rb
  6. 从1开始重复,直到black
  7. 中没有更多的矩形

答案 1 :(得分:0)

使用一些基本的数学,我们可以说你的问题的解决方案是直线多边形R \ union(rs)的分解,其中union(rs)表示R内的多边形。可以使用Greiner-Hormann-algorithm计算R \ union(rs)。请注意,此步骤将生成带孔的多边形,并且 - 仅当内部多边形包含孔时 - 多个其他多边形。分解描述为here(这只是一种近似,但到目前为止我无法找到精确的算法)。