存储2D点以快速检索矩形内的那些点

时间:2008-11-19 20:26:53

标签: c++ stl boost spatial point

我有大量的2D点,我想快速得到那些位于某个矩形的点。 让我们说一个'。'是任何一点,'X'是我想要在一个矩形内找到的一个点,其中'T'为TopLeft,'B'为BottomRight点:

. . . . . .
. T-----+ .
. | X X | .
. +-----B .
. . . . . .

我尝试过一个带有排序函数的std :: set,它将开头的TopLeft点和集合末尾的BottomRight排序。首先按X值排序时,会导致找到以下几点。

. . . . . .
. T-----+ .
X | X X | X
. +-----B .
. . . . . .

这意味着我必须检查每个找到的点,它是否真的在矩形内。不太好。

最好的办法是什么?

我的语言是C ++(Windows),我有STL以及提升。

更新

到目前为止已经阅读了答案,我注意到我没有考虑我问题的所有参数:没有一个固定的矩形。 用户可以在运行时设置矩形。这意味着对这组点进行排序比在此更新之前Artelius建议的所有点的线性搜索更有效。 不过我还是会尝试一下!我不希望用户频繁设置矩形非常。所以关于实施工作,它可能对我来说是一个很好的解决方案。

6 个答案:

答案 0 :(得分:6)

您可以使用四元组或r树将点存储在空间索引中。然后给定矩形,您可以找到树的所有节点与它重叠,然后您必须比较该子集中的每个点以查看它是否落在矩形中。

本质上,空间树可以帮助您修剪搜索空间。

您可以使用更简单的解决方案,例如在范围内对点进行分区。假设x从0,10作为一个范围,11,20作为另一个范围。任何可以修剪搜索空间的解决方案都会有所帮助。

答案 1 :(得分:3)

请参阅this questionThe Stony Brook Algorithm Repository在C ++中有一些KDTrees的实现, 虽然它们不是STL的一部分,也不是Boost。

答案 2 :(得分:2)

对数组进行排序需要O( n log n )时间。只需单独检查每个点(不进行排序)就需要O( n )时间。

Ergo,只是通过并检查每个点更快而不是排序。而且它也比构建四叉树更快。

编辑:如果要检查许多矩形,这是一个不同的故事。但是,如果您只需要检查一小块固定数量的矩形,那么只需“明显”的方式!

答案 3 :(得分:1)

使用四叉树,您有3种类型的qtree节点:

  1. 节点位于目标矩形之外:ignore
  2. 节点位于目标矩形内:包括节点
  3. 内的所有点
  4. 节点部分位于矩形之外:对节点
  5. 内的点进行边界检查

答案 4 :(得分:1)

根据Yuval F的链接,我找到Range Search,这似乎是您正在寻找的确切类型。我从那里跟踪了一些链接,找到了CGAL,一个开源C ++库,它实现了一个范围搜索,带有示例here

答案 5 :(得分:-1)

您的排序功能可以在为矩形内部添加点时检查点,并在矩形外的所有点之前对矩形内的所有点进行排序。您必须跟踪每个存在的数量,或者在整个集合上使用二进制搜索来查找查找时的截止点。