我有一组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个对象来说非常慢。
答案 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)是我写的一个实现。