QuadTree: sadece noktaları mı yoksa bölgeleri mi saklıyorsunuz?


9

Çarpışma tespiti için hareketli nesneleri takip etmek için bir dörtlü geliştiriyorum. Her nesnenin sınırlayıcı bir şekli vardır, diyelim ki hepsi daire. (2D yukarıdan aşağıya bir oyun)

Yalnızca her nesnenin konumunu veya tüm sınırlayıcı şekli saklayıp saklamadığından emin değilim.

Noktalarla çalışırken, ekleme ve alt bölümleme kolaydır, çünkü nesneler asla birden fazla düğüme yayılmaz. Öte yandan, bir nesnenin yakınlık sorgusu, nesnelerin boyutlarını dikkate almadığı için çarpışmaları kaçırabilir. Yalnızca puanınız olduğunda sorgu bölgesi nasıl hesaplanır?

Komşu düğümlerden nesneler arasındaki çarpışma

Bölgelerle çalışıyorsanız, birden çok düğüme yayılan bir nesne nasıl işlenir? Düğümün kapasitesini aşsa bile, tamamen içeren en yakın üst düğüme eklenmeli mi?

Hangi düğüm kırmızı nesneyi içermelidir?

Teşekkürler.

Yanıtlar:


4

Genişletilmiş nesneleri (bölgeler) bir dört ağaçta saklıyorsanız, nesneye dokunduğu tüm yaprak düğümlerinden başvurulmalıdır. En az ortak atayı bulmaya ve orada saklamaya çalışmam, çünkü o zaman örneğin yüksek seviyeli bir sınırı aşan küçük bir nesne çok yüksek bir düğümle sonuçlanacak ve bu büyük boyuttaki diğer her şeye karşı test edilmelidir. , çarpışma sorguları ve benzeri yaptığınızda, üst düzey düğüm.

Bununla birlikte, dikkatli olmanız gerekir, çünkü büyük nesnelere birçok düğümden referans verilebilir, bu da hareket ettiklerinde güncellenmelerini pahalı hale getirir ve çarpışmalar vb. İçin birçok kez tekrar kontrol edilmelerine neden olur. büyük nesneleri ağaçta daha yüksek bir seviyede saklamak için bir tür buluşsal yöntem kullanmaya değer olabilir, ancak bu algoritmaları karmaşık hale getirecektir, bu yüzden durumunuzda gerçekten bir performans sorunu olduğunu belirlemediğiniz sürece muhtemelen rahatsız etmem.

Benzer şekilde, bir bölgeyi sorgulamak için sorgu, sorgulanan bölgenin dokunduğu tüm yaprak düğümlerine bakmalıdır.

Bunlar temel olarak bir bölge ile başlayıp dokunduğu yaprak düğümlerini bulmak için ağaçtan aşağı doğru iten aynı algoritmayı kullanır. Bu, önce derinlikli bir geçiştir, ancak her düğümde bölgeye dokunmayan çocukları budayabilirsiniz. Geçişte nerede olduğunuzu takip etmek için bir yığın bulundurmanız gerekir.


Teşekkürler, bu mantıklı. Tabii, çapraz düğüm nesnelerini işlemek tamamen bir düğümün içindeki nesnelerden daha yavaş olurdu, ancak bunun etrafında bir yol göremiyorum. Parçalanmayı düşük tutmak için düğüm kapasitesini artırabilirim, ancak bu çarpışma algılamaya dahil edilen nesne sayısını artıracaktır. İyi bir denge bulmak için bununla oynayacağım.
alekop

4

Kapasiteyi aşsa bile, onu tamamen içeren en küçük düğümde saklamanız gerekir (yeniden boyutlandırılabilir bir kap kullanın).


2

Bunu @Nathan Reed'in cevabına bir yorum olarak ekleyeceğim, ancak yorum yapmak için çok büyük ve belki de her durumda ayrı bir cevap olmaya değer.

Cevabında önerilenleri tam olarak yapıyorduk ve aslında bu sayfaya bağlantı veren kaynak hakkında yorum yaptık. Çoğunlukla, iki veya üç ayda bir, çok fazla arama sorgusu nedeniyle yanıt vermeyen rastgele bir sunucuyu kaybetmemiz dışında son derece iyi çalıştı.

Buna neyin sebep olduğunu anlamak için bir performans kontrolü yaparken sorunun temel nedeni dikkatimi çekti. Büyük olasılıkla, üst üste binen nesnelere izin vermeniz endişe vericidir. Oyunumuzda yapıyoruz ve en kötü senaryoda, bazen performans öldürme derinliği artışına yol açıyor.

Sınırlayıcı diskleri olan yaklaşık 100 nesnenin çok yakın bir yerde toplandığı bir kenar vakamız vardı. Bu, ağaçta çok derin bir başak sorununa yol açar, çünkü nesnelerin dörtlü düğümlerin kapsadığı alandan daha büyük olduğu noktaya geldik, bu nedenle her yeni nesne birden fazla düğümde görünüyordu ve bu da ağaç, böylece kontrol dışı kartopu.

Buradaki paket, nesne bölgelerinin çakışmasına izin verirseniz, nesnelerin sıkı kümeleri alırsanız, ağacınızın çok derinleşmediğinden emin olmak için şeylere yakından bakın.

Şu anda araştırdığım çözüm, nesneleri nokta olarak saklamak ve daha sonra bir arama yaparken, arama dikdörtgeninin sınırlarını ağaçta depolanan maksimum yarıçap ile arttırmaktır. Bu bizim için işe yarayacaktır, çünkü ağaç ilk geçiş araması olduğundan, diğer birkaç kriter kontrolüyle birlikte gerçek bir daire tabanlı aralık kontrolü yaparız, böylece ekstra yanlış uyarılar filtrelenir.

Gerçek kilometreniz değişebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.