¿Cómo funciona el algoritmo de embudo estúpido simple?

Respuestas:

18

El algoritmo comienza con una ruta que encontró anteriormente, en este caso una lista de triángulos:

camino

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.

portales

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).

algoritmo

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 triarea2en 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).

moviéndose hacia adentro

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).

embudo degenerado

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.

Eric
fuente
2
@Rolfcore ¿Está clara la respuesta? Si no, ¿qué partes necesitan mejoras?
Eric
Creo que se olvidó de aceptar la respuesta, esta es muy buena y debería ser votada en serie ^^.
GameDeveloper
Tal vez, tontamente, es que en el movimiento F no dices que no comenzamos de nuevo desde cero porque existe la posibilidad de que una esquina cerrada que apunte hacia el sur haga posible un embudo más apretado, por lo que tenemos que esperar que los lados del bot realmente fallen prueba y no solo una. Así que hacemos eso en G en lugar de F .. buena explicación de todos modos :)
GameDeveloper