Dörtlü ne zaman mekansal hash tercih edilir?


12

Aynı anda çok sayıda nesne içeren 2 boyutlu bir platform yapıyorum. Hepsi AABB çarpışması tespit edildi. İlk olarak kontrol edilecek nesne sayısını azaltmak için bir dörtlü denedim, birkaç farklı yapılandırma denedim, ancak ihtiyaç duyduğum kadar etkili olmadı. Bir mekansal karma uyguladım ve çok daha verimli, her çarpışma için kontrol edilecek nesne sayısı önemli ölçüde azaldı.

Uzamsal hash yerine dörtlü kullanarak 2d çarpışma tespiti yapılırken bir durum söz konusu mudur? Testlerime göre, mekansal hash her zaman çarpışma için test edilecek daha az nesne ile sonuçlanıyor gibi görünüyor?

Algoritmalar üzerinde zamanlama yapmadım, ancak örneğin C kodlaması yaparken karma yapmak çok pahalı veya zor mu? Dikkate değer, ben "ücretsiz" hashing var javascript oyunu yazıyorum.

İşte karşılaştırma, bir şey göz ardı ettim mi? http://zufallsgenerator.github.io/2014/01/26/visually-comparing-algorithms/

Yanıtlar:


12

Dört ağacın en büyük avantajı, tüm kova gruplarını çok hızlı bir şekilde atmanıza izin vermesidir.

Örneğin, altı seviyeli bir dörtlü ağacım olduğunu varsayalım. En düşük seviyesinde, 32x32 kutu; Bu alt, en ayrıntılı seviyeyi içeren 1024 kutu. Karşılaştırma için, bir "mekansal karma" da düşüneceğiz - 32x32 kutu, toplam 1024 kutu içeren düz bir ızgara. (dört ağacın toplam 1024'ten fazla kutusu vardır, çünkü daha yüksek seviyelerinde daha büyük kutular da içerir)

Sistemde katlanabilir nesnelerin olmadığını varsayalım - dört ağacımızın ve düz ızgaramızın tüm kutuları tamamen boş.

Sınırlama kutusunun tüm bu kutularla kesişebileceği kadar büyük bir şeyin çarpışmalarını test ediyorsanız ve düz bir ızgara kullanıyorsanız, 1024 kutudan her birini bir şey olup olmadığını görmek için kontrol etmeniz gerekir. onlar.

Ancak iç içe dörtlü bir ağaç kullanıyorsanız, en üst düzey sistemde başka bir nesne olmadığını söyleyebilir ve bu nedenle çarpışma bulamayacağınızı bilmek için sadece tek bir kutuya bakmanız gerekir. ağacın derinliklerinde - testi hemen durdurabilirsiniz.

Benzer şekilde, nesneler dörtlü ağacın sadece belirli bölgelerinde varsa, dörtlü ağaç doğal olarak aramanızı sadece potansiyel olarak ilgili kutulardan yönlendirir, oysa ızgara kesişen her bir kutuyu kontrol etmenizi gerektirir, çünkü önceden bilmeniz mümkün değildir hangi ızgara karelerinin içinde nesneler olacak. Dört ağacınızın çoğu boşsa ve büyük, karmaşık sorgular (örneğin, küçük, basit dikdörtgenler yerine büyük kamera frustumları) yapıyorsanız, bunu yaparsanız toplamda çok daha az kutuyu yinelediğinizi görebilirsiniz. düz ızgara yerine ağaç yapısı kullanan bir şeye karşı test eder. Ve bu büyük bir fark yaratabilir.

Bunların hepsi elbette bir ağaç yapısının her zaman doğru seçim olduğu anlamına gelmez. Düz ızgaralar, örneğinizdeki durum için idealdir - dünyanın her yerine eşit derecede yayılmış yoğun nesne bulutları ve basit, ucuz çarpışma testleri yapıyoruz. Kesinlikle bir ızgara bu durumda en uygun yaklaşım olabilir!


6
Son derece tembel için laconic özet: Quadtrees, farklı boyutlardaki nesneleri daha hızlı işler.
Anko

Teşekkürler, bu mükemmel bir cevap! Nesnelerin tek biçimli boyutu şüphelendiğim bir şeydi.
Chris

Aslında, herhangi bir nesne olup olmadığını kontrol etmek için genellikle dörtlü ağacın tüm seviyelerinde arama yapmanız gerekecektir, çünkü bir seviye sadece her ikisi de bu seviyenin sınırlarına tamamen uyan ve daha düşük bir seviyeye sığmayan nesneler hakkında bilgi tutar.
1919'da

1
@malthe Bu tür bir sorguda erken çıkamayan bir dörtlü ağaç uygulaması kullanmakta ısrar ediyorsanız, bunun yerine kesinlikle bir uzamsal karma kullanın; bellek maliyetinin% 33'ünden tasarruf edersiniz ve bundan hiçbir şekilde yararlanamazsınız. Veya alternatif olarak, fikirsel saflığınızı sadece bir çukuru gevşetebilir ve her bir düğümün çocuklarındaki varlık sayısını izlemesini ya da boş düğümler olacak şekilde seyrek bir dörtlü kullanarak erken çıkabilen dörtlü bir ağaç kullanabilirsiniz. ihtiyaç duyulana kadar ağaçla olan bağlantısı kesildi. Aslında. Beş yıldan fazla bir süre sonra.
Trevor Powell

@TrevorPowell elbette haklısın. Sadece tek bir kutuya bakmak zorunda kaldığınızı garanti altına aldım. Bu doğru değil çünkü bu sayıları takip etmeniz gerekecek. Anlayabildiğim kadarıyla ağacın yukarısında ve yukarısındaki çarpışmaları bulabilirsiniz.
malthe
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.