加快3D线收集的交叉处理

时间:2017-02-28 18:54:43

标签: performance computational-geometry intersection

考虑在3D凸体内随机分布的大量3D线条。为了找出所有行之间的交叉点,我们将得到两个循环,如下所示。

n = number of lines
for i: 1 to n-1 {
  for j: i+1 to n {
    if line(i) intersects line(j): {
      store (i,j)
    }
  }
}

考虑到n会很大,例如100万甚至更多,我们可以实现哪些优化来加速处理?线条可以有任何长度,任何方向。

更新1: 以下评论有助于添加此更新:

  1. 我们的问题中的线是“线段”,其有限长度仅限于凸体的形状。
  2. 研究两条线之间的交点或“小于公差的最小距离”(实际上非​​常小的值)。
  3. 更新2: 正如下面的宝贵评论所示,我能够从空间划分中受益,或者在简单的情况下,边界盒碰撞测试,以显着加快速度。 我实施的优化框架如下。

    1. 评估所有行的边界框交叉点,标记它们 相交。 (这是如此快速和低成本)
    2. 对标记的那些进行交叉测试。

1 个答案:

答案 0 :(得分:0)

如果线条在3D中相交,它们也会在任何投影到2D中相交。因此,您可以将所有线投影到平面并运行经典线扫描,例如Bentley-Ottmann算法。它在O((n + k)log n)时间和n行和k交叉点的线性空间中运行。正如我想的那样(比如@Yves Daoust)k应该非常小,这似乎是一个好主意。显然,你可以得到一些误报,例如,在平面中相交的线但在3D中不是这样。在3D中验证2D交叉是恒定时间操作,因此在总视图中不是大问题。