Actualmente estoy trabajando en la búsqueda de ruta A * en una cuadrícula y estoy buscando suavizar la ruta generada, al mismo tiempo que considero la extensión del personaje que se mueve a lo largo de ella. Estoy usando una cuadrícula para la búsqueda de ruta, sin embargo, el movimiento del personaje es itinerancia libre, no es estricto movimiento de mosaico a mosaico.
Para lograr un camino más suave y más eficiente, estoy haciendo trazos de línea en una cuadrícula para determinar si hay mosaicos no transitables entre los mosaicos para eliminar las esquinas innecesarias.
Sin embargo, debido a que un trazo de línea es de extensión cero, no tiene en cuenta la extensión del personaje y da malos resultados (no devuelve fichas no caminables que la línea acaba de perder, causando colisiones no deseadas).
Entonces, lo que estoy buscando es en lugar de un algoritmo de línea que determine los mosaicos debajo de él, estoy buscando uno que determine los mosaicos debajo de una línea de extensión de todo el mosaico. ¡Aquí hay una imagen para ayudar a visualizar mi problema!
¿Alguien tiene alguna idea? He estado trabajando con la línea de Bresenham y otras alternativas, pero aún no he descubierto cómo resolver este problema específico.
fuente
Respuestas:
¿Qué tal si dibuja una línea desde cada esquina del 'mosaico' en el que se encuentra en cada esquina del mosaico al que desea ir? Probablemente incluso pueda optimizar esto a 3 líneas en lugar de cuatro. ¿No detectaría esto correctamente todos los mosaicos en el camino?
En cuanto a las rutas más suaves, consulte los artículos sobre "comportamiento de dirección", especialmente aquellos que lo combinan con A *, por ejemplo, estos enlaces:
fuente
¡Acabo de implementar este algoritmo para un juego mío hace un par de días! (-8
Aquí está mi idea en forma de imagen:
Tenga en cuenta que el algoritmo funciona con rectángulos de cualquier tamaño. se basa en el hecho de que una esquina del rectángulo siempre colisiona primero con cualquier línea de cuadrícula. Esto significa que solo puede trazar un rayo y obtener todas las intersecciones que necesita.
Aquí está el algoritmo paso a paso:
Aquí hay algunos casos extremos, como cuando el rayo es exactamente vertical / horizontal, o cuando golpea una esquina exactamente, pero no son difíciles.
fuente
Este procedimiento es una adaptación de bresenham, que resuelve la pregunta original.
fuente