C++ 快速行查询的数据结构?

C++ 快速行查询的数据结构?,c++,algorithm,data-structures,geometry,nearest-neighbor,C++,Algorithm,Data Structures,Geometry,Nearest Neighbor,我知道我可以使用KD树来存储点,并在接近另一个给定点的部分点上快速迭代。我想知道是否有类似的线路 给定3D中的一组行L(存储在该数据结构中)和另一个“查询行”q,我希望能够快速迭代L中与q“足够接近”的所有行。我计划使用的距离是两点u和v之间的最小欧几里德距离,其中u是第一条线上的某个点,v是第二条线上的某个点。计算这个距离不是问题(有一个很好的技巧涉及到叉积) 也许你们有一个好主意,或者知道在哪里可以找到文件、描述等 蒂亚, s、 您也可以使用KD树进行此操作 可以构建一个KD树,该树在基本体

我知道我可以使用KD树来存储点,并在接近另一个给定点的部分点上快速迭代。我想知道是否有类似的线路

给定3D中的一组行L(存储在该数据结构中)和另一个“查询行”q,我希望能够快速迭代L中与q“足够接近”的所有行。我计划使用的距离是两点u和v之间的最小欧几里德距离,其中u是第一条线上的某个点,v是第二条线上的某个点。计算这个距离不是问题(有一个很好的技巧涉及到叉积)

也许你们有一个好主意,或者知道在哪里可以找到文件、描述等

蒂亚,
s、

您也可以使用KD树进行此操作

可以构建一个KD树,该树在基本体上工作,而不是在点上。许多光线跟踪器这样做是为了使三角形命中测试更快。我见过的最好的描述就是这个


一个可能更快但并非100%准确的解决方案是,只保留每个线段的点列表,并将其插入标准的基于点的KD树中。找到最近的点,然后用线段对其进行标记,并使用该线段获取最近的直线。这是粗糙的,但与其他选择相比通常非常快。“诀窍”是找到正确的平衡点,即沿线段在点之间保持较大的间距(更快),而不是将线段分成更多的点(更慢,但更准确)。

另一个选项——也是基于磁盘的数据库系统中最常用的空间索引选项——是。它的实现比KD树要复杂一些,但通常认为它速度更快,而且索引直线和多边形也没有问题。

除非直线平行,否则此距离始终为0。或者你说的是线段?其实这并不重要。如果有用的话,我可以把它做成线段。但无限长的线条也很好。我不指望结果会改变。我目前用两个点来参数化我的线,我希望u/v点位于这些线段上。嗯,在3D中,两条线可能不会相互交叉而不平行,因为它们可能在不同的平面中。抱歉,我错过了“3D”部分。现在一切都清楚了。顺便提一下,这个问题很有趣。+1谢谢你的建议。我必须检查你的链接并考虑一下。我可以存储线段并拆分这些线段,而不是在每个叶子中存储点。无论哪种方式,我最终都会以某种方式冗余存储该行。也许其他数据结构更合适(松散八叉树、R树等)+1。另一个优点是:这样的数据结构不需要“拆分元素”(冗余),因为节点的边界框可能会重叠——很像松散的八叉树。建议使用不需要拆分对象的另一个数据结构,这是可以接受的