Saya mengembangkan quadtree untuk melacak objek bergerak untuk deteksi tabrakan. Setiap objek memiliki bentuk pembatas, katakanlah mereka semua adalah lingkaran. (Ini permainan top-down 2D)
Saya tidak yakin apakah hanya akan menyimpan posisi setiap objek, atau seluruh bentuk yang terikat.
Jika bekerja dengan titik, penyisipan dan subdivisi mudah, karena objek tidak akan pernah menjangkau beberapa node. Di sisi lain, kueri kedekatan untuk objek mungkin kehilangan tumbukan, karena tidak akan mempertimbangkan dimensi objek. Bagaimana cara menghitung wilayah permintaan ketika Anda hanya memiliki poin?
Jika bekerja dengan wilayah, bagaimana menangani objek yang membentang beberapa node? Haruskah itu dimasukkan ke dalam simpul induk terdekat yang benar-benar berisi itu, bahkan jika ini melebihi kapasitas simpul itu?
Terima kasih.
Anda harus menyimpannya di simpul terkecil yang benar-benar berisi itu - bahkan jika ini melebihi kapasitas (gunakan wadah yang dapat diubah ukurannya).
sumber
Saya akan menambahkan ini sebagai komentar sebagai jawaban atas jawaban @Nathan Reed, kecuali terlalu besar untuk menjadi komentar, dan mungkin dalam hal apa pun layak menjadi jawaban yang terpisah.
Kami melakukan persis apa yang diusulkan dalam jawabannya, dan bahkan memiliki komentar di sumber yang menghubungkan ke halaman ini. Sebagian besar, ini telah bekerja dengan sangat baik, kecuali bahwa sekali setiap dua atau tiga bulan, kami telah kehilangan server secara acak yang tidak responsif karena lamanya permintaan pencarian.
Penyebab utama masalah ini menjadi perhatian saya saat melakukan pemeriksaan kinerja untuk mencoba dan mencari tahu apa penyebabnya. Kemungkinan hanya masalah jika Anda mengizinkan objek yang tumpang tindih. Dalam permainan kami, kami lakukan, dan dalam skenario terburuk itu kadang-kadang menyebabkan lonjakan kedalaman membunuh kinerja.
Kami memiliki satu kasus tepi di mana sekitar 100 objek, semua dengan disk pembatas, dikelompokkan dalam jarak sangat dekat. Itu mengarah pada masalah lonjakan yang sangat dalam di pohon, karena kami sampai pada titik di mana objek lebih besar dari area yang dicakup oleh node quadtree, sehingga setiap objek baru muncul di beberapa node, yang mengarah ke subdivisi besar-besaran dari pohon, sehingga bola salju masalah di luar kendali.
Hal yang dapat diambil dari hal ini adalah jika Anda membiarkan daerah objek tumpang tindih, awasi dengan cermat benda-benda jika Anda mendapatkan kumpulan benda yang rapat, untuk memastikan pohon Anda tidak terlalu dalam.
Solusi yang saya selidiki saat ini adalah untuk menyimpan objek sebagai titik, dan kemudian ketika melakukan pencarian, tambahkan batas-batas persegi panjang pencarian dengan jari-jari maksimum yang tersimpan di pohon. Itu akan bekerja untuk kita, karena pohon adalah pencarian lulus pertama, kita kemudian melakukan pemeriksaan rentang berbasis lingkaran yang benar, bersama dengan beberapa pengecekan kriteria lainnya, sehingga peringatan palsu tambahan akan disaring.
Jarak tempuh Anda yang sebenarnya mungkin berbeda.
sumber