No. Il rilevamento delle collisioni non è sempre O (N ^ 2).
Ad esempio, supponiamo di avere uno spazio 100x100 con oggetti con dimensioni 10x10. Potremmo dividere questo spazio in celle di 10x10 con una griglia.
Ogni oggetto può trovarsi in un massimo di 4 celle della griglia (potrebbe adattarsi perfettamente a un blocco o essere "tra" celle). Potremmo tenere un elenco di oggetti in ogni cella.
Dobbiamo solo verificare la presenza di collisioni in quelle celle. Se esiste un numero massimo di oggetti per cella della griglia (ad esempio, non ci sono mai più di 4 oggetti nello stesso blocco), il rilevamento delle collisioni per ogni oggetto è O (1) e il rilevamento delle collisioni per tutti gli oggetti è O (N).
Questo non è l'unico modo per evitare la complessità O (N ^ 2). Esistono altri metodi, più adeguati per altri casi d'uso, che spesso utilizzano strutture di dati basate su alberi.
L'algoritmo che ho descritto è un tipo di partizionamento spazio , ma ci sono altri algoritmi di partizionamento dello spazio. Vedere Tipi di strutture di dati di partizionamento dello spazio per alcuni algoritmi in più che evitano la complessità temporale di O (N ^ 2).
Box2D e Bullet supportano meccanismi per ridurre il numero di coppie verificate.
Dal manuale , sezione 4.15:
L'elaborazione delle collisioni in una fase della fisica può essere suddivisa in fase stretta e fase larga. Nella fase stretta calcoliamo i punti di contatto tra coppie di forme. Immagina di avere N forme. Usando la forza bruta, avremmo bisogno di eseguire la fase stretta per coppie N * N / 2.
La classe b2BroadPhase riduce questo carico utilizzando un albero dinamico per la gestione delle coppie. Ciò riduce notevolmente il numero di chiamate in fase stretta.
Normalmente non interagisci direttamente con la fase larga. Invece, Box2D crea e gestisce internamente una fase larga. Inoltre, b2BroadPhase è progettato pensando al loop di simulazione di Box2D, quindi probabilmente non è adatto per altri casi d'uso.
Dal Bullet Wiki :
Esistono vari tipi di algoritmi a larga fase che migliorano l'algoritmo O (n ^ 2) ingenuo che restituisce solo l'elenco completo di coppie. Queste fasi ottimizzate a volte introducono ancora più coppie non collidenti, ma ciò è compensato dal tempo di esecuzione generalmente migliorato. Hanno caratteristiche prestazionali diverse e nessuna supera le altre in tutte le situazioni.
Albero dinamico AABB
Questo è implementato da btDbvtBroadphase in Bullet.
Come suggerisce il nome, questo è un albero AABB dinamico . Una caratteristica utile di questa fase larga è che la struttura si adatta dinamicamente alle dimensioni del mondo e ai suoi contenuti. È ottimizzato molto bene e un'ottima fase per scopi generici. Gestisce mondi dinamici in cui molti oggetti sono in movimento e l'aggiunta e la rimozione di oggetti è più rapida di SAP.
Sweep and Prune (SAP)
In Bullet, questa è la gamma di classi AxisSweep. Questa è anche una buona fase generica, con la limitazione che richiede una dimensione mondiale fissa, nota in anticipo. Questa fase ha le migliori prestazioni per mondi tipici della dinamica, in cui la maggior parte degli oggetti ha poco o nessun movimento. Sia btAxisSweep3 che bt32AxisSweep3 quantizzano i punti di inizio e fine per ciascun asse come numeri interi anziché numeri in virgola mobile, per migliorare le prestazioni.
Il seguente link è un'introduzione generale alla fase larga e anche una descrizione dell'algoritmo Sweep and Prune (sebbene lo chiami "Sort and Sweep"):
http://www.ziggyware.com/readarticle.php?article_id=128
Inoltre, dai un'occhiata alla pagina di Wikipedia:
http://en.wikipedia.org/wiki/Sweep_and_prune