El algoritmo comienza con una ruta que encontró anteriormente, en este caso una lista de triángulos:
El código en la parte inferior de la publicación del blog de Mikko construye la matriz de portales, que es una lista de segmentos de línea que representan los segmentos de línea entre los polígonos de la ruta. Estos son los "portales" por los que debe atravesar la ruta suavizada (o los bordes del polígono desde "vamos a rastrear los puntos medios del borde del polígono"). Tenga en cuenta que la lista de portales comienza y termina con segmentos de línea degenerados en los puntos de inicio y objetivo.
Esta lista de portales se muestra como los segmentos de línea de puntos amarillos en sus imágenes.
El algoritmo comienza con un embudo ancho y continúa moviendo iterativamente los lados del embudo hacia adelante a lo largo de los puntos laterales del portal (los puntos finales de los segmentos de línea) siempre que esto ajuste el embudo (AD).
Esto significa que cada movimiento hacia adelante debe mover los bordes del embudo hacia adentro, esto se puede verificar con el producto cruzado de los vectores que representan el lado antiguo y el nuevo lado potencial ( P × Q en la imagen a continuación; ver también triarea2
en el código de Mikko). Si un movimiento hacia adelante para un lado no apretaría el embudo, no actualizamos ese lado para la iteración actual de los portales (E).
El otro caso que debe manejarse es cuando el embudo degenera en un segmento de línea. Para tener en cuenta esto, el algoritmo verifica si uno de los lados está en el lado "incorrecto" al usar nuevamente el producto cruzado, esta vez de los vectores formados por el vértice del embudo y los puntos finales del lado derecho e izquierdo respectivamente ( R × S en la imagen de abajo).
Si este es el caso, el vector del vértice del embudo y el punto final del lado correcto se agrega a la ruta suavizada ( R en la imagen de arriba) y el algoritmo se reinicia con su punto final como el nuevo vértice (FG), a menos que, por supuesto, si es el punto objetivo.