В настоящее время я пишу KDTree для физического движка (проект Хобби).
KDTree не содержит точек. Вместо этого он содержит ограничивающие рамки Axis Aligned, которые связывают разные объекты в среде.
Моя проблема заключается в том, как разбить узлы KDTree, когда они будут заполнены. Я пытаюсь использовать 2 метода:
Метод 1: Всегда разделяйте node ровно наполовину на самой большой оси.
- Это имеет преимущество довольно равномерно распределенного дерева.
- Большой недостаток: если объекты сконцентрированы в небольшой области node, будут созданы резервные подразделения. Это связано с тем, что все тома разделены ровно наполовину.
Метод2: найдите область node, которая содержит объекты. Разделите node на плоскости, которая разбивает эту область пополам на самой большой оси. Пример. Если все объекты сконцентрированы в нижней части node, тогда он разделяется по длине, тем самым разделяя дно на две части.
- Это решает проблему с помощью метода выше
- При индексировании того, что существует на одной плоскости (например, местности), он создает длинные узкие узлы. Если я буду добавлять некоторые другие объекты позже, которые не находятся на одной плоскости, эти удлиненные узлы обеспечивают очень низкую индексацию.
Итак, я ищу здесь лучший способ разбить KD-Tree node. Учитывая, что это будет физический движок, решение должно быть достаточно простым, чтобы его можно было сделать в режиме реального времени.