【问题标题】:Finding all the rectangles within a given rectangle that do not intersect with an arbitrary shape查找给定矩形内不与任意形状相交的所有矩形
【发布时间】:2015-06-08 22:22:17
【问题描述】:

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

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

这里的矩形将包括 (A, D), (A, I), (G, F)。这似乎是一个解决方案很好理解的问题,但我只是缺乏词汇。任何答案、指点、RTFM 都会愉快而感激地接受。谢谢!

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

【问题讨论】:

  • 我想你忘了提到矩形应该填充 R 中的区域,而不是给定矩形的联合?否则答案总是 0
  • 我会在解决另一个问题后尽快找到答案
  • 重叠的矩形会不会产生一堆“洞”?换句话说,我可以让四个部分相邻的矩形创建一个完全被 r3ctanlges 包围的内部区域吗?
  • 这需要一些时间,但我找到了一些有用的资源。顺便说一句,如果你想自己搜索,“一组矩形的联合”的正确术语是“直线多边形”
  • 谢谢,很高兴知道。碰巧,我不需要最小的集合或最大的图块;实际上,如果这样可以使算法更易于理解或执行得更快,我愿意接受次优集合。

标签: algorithm rectangles


【解决方案1】:

我相信这是一种可能的解决方法。

我将重叠的矩形称为“白色”,解决方案中的矩形称为“黑色”

首先,让我们假设我们有一个适合在交叉路口搜索的数据结构。一种可能的数据结构是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 和white。用所有白色矩形初始化white。用R 矩形(整个域)初始化black。

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

【讨论】:

  • 如何保证“重叠矩形的数量最少”?
  • James Felix Black 在评论中放弃了“最少数量”的要求。我相信这个算法会产生最小的非重叠矩形集,但要产生最小的重叠矩形集需要额外的努力。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 2017-09-09
    • 2023-03-14
    • 1970-01-01
    • 2011-04-14
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多