Árvore dinâmica
O Box2D é um mecanismo bem otimizado, projetado por um experiente programador de física / jogos . Originalmente, o Box2D usava uma grade de hash que exigia altura e largura fixas.
Quando Erin atualizou para um algoritmo de fase larga melhor, ele optou pelo btDbvt de Nathanael Presson. Esta é a fase larga usada pela Bullet Physics. Erin modificou e otimizou o algoritmo para 2d.
Você pode ler uma visão geral de nível super alto no manual do Box2D (§4.11, ou procurar Árvore Dinâmica).
Aqui está uma exceção da documentação do código (o que é muito bom, considerando que não faz parte da API pública).
Uma fase dinâmica de árvore dinâmica da AABB, inspirada no btDbvt de Nathanael Presson. Uma árvore dinâmica organiza dados em uma árvore binária para acelerar consultas, como consultas de volume e transmissões de raios. As folhas são proxies com um AABB. Na árvore, expandimos o proxy AABB por b2_fatAABBFactor para que o proxy AABB seja maior que o objeto do cliente. Isso permite que o objeto cliente se mova em pequenas quantidades sem acionar uma atualização em árvore.
Os nós são agrupados e realocáveis, portanto, usamos índices de nós em vez de ponteiros.
Meu entendimento do algoritmo da Árvore Dinâmica é esse. A árvore Dinâmica é o cruzamento entre uma árvore binária avl clássica e uma quadtree. O efeito final é um quadtree que divide apenas cada nó ao meio e a linha de divisão não é fixa (as duas metades não têm o mesmo tamanho de uma quad tree). O AVL entra porque o quadree com divisões dinâmicas pode degenerar para essencialmente uma lista (O (n) velocidade de pesquisa). O AVL é usado para reequilibrar as subárvores, de modo a garantir a velocidade de pesquisa de O lg (N).
O melhor de tudo é que o código é o MIT, então sinta-se livre para copiar / derivar / roubar vergonhamente / etc.