Динамічне дерево
Box2D - це добре оптимізований двигун, розроблений досвідченим фізичним / ігровим програмістом . Спочатку Box2D використовував хеш-сітку, яка вимагала фіксованої висоти та ширини.
Коли Ерін перейшов до кращого алгоритму широкої фази, він пішов з btDbvt Натанаеля Прессона. Це широка фаза, яку використовує Фізика кулі. Ерін модифікував і оптимізував алгоритм для 2d.
Ви можете прочитати надзвичайно високий рівень у керівництві Box2D (§4.11 або шукати Динамічне дерево).
Ось виняток із документації в коді (що дуже добре, враховуючи, що це не частина публічного API).
Динамічне дерево AABB широкої фази, натхнене btDbvt Натанаеля Прессона. Динамічне дерево впорядковує дані у двійкове дерево для прискорення запитів, таких як запити томів та передавачі променів. Листя - це проксі з AABB. У дереві ми розширюємо проксі-сервер AABB на b2_fatAABBFactor, щоб проксі-сервер AABB був більшим за клієнтський об’єкт. Це дозволяє клієнтському об’єкту рухатися невеликими розмірами, не викликаючи оновлення дерева.
Вузли об'єднані і переміщуються, тому ми використовуємо індекси вузлів, а не покажчики.
Я розумію алгоритм Динамічного дерева. Динамічне дерево - це схрещування між класичним бічним деревом avl та квадратом. Кінцевим ефектом є квадратне дерево, яке розбиває кожен вузол навпіл, а лінія розбиття не фіксована (дві половини не мають однакового розміру, як квадратичне дерево). AVL надходить, тому що квадрати з динамічними розщепленнями можуть перероджуватися до суттєво списку (O (n) швидкості пошуку). AVL використовується для перебалансування підтрубків, щоб забезпечити швидкість пошуку O lg (N).
Найкращим кодом є MIT, тому сміливо копіюйте / отримуйте / безсоромно красти / тощо.