在3D空间中搜索接近矢量的点

时间:2011-08-21 05:30:10

标签: c++ algorithm math 3d

我对数学很糟糕,但我有一种情况需要找到3D空间中的所有点,这些点任意接近通过同一空间投影的矢量。这些点可以以算法所要求的任何方式存储,而不是我能想到任何特别有利的排序。

这项专长是否有任何现有的C ++算法?如果是这样(或不是),那会是什么样的数学概念,或者它会带来什么样的数学概念,因为我喜欢尝试理解它并将我的大脑绑在一个椒盐脆饼上。

(这个算法将在一个可能有100,000个点的空间上运行,它需要测试大约1,000,000个向量,并且需要在1/30秒内完成这些向量。我当然怀疑是否有任何算法可以完全执行这个专长,但看看这是否真实会很有趣。)

2 个答案:

答案 0 :(得分:4)

您可能希望将点存储在某些空间数据结构中。想到的是:

  1. oct-trees
  2. BSP trees
  3. kd-trees
  4. 它们的属性略有不同。 oct-tree将整个世界划分为8个大小相同的立方体,组织起来形成一个更大的立方体。然后将这些立方体中的每一个分成8个均匀尺寸的立方体。您不断拆分立方体,直到立方体中的点数少于一定数量。使用此树结构,您可以非常轻松地遍历树,提取可能与给定多维数据集相交的所有点。获得该点列表后,您可以一次测试一个。由于您的测试几何体是一个球体(距离点的距离),因此您将围绕球体围绕一个立方体并获得可能与其相交的点。作为优化,你也可以在你的圈子中刻录一个立方体,并且任何肯定与之相交的东西,你可以立即包含在你的命中集中。

    BSP树是二进制空间分区树。它是一个三维空间的平面树,形成一棵二叉树。使用它来解决问题的主要问题是,在遍历它时可能需要做很多平方根,以找到飞机的距离。原则是相同的,一旦你的点数少于一些,就会形成一个带有这些点的叶子。 BSP树中的所有叶子都是凸多边形(沿着周边的叶子除外,它们将是无限大的多边形)。在构建BSP时,您希望将每个步骤的点分成两半,以真正获得O(log n)搜索。

    kd树是BSP的特例,其中所有平面都是轴对齐的。这通常可以显着加快对它们的测试,但不允许您根据您的点集优化平面。

    我不知道任何实现这些的c ++库,但我确信它们有很多。这些是视频游戏中常用的技术,所以你可能想看一下游戏引擎。

答案 1 :(得分:1)

当你可以把它想象成一条曲线来填充每个坐标只穿过一次并且没有穿过它自己的曲线时,它可能有助于你理解八叉树。曲线将3d复杂度映射到1d复杂度。有一些怪物曲线,如z曲线,希尔伯特曲线和摩尔曲线。后者是4个希尔伯特曲线的副本,具有非常好的空间填充质量。但是不是搜索用dijkstra算法解决的最近点吗?