【问题标题】:Data structure for fast line queries?快速线路查询的数据结构?
【发布时间】:2010-12-02 16:57:28
【问题描述】:

我知道我可以使用 KD-Tree 来存储点并快速迭代其中接近另一个给定点的一小部分。我想知道线条是否有类似的东西。

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

也许你们有一个好主意或知道在哪里寻找论文、描述等......

TIA, 秒。

【问题讨论】:

  • 此距离始终为 0,除非线条平行。还是您在谈论 segments 行?
  • 其实没关系。如果有帮助,我可以把它做成线段。但是无限长的线也很好。我不指望结果会改变。我目前用两个点参数化我的线,我希望点 u/v 位于这些线段上。
  • 嗯,在 3D 中,两条线在不平行的情况下可能不会相互交叉,因为它们可以在不同的平面中。
  • 抱歉,我错过了“3D”部分。现在一切都清楚了。
  • 顺便提个有趣的问题。

标签: c++ algorithm data-structures geometry nearest-neighbor


【解决方案1】:

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

【讨论】:

  • +1。再说一个优点:这样的数据结构不需要“拆分元素”(冗余),因为节点的边界框可能会重叠——就像一个松散的八叉树。
  • 接受建议另一个不需要拆分对象的数据结构
【解决方案2】:

您也可以为此使用 KD-Trees。

可以构建适用于基元而非点的 KD-Tree。许多光线追踪器这样做是为了使三角形命中测试更快。我见过的最好的描述是在这个ray tracing tutorial

一种可能更快但不是 100% 准确的解决方案是只保留每个线段的点列表,并将这些点插入到标准的基于点的 KD-Tree 中。找到最近的点,然后用线段标记它们,并使用它来获取最近的线。它很粗糙,但与其他选项相比通常非常快。 “诀窍”是找到在沿线段的点之间保持大空间(更快)与将线段分成更多点(更慢,但更准确)之间的正确平衡。

【讨论】:

  • +1 感谢您的建议。我必须检查您的链接并考虑一下。
  • 我可以存储线段并分割这些线段,而不是在每个叶子中存储点。无论哪种方式,我最终都会以某种方式冗余地存储该行。也许其他数据结构更合适(松散的八叉树,R-Tree,...)
猜你喜欢
  • 2014-06-23
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 2012-02-25
  • 1970-01-01
相关资源
最近更新 更多