Non. La détection de collision n'est pas toujours O (N ^ 2).
Par exemple, disons que nous avons un espace de 100x100 avec des objets de taille 10x10. Nous pourrions diviser cet espace en cellules de 10x10 avec une grille.
Chaque objet peut se trouver dans jusqu'à 4 cellules de la grille (il peut s'insérer directement dans un bloc ou être «entre» les cellules). Nous pourrions garder une liste d'objets dans chaque cellule.
Nous avons seulement besoin de vérifier les collisions dans ces cellules. S'il y a un nombre maximum d'objets par cellule de grille (par exemple, il n'y a jamais plus de 4 objets dans le même bloc), la détection de collision pour chaque objet est O (1) et la détection de collision pour tous les objets est O (N).
Ce n'est pas le seul moyen d'éviter la complexité O (N ^ 2). Il existe d'autres méthodes, plus adaptées à d'autres cas d'utilisation - utilisant souvent des structures de données basées sur des arbres.
L'algorithme que j'ai décrit est un type de partitionnement d'espace , mais il existe d'autres algorithmes de partitionnement d'espace. Voir Types de structures de données de partitionnement d'espace pour plus d'algorithmes qui évitent la complexité temporelle O (N ^ 2).
Les mécanismes de prise en charge Box2D et Bullet réduisent le nombre de paires vérifiées.
Du manuel , section 4.15:
Le traitement des collisions dans une étape physique peut être divisé en phase étroite et phase large. Dans la phase étroite, nous calculons les points de contact entre des paires de formes. Imaginez que nous ayons N formes. En utilisant la force brute, nous aurions besoin d'effectuer la phase étroite pour N * N / 2 paires.
La classe b2BroadPhase réduit cette charge en utilisant une arborescence dynamique pour la gestion des paires. Cela réduit considérablement le nombre d'appels en phase étroite.
Normalement, vous n'interagissez pas directement avec la phase large. Au lieu de cela, Box2D crée et gère une large phase en interne. De plus, b2BroadPhase est conçu avec la boucle de simulation de Box2D à l'esprit, il n'est donc probablement pas adapté à d'autres cas d'utilisation.
Du Bullet Wiki :
Il existe différents types d'algorithmes à large phase qui améliorent l'algorithme naïf O (n ^ 2) qui renvoie simplement la liste complète des paires. Ces larges séquences optimisées introduisent parfois encore plus de paires sans collision, mais cela est compensé par leur temps d'exécution généralement amélioré. Ils ont des caractéristiques de performance différentes et aucune ne surpasse les autres dans toutes les situations.
Arbre AABB dynamique
Ceci est implémenté par la btDbvtBroadphase dans Bullet.
Comme son nom l'indique, il s'agit d'un arbre AABB dynamique . Une caractéristique utile de cette large phase est que la structure s'adapte dynamiquement aux dimensions du monde et de son contenu. Il est très bien optimisé et une très bonne large portée générale. Il gère des mondes dynamiques où de nombreux objets sont en mouvement, et l'ajout et la suppression d'objets sont plus rapides que SAP.
Balayer et tailler (SAP)
Dans Bullet, il s'agit de la gamme de classes AxisSweep. Il s'agit également d'une bonne large portée à usage général, avec une limitation qui nécessite une taille mondiale fixe, connue à l'avance. Cette phase large a les meilleures performances pour les mondes dynamiques typiques, où la plupart des objets ont peu ou pas de mouvement. BtAxisSweep3 et bt32AxisSweep3 quantifient les points de début et de fin pour chaque axe sous forme d'entiers au lieu de nombres à virgule flottante, pour améliorer les performances.
Le lien suivant est une introduction générale à la large bande et également une description de l'algorithme de balayage et d'élagage (bien qu'il l'appelle "Trier et balayer"):
http://www.ziggyware.com/readarticle.php?article_id=128
Jetez également un œil à la page wikipedia:
http://en.wikipedia.org/wiki/Sweep_and_prune