İki köşeli çapraz görüş hattı


9

Şu anda görüş hattı için Bresenham'ın çizgi algoritmasını kullanıyorum. Sorun, oyuncuların duvarlardan bakabileceği bir uç dava buldum. Oyuncu, bir duvarın iki köşesi arasına, diğer tarafta belirli açılarda bir boşluk bırakarak ortaya çıkar.

Görüş hattı kenar çantası

İstediğim sonuç, iki duvar arasındaki döşemenin geçersiz olarak işaretlenmesidir.

İstenen sonuç

Bunu çözmek için Bresenham'ın çizgi algoritmasını değiştirmenin en hızlı yolu nedir? İyi bir çözüm yoksa, daha uygun bir algoritma var mı? Herhangi bir fikir bekliyoruz. Lütfen çözümün 3d'yi de destekleyebileceğini unutmayın.

Düzenleme: Benim basit çözüm, bir satırın x ve y koordinatları değiştiğinde her iki köşenin kapalı olup olmadığını kontrol etmek oldu. Çalışan kaynak kodu ve tamamlanmış ürünün interaktif bir demosu için lütfen http://ashblue.github.io/javascript-pathfinding/ adresine bakın.


2
Başlangıç ​​ve bitiş noktalarını değiştirirseniz fark yaratır mı? Belki de her iki hesaplamada engelsiz bir görüş alanı döndürürse sonuçları kabul edebilirsiniz. Ayrıca Lgue makalelerinin bazılarını RogueBasin'de faydalı bulabilirsiniz.
thalador

1
Her iki durumda da, 4-5'te diyagonal olan bu iki siyah blok ilk etapta bir duvara bağlı değildir ve bunu söylüyorum, çünkü örtülü olarak çapraz harekete izin veriyorsunuz. Bitişik bir duvar yapmak için bu diyagonalin karesini almalı veya çizgi yürüteçinizi 2-3 ve 4-5 gibi tamamen çapraz yapmak yerine çapraz hareketlerinden kare yapmalısınız.
Patrick Hughes

Çevirmek iyi bir fikir gibi geldi, ancak sorunu çözmüyor. Aklıma gelen tek şey, iki köşeden birinin boş olup olmadığını kontrol etmek ve görmek. Gerçi pahalı görünüyor.
Ash Blue

5
"Pahalı görünüyor" asla bir şey denememek için bir gerekçe değildir. "Çok pahalı olacak" genellikle, bir şeyin çok yavaş olacağını kanıtlayabileceğinizi varsayar.
Mokosha

3
Sadece gerekli algoritma değişikliği, hem X hem de Y aynı adımda değişiyorsa, önce X'i ve ardından Y'yi değiştirirse, bu diyagonalleri tamamen ortadan kaldıracaktır.
Patrick Hughes

Yanıtlar:


7

Eric Lippert, Gölge Dökümüyle C # 'da görüş hattı oluşturma konusunda mükemmel bir dizi yazdı. dikdörtgen bir düzlemsel ızgara üzerinde .

Eric, diğer sorunların yanı sıra, farklı sonuçlar veren ve birkaç farklı sonuçtan örnekler veren görüş hattı gereksinimleri hakkında cevaplanması gereken çeşitli sorular ele aldı. Makalelerden biri, algoritmasının erken bir versiyonunda ortaya çıkan "köşeye bakmak" durumu ile derinlemesine ilgileniyor.

Eric'in algoritmasını burada altıgen bir ızgaraya uyarladım ve geniş bir görüş yarıçapına (> 60 altıgen) sahip büyük altıgen ızgaralarda (> 400 x 700) başarıyla kullandım. Bu uygulama, tek bir i7 CPU kullanarak, tam görüş alanını yanıp sönebildiğim kadar hızlı hesaplar ve görüntüler. Bu kesinlikle koymak için herhangi bir kullanım için yeterince hızlı.

Güncelleme - Yüksekliği olan görüş hattı:
Yukarıda bağlantılı altıgen ızgara uygulaması, yalnızca engelleri değil, görüş hattını yükseklik ile hesaplar. Dokümantasyon notları, yükseklik hesaplamaları ile ilgili alınması gereken ek bir kararı da tartışır: Hedef yükseklik ve gözlemci yüksekliği. Varsayılan seçim, simetrik bir görüş alanı yaratan her ikisini de eşit yapmaktır, ancak zeminden yere ve gözlemci gözleri zemine de seçilebilir. (Kod MIT Lisansı altında Açık Kaynaktır)


Gerçekten Gölge Dökümünü kazıyorum, ama bir sorunla karşılaştım. Bir z ekseni ile çalışmak için algoritmayı ölçeklendirme hakkında herhangi bir bilgi bulmada sorun yaşıyorum. Bundan bahsettiğim için özür dilerim, ancak 3B olarak çalışması için önerilen kaynaklarınız var mı?
Ash Blue

@AshBlue: yukarıdaki eke bakınız
Pieter Geerkens

Kod tabanınıza bakıyorum. İçinde harika şeyler var, ancak altıgenlere uyarlanmış bir Bresenham benzeri çizgi çizme algoritması bulamıyorum. LOS ile yapar mısın?
MLProgrammer-CiM

@EfEs: FieldOfView döndürülen nesnedir; ShadowCastingFov * .cs, gölgeler oluşturarak görüş alanını oluşturur. Kod hakkında özel sorularınız varsa, bunlar en iyi sitenin Tartışmalar bölümünde sorulabilir; daha genel sorular Burada cevap vermekten mutluluk duyuyorum.
Pieter Geerkens

@PieterGeerkens Soruyu burada bulabilirsiniz gamedev.stackexchange.com/questions/57087/…
MLProgrammer-CiM

1

LOS hesaplaması için köşe boşluklarını dolduran ayrı bir "daha yüksek çözünürlük" ızgarasına sahipseniz. Ben böyle bir şey düşünüyordum:

resim açıklamasını buraya girin

Sol, 4 karenin orijinal blok bölümüdür.

Sağ "yüksek çözünürlüklü" versiyonu, her orijinal kare quaters ayrılmıştır ve köşelerden biri doldurulmuş görebilirsiniz. Bunu oluşturmak için algoritma hazırlıksız emin değilim, ama önceden hesaplanabilir mevcut haritadan.

Bu koordinat alanının dört katına çıktığı anlamına geliyor, ancak bunun önemli bir performans sorunu olacağını düşünmüyorum.


Yüksek çözünürlüğün orijinal ile tamamen aynı görüneceğinden eminim. Bir ızgarayı daha küçük bir ızgaraya böldüğünüzde, aynı görsel temsili, daha küçük bir ızgarayla elde edersiniz. Her bir kare aynı noktada 4 küçük kare haline gelir.
MichaelHouse

@ Byte56 Doğru, bu kopyaya fazladan bloklar eklemek için bölündükten sonra ek mantığın uygulanacağı anlamına geliyordu. Bunu yapmak için mantık okuyucuya bırakılan bir alıştırmadır.
Davy8

Orijinali bulanıklaştırarak yüksek çözünürlüklü ızgarayı kolayca oluşturabilirsiniz. Ardından, örneğin 0.5yüksek çözünürlüklü hücrelerin doldurulması veya doldurulmaması için bir eşik değeri belirleyin. Böylece, yüksek çözünürlüklü bir ızgara kullanmak benim için oldukça acayip geliyor.
danijar
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.