Árbol dinámico
Box2D es un motor bien optimizado diseñado por un programador experimentado de física / juegos . Originalmente, Box2D utilizaba una cuadrícula hash que requería una altura y un ancho fijos.
Cuando Erin actualizó a un mejor algoritmo de fase ancha, eligió el btDbvt de Nathanael Presson. Esta es la fase ancha utilizada por Bullet Physics. Erin modificó y optimizó el algoritmo para 2d.
Puede leer una descripción general de nivel súper alto en el manual de Box2D (§4.11, o buscar Dynamic Tree).
Aquí hay una excepción de la documentación del código (que es muy bueno considerando que no es parte de la API pública).
Un árbol dinámico AABB de fase amplia, inspirado en el btDbvt de Nathanael Presson. Un árbol dinámico organiza los datos en un árbol binario para acelerar las consultas, como las consultas de volumen y las emisiones de rayos. Las hojas son representantes con un AABB. En el árbol, expandimos el proxy AABB por b2_fatAABBFactor para que el proxy AABB sea más grande que el objeto del cliente. Esto permite que el objeto del cliente se mueva en pequeñas cantidades sin activar una actualización de árbol.
Los nodos se agrupan y se pueden reubicar, por lo que utilizamos índices de nodos en lugar de punteros.
Mi comprensión del algoritmo del árbol dinámico es esto. El árbol dinámico es el cruce entre un árbol binario avl clásico y un árbol cuádruple . El efecto final es un árbol cuádruple que solo divide cada nodo por la mitad, y la línea de división no es fija (las dos mitades no tienen el mismo tamaño que un árbol cuádruple). AVL entra porque el cuadrante con divisiones dinámicas puede degenerar esencialmente a una lista (O (n) velocidad de búsqueda). El AVL se utiliza para reequilibrar los subárboles para garantizar la velocidad de búsqueda de O lg (N).
Lo mejor de todo es que el código es MIT, así que siéntase libre de copiar / derivado / robar descaradamente / etc.