有效的方法来查找内部或交叉边界框的对象集?

时间:2015-11-22 11:35:18

标签: algorithm optimization data-structures

我有一组3d对象{obj1,obj2,..... objn}和一个3D边界框B.现在使用下面的代码找到内部或交叉边界框B i的对象集合,在O(n)中计算

    int[] studlist;
    String name="";
    String fscore="";
    int i, score;

    Scanner myScanner = new Scanner(System.in);
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    System.out.println("How many students?:");
    int students = myScanner.nextInt();
    studlist = new int[students];
    for( i = 0; i < studlist.length; i++){
   try{ 

    System.out.println("Enter Name:");
    name = br.readLine();
   }
    catch(IOException e)
{
    System.out.println("Error enter name!");
}
   try{
    System.out.println("Enter Score:");
    fscore = br.readLine();
   }
  catch(IOException f)
{
    System.out.println("Error enter grade!");
}
    }   
    System.out.println("Display list of Students and Score:");

      System.out.println(name+" "+fscore);



}

我正在寻找有效的计算方法,减少O(n)搜索,有什么办法吗?由于边界框B每帧更改,因此对于100000个对象来说非常慢。

3 个答案:

答案 0 :(得分:1)

当我曾经不得不做类似的事情时,我为我的点创建了一组固定的边界框(因此每个点都在1个框中),然后在给出边界框B的查询时(不一定在我的我找到了一组边界框,它们根据B的坐标共同包含B(通常是8个),并快速检查它们中的点以查看它们是否在B中。

如果B的大小是固定的,请将该大小用于固定集合中的框。

例如,在3个空间中,n个点随机分布在一个大的盒子中,如果我们通过将每个维度划分为k个块来形成子盒网格,那么每个盒子将具有大约(1 / k)^ 3个点。

答案 1 :(得分:1)

您可以通过升序X,Y和Z坐标对静态对象进行排序(因此您有3个相同对象的列表)并进行二分查找以找到适合X,Y,Z范围的对象(您只需要搜索第一个和最后一个),然后将这些结果相交。

对于移动物体来说,它有点棘手,但如果对移动速度有限制,你仍然可以将对象放在粗略的类别中,每X帧只重新计算一次。

答案 2 :(得分:1)

如果我理解正确,您可能希望使用多维索引并对它们执行窗口查询。多维度索引是专门为此构建的。 简单的标准多索引是四叉树/八叉树,kd树和R树。 如果你有很多对象,并且你的对象正在移动,你可能想看看专门的移动对象树。例如,那些是PH-Tree,here(Java)是我写的一个实现。