【问题标题】:Efficiently finding out which 3D lines intersect which 3D points有效找出哪些 3D 线与哪些 3D 点相交
【发布时间】:2019-10-13 08:58:20
【问题描述】:

给定

  1. 3D 空间中的许多点的集合
    (每个表示为 3 个浮点坐标 (x, y, z)
  2. 3D 空间中的一组无限条线
    (每个都由线上的一个任意点和一个 3D 方向向量表示)

有没有办法找出哪些点位于哪条线上(稍微容忍浮点错误),这比琐碎的@987654323更有效@在嵌套循环中针对每一行测试每个点的方法?

我正在考虑将两组中的一组存储在有助于交叉测试的特殊数据结构中。但是这样的数据结构会是什么样子呢?

(也可提供相关学术文献的链接。)

【问题讨论】:

标签: data-structures 3d time-complexity computational-geometry intersection


【解决方案1】:

这是对 Pinhead 答案的补充。

考虑P 点的边界框,假设大致为立方,并将其细分为 单元格。如果点的分布是均匀的,则每个单元格平均包含P/C³ 个点。

现在,对于每条线,您将通过类似于绘制数字线的过程找到与它相交的所有单元格,并且您将平均相交αC 个单元格,其中α 是一个小常数。因此,搜索的总工作量与L P/C³ 成正比。

无论如何,您必须考虑网格的初始化时间,与 成正比。因此,包括初始化在内的总数采用C³+ ß L P/C² 的形式,并被C~(L P)^(1/5) 最小化,从而提供了O((L P)^(3/5)) 的时间和空间复杂度,比O(L P) 节省了很多。


您还可以想象一棵二叉树,它包含一个层次结构的边界球体,从每个点周围的公差半径开始。您可以通过在某个维度上进行递归细分,以与创建 kD-tree 相同的方式创建树。

精确估计加速比要困难得多,但您可能会期望像O((L + P) Log(P)) 这样的时间复杂度。

【讨论】:

    【解决方案2】:

    将 3d 空间划分为 N 边的立方体,这样一个立方体可以包含多个点。一条无限长的线将与无限多的立方体相交,但检查一个立方体是否有一个点需要 O(1)。当一条线与一个多点的立方体相交时,您只检查该立方体中的点,如果 1)它们均匀分布 2)您使用摊销常数(@ 987654321@)。从平均情况的角度来看,如果所有点都打包在一个立方体内,您只会在 O(N^2) 一次检查所有点。您也可以在多维数据集中放置多维数据集,但这更多的是记账。

    这个想法的灵感来自四叉树: https://en.wikipedia.org/wiki/Quadtree

    【讨论】:

    • “你只会在 O(N^2) 一次检查所有点”是什么意思??
    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 2020-12-07
    • 2020-05-30
    • 1970-01-01
    • 2018-06-19
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多