Tidak. Deteksi tabrakan tidak selalu O (N ^ 2).
Misalnya, kita memiliki ruang 100x100 dengan objek dengan ukuran 10x10. Kita bisa membagi ruang ini dalam sel 10x10 dengan kisi.
Setiap objek dapat dalam hingga 4 sel kisi (bisa pas di blok atau berada di antara sel). Kita bisa menyimpan daftar objek di setiap sel.
Kita hanya perlu memeriksa tabrakan di sel-sel itu. Jika ada jumlah maksimum objek per sel kotak (katakanlah, tidak pernah ada lebih dari 4 objek di blok yang sama), maka deteksi tumbukan untuk setiap objek adalah O (1) dan deteksi tumbukan untuk semua objek adalah O (N).
Ini bukan satu-satunya cara untuk menghindari kompleksitas O (N ^ 2). Ada metode lain, lebih memadai untuk kasus penggunaan lainnya - sering menggunakan struktur data berbasis pohon.
Algoritma yang saya jelaskan adalah satu jenis partisi Ruang , tetapi ada algoritma ruang partisi lainnya. Lihat Jenis struktur data partisi ruang untuk beberapa algoritma yang menghindari kompleksitas temporal O (N ^ 2).
Mekanisme dukungan Box2D dan Bullet untuk mengurangi jumlah pasangan yang diperiksa.
Dari manual , bagian 4.15:
Pemrosesan tabrakan dalam langkah fisika dapat dibagi menjadi fase sempit dan fase luas. Dalam fase sempit kami menghitung titik kontak antara pasangan bentuk. Bayangkan kita memiliki bentuk N. Menggunakan brute force, kita perlu melakukan fase sempit untuk pasangan N * N / 2.
Kelas b2BroadPhase mengurangi beban ini dengan menggunakan pohon dinamis untuk manajemen pasangan. Ini sangat mengurangi jumlah panggilan fase sempit.
Biasanya Anda tidak berinteraksi dengan fase luas secara langsung. Sebaliknya, Box2D membuat dan mengelola fase luas secara internal. Juga, b2BroadPhase dirancang dengan loop simulasi Box2D dalam pikiran, sehingga kemungkinan tidak cocok untuk kasus penggunaan lainnya.
Dari the Bullet Wiki :
Ada berbagai macam algoritma broadphase yang meningkatkan pada algoritma naif O (n ^ 2) yang hanya mengembalikan daftar pasangan yang lengkap. Broadphases yang dioptimalkan ini kadang-kadang memperkenalkan lebih banyak pasangan yang tidak bertabrakan tetapi ini diimbangi dengan waktu eksekusi yang secara umum ditingkatkan. Mereka memiliki karakteristik kinerja yang berbeda dan tidak ada yang mengungguli yang lain dalam semua situasi.
Pohon AABB dinamis
Ini diimplementasikan oleh btDbvtBroadphase di Bullet.
Seperti namanya, ini adalah pohon AABB yang dinamis . Salah satu fitur berguna dari broadphase ini adalah bahwa struktur beradaptasi secara dinamis dengan dimensi dunia dan isinya. Ini dioptimalkan dengan sangat baik dan broadphase tujuan umum yang sangat bagus. Ini menangani dunia yang dinamis di mana banyak objek bergerak, dan penambahan dan penghapusan objek lebih cepat dari SAP.
Sapu dan Pemangkas (SAP)
Dalam Bullet, ini adalah kisaran kelas AxisSweep. Ini juga merupakan broadphase tujuan umum yang baik, dengan batasan yang memerlukan ukuran dunia tetap, yang diketahui sebelumnya. Broadphase ini memiliki kinerja terbaik untuk dunia dinamika tipikal, di mana sebagian besar objek memiliki sedikit atau tanpa gerak. Baik btAxisSweep3 dan bt32AxisSweep3 mengkuantisasi titik awal dan akhir untuk setiap sumbu sebagai bilangan bulat alih-alih angka floating point, untuk meningkatkan kinerja.
Tautan berikut adalah pengantar umum untuk broadphase dan juga deskripsi dari algoritma Sweep and Prune (meskipun disebut "Sort and Sweep"):
http://www.ziggyware.com/readarticle.php?article_id=128
Juga, lihat halaman wikipedia:
http://en.wikipedia.org/wiki/Sweep_and_prune