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