Поддержание динамического дерева может быть не так плохо, как вы думаете.
Когда вы вставляете новые точки / линии и т. Д. В коллекцию, становится ясно, что вам нужно будет уточнить текущее дерево, но я не понимаю, зачем вам каждый раз перестраивать все дерево с нуля. Как вы предлагаете, была добавлена новая сущность.
При подходе с динамическим деревом у вас всегда будет действительное дерево, поэтому вы можете просто использовать быстрый диапазон поиска, поддерживаемый вашим типом дерева, чтобы найти геометрические объекты, которые вы упомянули.
Для вашей конкретной проблемы:
Вы можете настроить динамическое геометрическое дерево, где элементы листа
вести список связанных геометрических объектов (точек и линий)
с этим листом.
Когда строка вставляется в коллекцию, она должна быть помещена на
списки всех конечных элементов, с которыми он пересекается. Ты можешь сделать
это эффективно путем обхода подмножества дерева от корня
пересекается с линией.
Чтобы найти все точки / линии в указанном радиальном гало, вам сначала нужно
найти все листья в этом регионе. Опять же, это может быть сделано путем обхода
подмножество дерева от корня, который заключен, или что
пересекается с ореолом. Так как может быть некоторое совпадение, вам нужно
проверьте, что объекты, связанные с этим набором конечных элементов
на самом деле лежат в гало.
После того, как вы вставили строку в набор листовых элементов, вы можете найти
пересекается ли она с другой линией, сканируя все линии
связан с подмножеством листовых коробок, которые вы только что нашли. Вы можете тогда
Выполните тесты пересечения линия-линия на этом подмножестве.
Потенциальный алгоритм динамического уточнения дерева, основанный на верхнем пределе числа сущностей, связанных с каждым листом в дереве, может работать по следующим направлениям:
function insert(x, y)
find the tree leaf element enclosing the new entitiy at (x,y) based on whatever
fast search algorithm your tree supports
if (number of entities per leaf > max allowable) do
refine current leaf element (would typically either be a bisection
or quadrisection based on a 2D tree type)
push all entities from the old leaf element list onto the new child element
lists, based on the enclosing child element
else
push new entity onto list for leaf element
endif
Этот тип стратегии уточнения только вносит локальные изменения в дерево и, таким образом, обычно довольно быстр на практике. Если вы также удаляете сущности из коллекции, вы также можете поддерживать динамическое агрегирование, устанавливая минимальное количество сущностей на лист и сворачивая листовые элементы своим родителям, когда это необходимо.
Я несколько раз использовал этот тип подхода с квадри / октре, и на этом этапе я не могу понять, почему подобный подход не будет работать с деревьями kd и т. Д.
Надеюсь, это поможет.