L'algoritmo inizia con un percorso che hai trovato in precedenza, in questo caso un elenco di triangoli:
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.
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).
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 triarea2
nel 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).
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).
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.