Нужна помощь по Quadtrees java

Я искал какой-то способ реализовать quadtrees в моей 2D-симуляции, чтобы сделать обнаружение столкновений намного быстрее, дело в том, что я нахожу эту концепцию довольно сложной для понимания. Симулятор отлично работает, так как теперь просто, как только я преодолеваю 160-180 частиц, он становится очень медленным, поскольку обнаружение столкновений проходит через абсолютно все частицы без необходимости и просто глупо. Прямо сейчас это просто куча или круги, сталкивающиеся друг с другом по всему экрану, и я могу создавать новые с новой скоростью и местоположением, щелкая и перетаскивая мышь.

изменить1:

Ну, я думаю, что теперь я смог создать дерево, как вы можете видеть на изображении.

Мое изображение Quadtree: http://i.stack.imgur.com/c4WNz.jpg

Итак, теперь вопрос в том, как мне сделать его полезным для обнаружения столкновений...

Должен ли я создавать все дерево с нуля каждый раз, когда я проверяю?

Что я собираюсь сделать, пока жду, надеюсь, что это в некотором роде правильно :P

1_Проверьте, есть ли шар в каждом узле, и оставьте этот узел, если его нет. 2_Продолжайте проверять пересечения, пока я не достигну листового уровня и не добавлю эти пересекающиеся шары в конечный узел. 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);
    }
}

person Rikku121    schedule 13.07.2012    source источник


Ответы (1)


Я нахожу концепцию довольно сложной для понимания

Идея:

  • рекурсивное разбиение ячейки, так как:

    • the cell contains a fix count of primitives.
    • произошло максимальное количество разделов.
  • Начните с ограничивающей рамки для всей сцены.

  • Рекурсивный: разделите ячейки, если в них слишком много примитивов.
  • нет разделения, если комната пуста (адаптивная перегородка)
  • мелкая перегородка, где геометрия.

Подсказка: обход относительно дорог из-за большого количества перемещений вверх и вниз по иерархии.

  • Сохраните примитивы во внутренних узлах или в листьях.

Обход: - тест с выровненной по оси ограничивающей рамкой корня (сначала: вся сцена)

Подсказка: первое попадание не может быть ближайшим.

Короче говоря, это принцип дерева квадрантов или октодерева (3D). У меня есть cg слайд, который описывает его с изображениями, но я не хотел загружать их все. Я думаю, что это не полный ответ на ваш вопрос, но, возможно, это немного поможет.

person AxP    schedule 14.07.2012