Come funziona l'algoritmo a imbuto semplice stupido?


Risposte:


18

L'algoritmo inizia con un percorso che hai trovato in precedenza, in questo caso un elenco di triangoli:

sentiero

Il codice in fondo al post del blog di Mikko costruisce l'array portals, che è un elenco di segmenti di linea che rappresentano i segmenti di linea tra i poligoni del percorso. Questi sono i "portali" attraverso i quali deve passare il percorso smussato (o i bordi del poligono da "tracciamo i punti medi del bordo poligonale"). Si noti che l'elenco dei portali inizia e termina con segmenti di linea degenerati all'inizio e ai punti obiettivo.

Questo elenco di portali è mostrato come segmenti di linea tratteggiata gialli nelle sue immagini.

portali

L'algoritmo inizia con un ampio imbuto e procede spostando iterativamente i lati dell'imbuto in avanti lungo i punti laterali del portale (i punti finali dei segmenti di linea) fintanto che questo stringe l'imbuto (AD).

algoritmo

Ciò significa che ogni spostamento in avanti dovrebbe spostare i bordi dell'imbuto verso l'interno, questo può essere verificato con il prodotto incrociato dei vettori che rappresentano il lato vecchio e il potenziale nuovo lato ( P × Q nell'immagine sotto; vedi anche triarea2nel codice di Mikko). Se un movimento in avanti per un lato non restringerebbe l'imbuto, non aggiorneremo quel lato per l'attuale iterazione dei portali (E).

muoversi verso l'interno

L'altro caso che deve essere gestito è quando l'imbuto degenera in un segmento di linea. Per tenere conto di ciò, l'algoritmo verifica se uno dei lati si trova sul lato "sbagliato" utilizzando nuovamente il prodotto incrociato, questa volta dei vettori realizzati rispettivamente dall'apice dell'imbuto e dai punti di estremità destra e sinistra ( R × S in l'immagine qui sotto).

imbuto degenerato

In questo caso, il vettore dall'apice dell'imbuto e il punto finale laterale corretto vengono aggiunti al percorso smussato ( R nell'immagine sopra) e l'algoritmo viene riavviato con il suo punto finale come nuovo apice (FG), a meno che, ovviamente, se è il punto obiettivo.


2
@Rolfcore La risposta è chiara? In caso contrario, quali parti devono essere migliorate?
Eric

Penso che abbia appena dimenticato di accettare la risposta, questa è molto buona e dovrebbe essere votata in serie ^^.
GameDeveloper,

Forse, tonly gotcha, è che nella mossa F non dici che non ricominciamo da zero perché esiste la possibilità che un angolo stretto rivolto a sud renderebbe possibile un imbuto più stretto, quindi dobbiamo aspettare che i lati del bot falliscano effettivamente test e non solo uno. Quindi lo facciamo in G invece che in F .. buona spiegazione comunque :)
GameDeveloper
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.