扫线矩形覆盖


9

不幸的是,我没有得到成功的锻炼。

有一组矩形和一个矩形。使用平面扫描算法确定R_ {1} .. R_ {n}集是否完全覆盖了R_ {0 } - [R 0R1..RnR0 R 1[R ñR0R1..Rn

有关扫掠线算法原理的更多详细信息,请参见此处

让我们从头开始。最初,我们将扫掠线算法称为查找线段相交的算法,它需要两个数据结构:

  • 一组事件点Q(它存储线段和相交点的端点)
  • 状态T(扫掠线相交的一组线段的动态结构)

总体思路:假设扫掠线l是一条垂直线,从左侧开始接近矩形组。对矩形的所有x坐标进行排序,并将它们按升序存储在Q中-应该取O(nlogn)。从第一个事件点开始,对于每个点,确定在给定x坐标处相交的矩形集,确定相交矩形的连续段,并检查它们是否在当前x坐标处完全覆盖R_ {0}。以T作为二叉树,它将取O(\ log n)。如果R_ {0}的任何部分未被发现,则表示R0xTO(logn)R0R0未完全涵盖。

详细信息:分段相交算法的思想是仅相邻的分段相交。基于这一事实,我们建立了状态T并在整个算法中对其进行了维护。我试图在这种情况下找到类似的想法,但到目前为止没有成功,我只能说两个矩形如果它们对应的xy坐标重叠则相交。

问题是如何建立和维护T,什么建筑的复杂性和维护T的。我认为R树在这种情况下可能非常有用,但是正如我发现的那样,使用R树确定最小边界矩形非常困难。

您是否有关于如何解决此问题的想法,尤其是如何构建?T


1
这些是否是与轴对齐的矩形?(您可以使用任何一种方法来做,但是如果这样做可以更容易。)
路易(Louis

@Louis,让我们稍微简化一下,让我们假设有轴对齐的矩形,但是当然,一般情况下更有趣
com 2012年

矩形的哪些点是事件点?所有角落,左上角...?
拉斐尔

@Raphael,只有x是事件点
com

Answers:


6

让我们从轴对齐的矩形开始,因为有一种简单的直接参数。我们将扫一条垂直线。事件是矩形水平边缘的端点。正如我们扫我们维护一组关于扫描线间隔的是“未覆盖”,由[R 1nRii1

  • 初次遇到R i时,将矩形覆盖的垂直间隔添加到扫描线RiRi
  • 当矩形线R i经过R i时,从扫掠线中删除矩形覆盖的垂直间隔RiRi

使用二叉树很容易做到这一点,以便更新花费时间。(问题本质上是一维的。您可以确定端点是否处于未覆盖的间隔中,并在添加时适当地扩展/合并,在删除时要加长)。O(logn)

然后,您只需检查一下,在的跨度中,没有发现的间隔与R 0的垂直跨度相交。整个事情是O n log n 乘以O n 空间。R0R0O(nlogn)O(n)

对于一般情况,显而易见的技巧并不是那么快。使用标准扫掠线算法来计算由矩形引起的整个平面细分。

显然,这些面的一些盘状集合覆盖了R 0。本身,这还不能告诉我们足够的信息,因为我们感兴趣的是这些面中的任何一个是否在R 0的内部以及在其他矩形的外部。为此,我们对结构进行了一些修改,以便在添加边缘时,我们用矩形内部的标识标记一侧。这增加了O 1 开销,因此构造是O n 2 log n 时间。在不假设矩形的情况下,输出可以为Ω n 2FR0R0O(1)O(n2logn)Ω(n2) 大小,因此在最坏的情况下我们会使用那么多空间,因此时间虽然不是“输出敏感”的,但实际上是“最佳的”。

最后,只要F '中的所有面都没有仅边缘未标记为R i的边缘,就覆盖。关键是,如果f的边在R i中,则整个f也是。想象一下,沿着该边缘在f上正交地扫过一条线:它只能使R i离开f之外,或者fR i的多个边缘限制。R0FRifRiffRiffRi

因此得出的结论是,特殊情况至少为,而一般情况至少为O n 2 log n ,但是我怀疑它可以改进。O(nlogn)O(n2logn)


非常感谢您的回复。关于一般情况,我想说明的很少。 -事件点X预分类坐标,Ť -状态- “未覆盖的”间隔,我的理解它的间隔对应于X 的中的一个的ř的是通过任何其他揭露ř 1。我不明白R 0的部分。我认为在每次迭代(加法)时,我们都应检查区间是否与R 0相交,对吗?QxTxiRRi,i1R0R0
com 2012年

对于一般情况,基本上,我假设您知道如何构造由矩形引起的整个平面图,然后我争论说,如果其边界边之一在“内侧”上,则该平面完全位于 “是R i。您可以通过在将段添加到扫描线时仅记录这些段的“内部”和“外部”方向,以常规的扫描算法(例如,从“ Marks”一书中)进行跟踪。RiRi
路易(Louis)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.