algorithm - 圆形区域内的查询点

标签 algorithm

下面用一张图来说明问题:picture and features

图中有一些特征点显示为蓝色十字。我知道所有特征的坐标(x,y)。现在我想查询哪些要素在圆圈区域(绿色圆圈)内。实际上,大约有 500 个特征和 300 个查询(300 个不同的圆、不同的中心和半径)。我知道圆的参数(位置、半径)。有什么好的算法可以完成这个任务吗?

目前我有两个想法。

  1. 最愚蠢的一个,只是迭代每个中的所有功能 询问。这比较慢。
  2. 一个粗略的想法。将整个图片分成一些子图片。将特征按照子图放入树结构中,如果特征在同一子图中,则放入同一叶子。在每个查询中,找出哪些子图片被圆圈覆盖,并检查这些子图片中的所有特征。

有人有更好的想法吗?

最佳答案

最常见的方法是将点放入 K-D 树或类似的树中:https://en.wikipedia.org/wiki/K-d_tree

要查找圆内的点,您可以按照距中心距离递增的顺序获取点列表,并在距离超过圆半径时停止。

要按距离递增的顺序获取点列表,您可以使用优先级队列,该队列可以保存点和树的内部节点,这样您就可以按距离顺序删除它们。

对于点(叶子)来说,距离就是该点到中心点的距离。对于内部节点,该距离是从中心点到该节点中可能存在的任何点的最小距离。

要进行搜索,只需将树的根放入优先级队列中,然后重复:

  1. 移除优先级队列的头部;
  2. 如果队列的头部是一个点,那么它是树中尚未返回的最近的点。你知道这一点,因为如果任何内部节点可能有更接近的点,那么它就会首先从优先级队列中返回;
  3. 如果队列头是内部节点,则将其子节点放回队列中

这将按照距中心点距离递增的顺序生成树中的所有点。

关于algorithm - 圆形区域内的查询点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50699240/

相关文章:

algorithm - 是否有比 Euclid 更快的算法来寻找 GCD

javascript - 我如何调整此代码以排列给定数量的字符?

algorithm - 散列机制将输入(0 到 2^32 - 1)散列为固定的可能 12 个字符的散列

algorithm - 数据结构类似数组但支持删除

java - 插入和搜索二叉搜索树

python - 有效地填充矩阵两点之间的空间

从列表中定义对的算法

java - 随机枢轴无法快速排序

c++ - 如何测试一个数字是否是 2 的幂?

c++ - 生成二维非退化点集 - C++