考虑在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: 以下评论有助于添加此更新:
更新2: 正如下面的宝贵评论所示,我能够从空间划分中受益,或者在简单的情况下,边界盒碰撞测试,以显着加快速度。 我实施的优化框架如下。
答案 0 :(得分:0)
如果线条在3D中相交,它们也会在任何投影到2D中相交。因此,您可以将所有线投影到平面并运行经典线扫描,例如Bentley-Ottmann算法。它在O((n + k)log n)时间和n行和k交叉点的线性空间中运行。正如我想的那样(比如@Yves Daoust)k应该非常小,这似乎是一个好主意。显然,你可以得到一些误报,例如,在平面中相交的线但在3D中不是这样。在3D中验证2D交叉是恒定时间操作,因此在总视图中不是大问题。