Eksen teoremini çoklu çokgenlerle ayırmak?


9

C # 'da ayırma ekseni teoremini uygulamaya çalışıyorum. İki çokgen arasındaki minimum çeviri vektörü hesaplayabilirsiniz bir işlevi var. Ancak, bir çokgen ve diğer çokgenler arasındaki minimum çeviri vektörünü hesaplayan bir işlev oluşturamıyorum. Dürüst olmak gerekirse, aylardır bunun üzerinde çalışıyorum ve bir çözüme daha yakın değilim ve çevrimiçi bir çözüm bulamadım. Her zaman doğru sonucu döndürmeyen ve oyunumda yüksek öncelikli hatalara yol açan birkaç kenar durum vardır.

İşte düzgün çalışmayan yaygın kenar durumları:

kenar kılıfları

Bu sorunun bilinen bir çözümü var mı? Bulabildiğim tek şey "sadece her çokgene SAT gerçekleştir" diyen ama nadiren minimum çeviri vektörünü üreten bir şey .

Herhangi bir yardım çok takdir edilecektir.


Teste hiç girmediğim bir fikir, bazı ayırma eksenlerinin - sizi bitişik bir çokgene doğru hareket ettirecek olanların - asla minimum olarak görülmeyecek şekilde işaretlenebileceğidir. Daha sonra bir tür tekrarlanan test iyi sonuçlar verir (muhtemelen bir döngüde sıkışmayı önlemek için bir çeşit FIFO ve / veya yineleme limiti ile).
Andrew Russell

Bunun çözülmesi daha da zor bir şekli, bir şeklin kenarının sadece kısmen annot tarafından kaplanmasıdır. Örneğin, sağ üstteki resimde, orta kare sağa doğru genişlediyse, daha büyük bir dikdörtgen olur. Bu, on binlerce işgal edilmiş / işgal edilmemiş hücreyi alan ve bunu daha büyük çarpışma şekillerinin altına indiren bazı kodların çıktısına benzer
Richard Tingle

Yanıtlar:


2

İdeal olarak, ortamınızı çokgenlerden oluşturmazsınız. Kenarlardan inşa edersiniz (belki de bir çokgen kümesinden hesaplarsınız). İlk örneğinizde, örneğin, tek bir çapraz kenar vardır; son örnekte, kutu tek bir yatay kenar üzerinde durmaktadır.

Düzenleyicinizin veya araçlarınızın bir düzey oluşturmak için daha küçük, ayrı şekiller kullanması çalışma zamanını etkilememelidir.

Biraz daha basit bir yaklaşım, temel şekillerin "iç" kenarlarını kaldırır. Son örneğiniz için, "zemin" kutuları arasında iki kenar vardır; çarpışma tespiti sırasında bunları dikkate almayın.

Box2D belgelerindeki bölüm 4.5'i (kenarlar ve kenar zincirleri) okuyarak daha iyi resimler ve bazı uygulama fikirleri bulabilirsiniz .


2
Kenarları kullanmak (özellikle kenarlar, kenar zincirleri ile biraz daha iyidir), fizik nesnelerinin seviye geometrisinin içinde parlamasını çok kolay hale getirmesinin en büyük dezavantajı vardır .
Andrew Russell

1
@ AndrewRussell: normal tünel düzeltmeleriyle bu sorunlardan kaçınılır. Hareketli nesnelerinizin oldukça iyi bir hacme / alana sahip olduğundan emin olun, kare başına maksimum hızlarını yeterince düşük tutun, böylece en kısa boyutlarının yarısından fazlasını hareket ettiremezler (veya daha hızlı hareket etmek için gerekirse birden çok adımda), gerçekten keskin çatlaklar ve böyle bir seviye geometrisinde, "güvenli" bir son konum, vb yakınlaşana kadar çözünürlüğü defalarca tekrarlayın
Sean Middleditch
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.