我有大量的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建议的所有点的线性搜索更有效。 不过我还是会尝试一下!我不希望用户频繁设置矩形非常。所以关于实施工作,它可能对我来说是一个很好的解决方案。
答案 0 :(得分:6)
您可以使用四元组或r树将点存储在空间索引中。然后给定矩形,您可以找到树的所有节点与它重叠,然后您必须比较该子集中的每个点以查看它是否落在矩形中。
本质上,空间树可以帮助您修剪搜索空间。
您可以使用更简单的解决方案,例如在范围内对点进行分区。假设x从0,10作为一个范围,11,20作为另一个范围。任何可以修剪搜索空间的解决方案都会有所帮助。
答案 1 :(得分:3)
请参阅this question。 The Stony Brook Algorithm Repository在C ++中有一些KDTrees的实现, 虽然它们不是STL的一部分,也不是Boost。
答案 2 :(得分:2)
对数组进行排序需要O( n log n )时间。只需单独检查每个点(不进行排序)就需要O( n )时间。
Ergo,只是通过并检查每个点更快而不是排序。而且它也比构建四叉树更快。
编辑:如果要检查许多矩形,这是一个不同的故事。但是,如果您只需要检查一小块固定数量的矩形,那么只需“明显”的方式!
答案 3 :(得分:1)
使用四叉树,您有3种类型的qtree节点:
答案 4 :(得分:1)
根据Yuval F的链接,我找到Range Search,这似乎是您正在寻找的确切类型。我从那里跟踪了一些链接,找到了CGAL,一个开源C ++库,它实现了一个范围搜索,带有示例here。
答案 5 :(得分:-1)
您的排序功能可以在为矩形内部添加点时检查点,并在矩形外的所有点之前对矩形内的所有点进行排序。您必须跟踪每个存在的数量,或者在整个集合上使用二进制搜索来查找查找时的截止点。