具有扫描线算法的圆交集


15

不幸的是,我对扫描线算法的理解还不是很强。关于该主题的所有论文和教科书均已阅读,但理解距离还很远。为了更清楚一点,我尝试解决尽可能多的练习。但是,真正有趣和重要的任务仍然对我构成挑战。

我在万能杰夫·埃里克森(Jeff Erickson)的《线段相交》的讲义中发现了以下练习。

练习2。描述并分析扫掠线算法,以在给定平面中的圆的情况下确定在时间内是否有两个相交。每个圆都由其中心和半径指定,因此输入由三个数组和。注意正确实现低级原语。ñØñ日志ñX[1 ..ñ]ÿ[1 ..ñ][R[1 ..ñ]

让我们尝试使复杂的事情变得容易。我们对圆的交点了解多少?用线的交点可以找到什么类似物。如果两条线相邻,两条线可能会相交,两条圆应该具有哪个属性才能相交?令为圆心,和圆心之间的距离。考虑几种情况:d[R0[R1

  • 情况1:如果,则没有解,圆是分开的。d>[R0+[R1

  • 情况2:如果那么就没有解决方案,因为一个圆包含在另一个圆内。d<|[R0-[R1|

  • 情况3:如果且则圆是重合的,并且解的数量是无限的。d=0[R0=[R1

因此,看起来交叉路口的条件已经准备就绪,当然可能是错误的条件。如果是这样,请更正。

算法。现在我们需要找到两个相交的圆之间的共同点。在模拟到直线相交的情况下,我们需要在事件队列中具有插入条件和删除条件。假设事件点是垂直扫描线接触的第一个点和最后一个点的x坐标。在第一个点上,我们将圆插入状态, 并检查与最近的圆的交点(上面提到了3种检查情况),在最后一点上,我们从status中删除了圆。

对于扫掠线算法来说似乎已经足够。如果有什么问题,或者可能有什么事情应该做不同的事情,请随时与我们分享您的想法。

附录

我在垂直扫掠线第一次接触该圆时插入一个圆,并在扫掠线最后接触该状态时从状态中删除一个圆。交叉点的检查应在最近的前一个圆上进行。如果我们在状态中添加了一个圆圈,并且之前已经添加了另一个圆圈,并且该圆圈仍然存在,那么先前的圆圈不会“闭合”,因此可能存在相交。


4
万能[需要引用]
JeffE 2012年

@com“最近的前一圈”是什么意思?
2012年

1
我假设status保持当前与扫描线相交的圆?假设您当前有100个圆圈status,并且您要处理一个插入事件并插入第101个圆圈。您比较多少个圆来检查路口?您如何选择要比较的圈子?
2012年

@Joe,这正是我所需要的,就像经典的扫掠线算法一样,其中“两条线的交点暗示这两条线在某个点上相邻”,我需要找到带圆圈的类似物。如果圆与它们从最小y到最大y的间隔投影相交,则我最简单的方法是圆的最低坐标和y最高坐标。所以也许现在我越来越接近您的半圆概念了。半圆上方的y最高,下方的最低yÿÿÿÿÿÿ
com 2012年

Answers:


5

您绝对是在正确的轨道上。最大的问题是:当您插入一个圆时,您还要检查哪些其他圆?您如何执行此检查?

在线段相交的情况下,在任何给定x坐标处的线段都是完全有序的。(您可以从最低到最高Y坐标列出它们)。因此,您可以将线段保留在二叉搜索树中,添加新线段时,只需找出它在二叉搜索树中的位置,并检查其相邻点是否存在相交事件。

在圈子的情况下,它不会立即清除要检查的圈子。如果您的答案是“全部”,则您的算法需要做一些工作。

您能找到一种表示圆的方法,使它们像线段一样完全有序吗?

尝试将圆圈表示为两个半圆。每个插入事件实际上是两个事件:插入上半部分和插入下半部分。


不幸的是,我没有半圆的概念,也许您认为半圆是可以相交的最小圆单位(相交的3种情况:相交在上半圆上,在下半圆上或在两个半圆上)。乞求时,所有圆都按其左边界和右边界的x坐标排序。因此,我们不应该考虑x在status中协调一致,因为所有圆都已经按x坐标顺序排列。因此,考虑(半圆)中心的y坐标或y和半径的任意组合似乎更合乎逻辑。你的意见?
com 2012年

@com您需要中心点和半径来确定两个圆是否相交,就像您在自己的相交检查中所做的那样。仅y坐标和半径不能完全指定圆的边界。扫描线算法似乎有一些您不了解的基本知识,但是我很难说出它是什么。
2012年

0

我可以想到这种方法类似于在O((n + k)logn)时间中运行的Bentley Ottmann扫描。

我可以减少圆相交到线段相交的问题。我将为每个圆考虑与Y轴平行的垂直直径。该算法应使用一条水平线,从底部到顶部扫掠平面。

现在,每个圆都有上端点,下端点。同样,我们需要修改“相交”谓词,以使当且仅当扫掠线在一点上切入两个圆时,两个线段才相交。

由于可以在O((n + k)logn)的时间内解决直线相交的问题,因此对于圆形相交也遵循相同的界限。

我坚信这是行得通的,但是如果你们指出在任何情况下通常都无法解决的情况,请告诉我。

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.