我有大量的2D点,我希望迅速得到那些谎言在一定的矩形。让我们说'.'是任何点和'X'是一点我想要找到内部矩形其具有'T'as左上和'B'先点:

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

我已经尝试性病::设定一个排序函其各种各样的左上角开始时,先在结束。当排序的X值首先,这将导致在以下几点被发现。

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

这意味着我将不得不检查每个找到的一点,是否这真的是内部矩形。不真的很好。

这将是一个更好的方式做到这一点?

我的语言是用C++(Windows)和我有STL以及提高。

更新

具有读答复迄今为止,我注意到,我没有占所有参数的我的问题:没有一个固定的矩形。矩形可以通过用户设定在运行时间。这意味着对该集点的承诺是效率更高,比直线搜索过所有要点的建议Artelius在此之前更新。我还是会试试看,但!我不期望用户设定一个矩形 非常 频繁。因此关于各项公约和行动纲领执行情况的努力,它可能会是一个很好的解决方案对于我。

有帮助吗?

解决方案

您可以在点存储在使用四或r树空间索引。然后给你能找到它交叠树的所有节点的矩形,你将不得不对每点比较这个子集,看它是否落在矩形。

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

您可能能够使用一个简单的解决方案,如在范围划分点。说其中x为0,10为一个范围,11,20作为另一个。任何解决方案,让您修剪搜索空间会有所帮助。

其他提示

请参阅这个问题石溪算法库有KDTrees的一些实现的C ++, 虽然它们不是STL也不升压的一部分。

对数组排序需要O(名词的日志名词的)时间。简单地逐一检查每个点(无分选)需要O(名词的)时间。

人体工程学,只是经历和检查每个点是更快比排序。而且它比建设一个四叉树也快。

编辑:如果你有很多的矩形来检查,这是一个不同的故事。但是,如果你只需要检查的矩形小,固定号码,然后就去做了“明显”的方式!

用叉树,你有3种类型的qtree节点:

  1. 节点以外的目标的矩形:忽略
  2. 节点是内部目标的矩形:包括所有各点内部节点
  3. 节点是部分地以外的矩形:做一个边界检查点内部节点

继尤瓦尔·F公司的链接,我发现范围搜索,这似乎是事情的具体排序,你要寻找的。我随后从那里一些链接,并发现 CGAL 时,一个开源C ++库,它实现了一个范围搜索,与实施例这里

您排序功能可以检查点,因为它们是矩形之外的所有点之前增加了里面最矩形的烦躁和排序的所有点的矩形内。你必须跟踪多少每个的存在,或对整个组使用二进制搜索找到在查找时间截止点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top