java - 检查任意圆是否包含给定点集的 k 个以上点

标签 java computational-geometry

我有一组 n 个点和一个或多或少的任意圆。
现在我想检查圆圈是否最多包含 k 个点。
现在我只是蛮力测试所有的点。由于我需要为很多圈子回答这个问题,因此最多 n²log(n) 的预处理时间就可以了。
最佳数据结构很可能是 k-Voronoi 图的顺序(不是 k 维的那个),但我需要自己实现它,因此我想知道我是否有其他(更简单的)选项。
另一个加速的想法是使用 KD-Tree。
我想知道,如果我错过了另一种方法。

最佳答案

您似乎在进行固定半径的近邻计数查询。
使用 KD 树 (K=2),您可以列出给定圆中的点,时间大约为 O(k + Log n)。这是通过将圆与 KD 树分割的矩形重叠来实现的。当一个矩形全部包含在圆内时,不需要再分割,矩形内的所有点都在圆内。
因此,您可以使用树的每个节点中包含的点数来增强树。这会将运行时间降低到 O(m + Log n),其中 m 是包含在圆圈中或被圆圈分割的矩形的数量。当矩形包含的点数少于预定义数量时,也可以停止分割,并通过蛮力测试它们。
这些是启发式方法。你必须在你的案例上测试它们,看看它们是否值得。
enter image description here

更新:
只是一个想法,并没有真正研究过:Vantage-point 树适用于 k-最近邻搜索,它们使用圆来划分平面。这可能会更好地与圆查询融合。
https://en.wikipedia.org/wiki/Vantage-point_tree#Searching_through_a_vantage-point_tree

关于java - 检查任意圆是否包含给定点集的 k 个以上点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66247451/

相关文章:

java - 是否可以暂时禁用 Hibernate 实体的级联?

Swing 主面板内嵌套面板的 Java 可访问性

在 2n+3 个点中找到一个圆的算法,它包含内部 n 个点、外部 n 个点和自身 3 个点

computational-geometry - 如何确定半球的点x-y-z坐标?

Java InputMismatchException 与 Scanner 循环

java - Spring Security 不会在拦截 URL 上重定向

java - Maven 依赖插件不将库复制到 war 文件

python - Spatstat:给定二维点列表,如何将它们连接到多边形中,并进一步使其成为研究区域?

algorithm - 创建非自相交多边形的算法的有效性

c# - 寻找一组点的具体轮廓