Динамическое Дерево
Box2D - это хорошо оптимизированный движок, разработанный опытным программистом-физиком . Первоначально Box2D использовал хеш-сетку, которая требовала фиксированной высоты и ширины.
Когда Эрин обновил алгоритм до более широкого, он пошел с btDbvt Натанаэля Прессона. Это широкая фаза, используемая физикой пули. Эрин модифицировал и оптимизировал алгоритм для 2d.
Вы можете прочитать обзор сверхвысокого уровня в руководстве по Box2D (§4.11 или выполнить поиск по Dynamic Tree).
Вот исключение из документации в коде (что очень хорошо, учитывая, что оно не является частью общедоступного API).
Динамическое широкофазное дерево AABB, вдохновленное btDbvt Натанаэля Прессона. Динамическое дерево упорядочивает данные в двоичном дереве для ускорения запросов, таких как объемные запросы и приведение лучей. Листья являются прокси с AABB. В дереве мы расширяем прокси-AABB с помощью b2_fatAABBFactor, чтобы прокси-AABB был больше, чем объект клиента. Это позволяет клиентскому объекту перемещаться небольшими суммами без запуска обновления дерева.
Узлы объединяются и перемещаются, поэтому мы используем индексы узлов, а не указатели.
Мое понимание алгоритма Динамического Дерева таково. Динамическое дерево - это нечто среднее между классическим двоичным деревом avl и квадродеревом. Конечный эффект - это квадродерево, которое разделяет каждый узел пополам, и линия разделения не фиксируется (две половины не имеют одинакового размера, как дерево квадов). AVL приходит, потому что квадри с динамическими разбиениями может выродиться по существу в список (O (n) скорость поиска). AVL используется для балансировки поддеревьев, чтобы обеспечить скорость поиска O lg (N).
Лучше всего код MIT, так что не стесняйтесь копировать / получить / бесстыдно украсть / и т.д.