algorithm - 如何在 O(n*log(n)) 时间内找到并打印 n 个给定圆的交点?

标签 algorithm math graphics computational-geometry

我正在寻找一个 O(n*logn) 算法来查找和打印 n 给定圆的交点。每个圆都由其中心和半径指定。

O(n2) 算法包括检查中心之间的距离是否小于或等于(被比较的两个圆的)半径之和。不过,我正在寻找更快的!

类似的问题是线段的交集。我认为即使是我的问题也可以使用 line sweep algorithm 来解决,但我无法弄清楚如何在圈子的情况下修改事件队列。

请注意以下极端情况。黑点表示事件点(根据 User Sneftel 的解决方案,箭头标记的圆圈交点下方将不会打印)

Please take care of this in your solution

最佳答案

当您遇到圆圈的左极值(即 (x-r, y))时,直线扫描算法会简单地将圆圈添加到列表中,并在您遇到其右极值时将其从列表中删除。在将圈子添加到列表之前,请将其与列表中已有的圈子进行核对。所以你的事件队列基本上是所有圆圈的左右极值,按x排序。 (注意,你提前知道了所有的事件,所以它并不是真正意义上的“队列”。)

这也称为“清理和修剪”。

关于algorithm - 如何在 O(n*log(n)) 时间内找到并打印 n 个给定圆的交点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20265527/

相关文章:

java - 当n个人围成一圈时寻找幸存者

graphics - 旋转向量与四元数

computer-vision - 是什么让对象表示和识别变得困难?

java - 根据这段代码java如何知道从哪里开始

c++ - 费马大定理算法

algorithm - 大 O 的紧界是什么?

c# - 创建序列的幂集

python - Python 中数学公式的计算(使用自定义变量名称和下标)

java - 增加或减少一个角度以最短的方式到达另一个角度

python - 在 python 中实现 Bellman-Ford