圈区

时间:2018-06-05 11:42:55

标签: algorithm

以下是用于说明问题的图片:picture and features

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

目前我有两个想法。

  1. 最愚蠢的一个,只是遍历每个中的所有功能 查询。这比较慢。
  2. 一个粗略的想法。将整个图片分成一些子图片。根据子图片将特征放入树形结构中,如果特征在相同的子图片中,则放在同一个叶子中。在每个查询中,找出圆圈覆盖的子图片并检查这些子图片中的所有特征。
  3. 有没有人有更好的想法?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

  1. 删除优先级队列的头部;
  2. 如果队列的头部是一个点,那么它是您尚未返回的树中最近的点。你知道这一点,因为如果任何内部节点可能有一个更近的点,那么它将首先从优先级队列返回;
  3. 如果队列的头部是内部节点,则将其子节点放回队列
  4. 这将按照距中心点的距离增加的顺序产生树中的所有点。