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

1

Я применил 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.

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

Теги:
quadtree

1 ответ

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

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

  • 0
    Хорошо, это имеет смысл. Я пытаюсь создать рекурсивный метод проверки каждого узла.
  • 0
    Ответ обновлен.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню