最近邻搜索八叉树算法

时间:2014-07-02 11:02:43

标签: algorithm optimization nearest-neighbor octree

问题陈述:使用Octree查找每个粒子的最近GRID ID。

图[1]: enter image description here

图[2]: enter image description here

我有一个粒子系统(约6k,可移动),我需要检查哪个网格点(刚性;图中)最接近。有人建议我选择Octree,因为3D Grids的速度很快(可能)。

这是递归八叉树的正确算法,以获取网格的最近网格点吗?

  
      
  1. 获取输入作为点P开始坐标C(第一次[0,0,0])
  2.   
  3. 起始尺寸= [Sx,Sy,Sz]
  4.   
  5. 获得全部8个中点Mi = {M1,..,M8}获得Mi和P的最小距离
  6.   
  7. 假设M得到M的起始位置为Cn设定大小Sn = [Sx / 8,Sy / 8,Sz / 8]

  8.   
  9. 如果M和P的距离小于2 *(网格空间G):

         
        

    5.1。将所有网格点从Cn迭代到Sn

             

    5.2。打印最少结果

      
  10.   
  11. 否则

         
        

    6.1。将开始坐标设置为Cn

             

    6.2。将大小设置为Sn

             

    6.3。转到1

      
  12.   

问题:如果粒子在边界上或几乎在边界上,当它检查所有A x B x C时,最后一次迭代会吃掉所有速度。

请建议您是否有更好的方法来解决此问题。

1 个答案:

答案 0 :(得分:5)

这里没有必要使用八叉树。八叉树对于反向问题很有用(给定一个网格点,找到最近的粒子)但在这里完全没用。

假设网格单元格的大小为(a, b, c),则距离(x, y, z)最近的网格点为(a*floor(x/a+0.5), b*floor(y/b+0.5), c*floor(z/c+0.5))