需要帮助Quadtrees java

时间:2012-07-13 22:41:38

标签: java 2d simulation particles quadtree

我一直在寻找在我的2D模拟中实现四叉树的一些方法,以便使碰撞检测更快,我发现这个概念很难掌握。 SIM卡的效果非常好,因为它现在只是当我超过160-180粒子时它变得非常慢,因为碰撞检测绝对是所有粒子都是不必要的并且只是简单的愚蠢。 现在它只是一堆或几个圆圈在屏幕周围相互碰撞,我可以通过点击并拖动鼠标来产生新的速度和位置。

EDIT1:

嗯,我认为我现在能够创建树,如图所示

我的四叉树图片:http://i.stack.imgur.com/c4WNz.jpg

所以现在的问题是如何使它对我的碰撞检测有用...

每次检查时,是否必须从零创建整个树?

我等待的时候我要做什么,希望它在某种程度上正确:P

1_检查每个节点中是否有球,如果没有则将该节点留出。 2_Keep检查交叉点,直到我到达叶子级别并将那些相交的球添加到叶子节点。 在我继续前往叶节点的3_Collide球?

这是我的QuadTreeNode类:

public class QuadTreeNode { 
    private QuadTreeNode parent;
    private QuadTreeNode[] children;    
    private int id;
    private double x;
    private double y;
    private double width;
    private double height;

public QuadTreeNode(double x, double y, double width, double height, int id, QuadTreeNode parent){
    this.x = x;
    this.y = y;
    this.width =  width;
    this.height = height;
    this.children = new QuadTreeNode[4];
    this.id = id;
    this.parent = parent;
    //System.out.println("<x:>"+x+"<y:>"+y+"<w:>"+width+"<h:>"+height);     
    if (this.width>=1000/12 && this!=null){
        nodes+=1;
        this.children[0] = new QuadTreeNode(x, y, width/2, height/2, id+1, this);
        this.children[1] = new QuadTreeNode(x + width/2, y, width/2, height/2, id+2, this);
        this.children[2] = new QuadTreeNode(x, y + height/2, width/2, height/2, id+3, this);
        this.children[3] = new QuadTreeNode(x + width/2, y + height/2, width/2, height/2, id+4, this);
    }
}

1 个答案:

答案 0 :(得分:1)

  

我发现这个概念很难掌握

点子:

  • 单元格的递归分区:

    • 单元格包含固定的基元数。
    • 发生了最大分区数。
  • 从整个场景的边界框开始。

  • 递归:如果单元格中有太多基元,则将细胞分开。
  • 如果房间是空的,则不划分(自适应分区)
  • 几何图形所在的精细分区。

提示:由于hirarchy中的许多上下运动,遍历相对昂贵。

  • 将基元保存在内部节点或叶子中。

穿越: - 使用轴对齐的根边界框进行测试(第一个:整个场景)

提示:第一次点击不能是最近的。

简而言之,这就是四叉树或八叉树(3D)的原理。我在这里有一个cg幻灯片,用图像描述它,但我不想上传它们。我认为这不是你问题的完整答案,但也许有点帮助。