Linea di mira diagonale con due angoli


9

In questo momento sto usando l'algoritmo di linea di Bresenham per la linea di vista. Il problema è che ho trovato un caso limite in cui i giocatori possono guardare attraverso i muri. Si verifica quando il giocatore guarda tra due angoli di un muro con uno spazio sull'altro lato con angoli specifici.

Astuccio per la linea di mira

Il risultato che voglio è che la piastrella tra due pareti sia contrassegnata come non valida.

Risultato desiderato

Qual è il modo più veloce per modificare l'algoritmo di linea di Bresenham per risolverlo? Se non esiste una buona soluzione, esiste un algoritmo più adatto? Tutte le idee sono benvenute. Si noti che la soluzione dovrebbe anche essere in grado di supportare 3d.

Modifica: la mia semplice soluzione era quella di verificare se entrambi gli angoli sono chiusi quando cambiano le coordinate xey di una linea. Per il codice sorgente funzionante e una demo interattiva del prodotto completato, consultare http://ashblue.github.io/javascript-pathfinding/


2
Fa differenza se si cambia punto iniziale e finale? Forse allora potresti semplicemente accettare i risultati se entrambi i calcoli restituiscono una linea di vista non ostruita. Potresti anche trovare utili alcuni degli articoli di LOS su RogueBasin.
Thalador

1
In ogni caso, quei due blocchi neri in diagonale a 4-5 non sono collegati in primo luogo a un muro, e lo dico perché stai implicitamente permettendo il movimento diagonale. Devi quadrare quella diagonale per renderla una parete contigua o far quadrare il tuo camminatore di linea dalle sue mosse diagonali invece di andare puramente diagonale come 2-3 e 4-5.
Patrick Hughes,

Lanciandolo sembrava una buona idea, ma non risolve il problema. L'unica cosa che mi viene in mente è controllare e vedere se uno dei due angoli è vuoto. Sembra costoso però.
Ash Blue,

5
"Sembra costoso" non è mai abbastanza una giustificazione per non provare qualcosa. "Sarà troppo costoso" generalmente è, supponendo che tu possa provare che qualcosa sarà troppo lento.
Mokosha,

3
L'unica modifica all'algoritmo richiesto è che se X e Y cambiano nello stesso passaggio, prima cambiano X e poi cambiano Y, questo eliminerebbe del tutto le diagonali.
Patrick Hughes,

Risposte:


7

Eric Lippert ha scritto un'eccellente serie sulla generazione di una visuale in C # con Shadow Casting su una griglia planare rettangolare.

Tra le altre questioni, Eric ha affrontato varie domande alle quali bisogna rispondere in merito ai requisiti della linea di vista, che danno risultati diversi e forniscono esempi di un paio di risultati diversi. Uno degli articoli tratta in modo approfondito una circostanza di "guardarsi dietro l'angolo" che si è verificata in una prima versione del suo algoritmo.

Qui ho adattato l'algoritmo di Eric a una griglia esagonale e l'ho usato con successo su griglie esagonali di grandi dimensioni (> 400 x 700) con un ampio raggio di visibilità (> 60 esagoni). Questa implementazione calcola e visualizza il campo visivo completo il più rapidamente possibile, utilizzando una singola CPU i7. Questo è sicuramente abbastanza veloce per tutti gli usi che mi aspetto di metterlo.

Aggiornamento - Linea di mira con elevazione:
l'implementazione della griglia esagonale collegata sopra calcola la linea di mira con elevazione, non solo ostacoli. Le note di documentazione discutono anche un'ulteriore decisione che deve essere presa riguardo ai calcoli di elevazione: l'altezza del bersaglio e l'altezza dell'osservatore. La selezione predefinita è di rendere entrambi uguali, il che crea un campo visivo simmetrico, ma si possono anche selezionare da terra a terra e da osservatori-occhi a terra. (Il codice è Open Source con licenza MIT)


Sto davvero scavando Shadow Casting, ma ho riscontrato un problema. Problemi a trovare qualsiasi informazione sul ridimensionamento dell'algoritmo per operare con un asse z. Mi dispiace menzionarlo, ma hai qualche risorsa suggerita per farlo funzionare in 3d?
Ash Blue,

@AshBlue: vedi addendum sopra
Pieter Geerkens,

Sto guardando la tua base di codice. Ha delle cose fantastiche, ma non mi sembra di trovare un algoritmo di disegno a tratteggio simile a Bresenham adattato agli esagoni. Lo fai con LOS?
MLProgrammer-CiM

@EfEs: FieldOfView è l'oggetto restituito; ShadowCastingFov * .cs genera il campo visivo proiettando ombre. Se hai domande specifiche sul codice, queste potrebbero essere poste nella sezione Discussioni del sito; domande più generali a cui sono felice di rispondere qui.
Pieter Geerkens,

@PieterGeerkens Puoi trovare la domanda qui gamedev.stackexchange.com/questions/57087/…
MLProgrammer-CiM

1

Che cosa succede se per il calcolo LOS si dispone di una griglia di "risoluzione più elevata" separata che riempie gli spazi vuoti d'angolo. Stavo pensando a qualcosa del genere:

inserisci qui la descrizione dell'immagine

La sinistra è la sezione originale a blocchi di 4 quadrati.

La destra è la versione "ad alta risoluzione", come puoi vedere ogni quadratino originale è stato suddiviso in quatri e uno degli angoli è stato riempito. Non sono sicuro che l'algoritmo lo abbia generato, ma può essere pre-calcolato dalla mappa corrente.

Significa che lo spazio delle coordinate è quadruplicato ma non immagino che si tratti di un problema di prestazioni significativo.


Abbastanza sicuro che la risoluzione più alta sarebbe esattamente la stessa dell'originale. Quando si divide una griglia in una griglia più piccola, si ottiene la stessa rappresentazione visiva, solo con una griglia più piccola. Ogni singolo quadrato diventa solo 4 quadrati più piccoli nello stesso punto.
MichaelHouse

@ Byte56 Corretto, intendevo dire che sarebbe stata applicata una logica aggiuntiva dopo averla divisa per aggiungere i blocchi extra a quella copia. La logica per farlo è un esercizio lasciato al lettore.
Davy8

È possibile generare facilmente la griglia ad alta risoluzione sfocando l'originale. Quindi definire una soglia, diciamo, 0.5per riempire o meno celle ad alta risoluzione. Quindi, usare una griglia ad alta risoluzione mi sembra del tutto confuso.
danijar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.