Я искал какой-то способ реализовать 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);
}
}