Обход четырех деревьев

Я реализовал Quadtree для сортировки точек на графике. Каждый раз, когда точка попадает в квадрант, который уже содержит точку, квадрант снова подразделяется, чтобы каждая точка попала в свой собственный квадрант. Каждый узел имеет следующие атрибуты:

Rectangle bounds; //The bounds of the quadrant
int num = 0; //The number of points in or below this node
Point point; //The point stored in this node. If the quadrant is divided, this is set to null.
Quadtree sub[]; //Pointers to the 4 subdivided quadrants.

Скажем, я хотел пройти через каждый узел, который хранится в этом дереве, и подсчитать количество точек, попадающих в границы данного прямоугольника, как бы я пошел о рекурсивной проверке каждого узла в дереве (Предполагая, что у меня уже есть методы, которые проверить, попадают ли они в определенный регион)?

1 ответ

Решение

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

Вот некоторый псевдокод, основанный на полях, которые вы упоминаете в своем вопросе:

int countPointsInRect(Quadtree root, Rectangle r) {

    // Entire bound of current node outside of given rectangle?
    if (root.bounds outside r)
        return 0

    // Part, or whole of current bound inside given rectangle:
    // Recurse on each subtree
    int sum = 0
    for (Quadtree q : sub)
        sum += countPointsInRect(q, r)
    return sum
}

Вы можете немного оптимизировать его, добавив следующую проверку перед повторением в поддеревьях:

    // Entire bound of current node inside given rectangle?
    if (root.bounds inside r)
        return num  // return immediately. No need to recurse

Дополнительное чтение:

Другие вопросы по тегам