Generación de carreteras / ríos en un mapa de cuadrícula 2D


12

Esta es una pregunta para novatos, pero aquí va:

Mi mapa es una cuadrícula 2D y quiero generar carreteras y ríos. La ruta desde el punto inicial hasta el final no debe ser la ruta óptima en número de mosaicos. En cambio, deben tener un cierto nivel de aleatoriedad (turnos).

¿Existe un algoritmo estándar para este tipo de cosas?

¡Salud!

ACTUALIZAR:

Este es el resultado de jugar con pesas en la cuadrícula y aplicar un algoritmo de ruta más corta (Bellman-Ford) usando la biblioteca jgrapht. Fui con la respuesta de Donutz después de todo.

http://pastebin.com/AGQGK5ik


¿Hay algún obstáculo en el mapa?
MichaelHouse

Todavía no, el río será el primer obstáculo que se colocará.
Markos Fragkakis

Respuestas:


18

Puede generar la ruta óptima con A *, luego distorsionarla con el desplazamiento del punto medio.

ingrese la descripción de la imagen aquí

Esto asegurará que se cumplan sus puntos finales y le permitirá controlar la aleatoriedad en gran medida. Por ejemplo, no aleatorizaría carreteras tanto como ríos. Cualquier inteligencia que esté construyendo caminos generalmente intenta ser óptima al respecto.

Asegúrese de que si su mapa tiene obstáculos, verifique después de cada iteración que no está cruzando esos obstáculos.

Otro método sería generar ruido Perlin después de encontrar la ruta óptima, luego cambiar sus puntos en función del ruido generado. Por ejemplo, usando este ruido:

ingrese la descripción de la imagen aquí

Luego muestre con la ruta óptima en rojo y la ruta desplazada en azul:

ingrese la descripción de la imagen aquí

Observe cómo la ruta desplazada se ha "asentado" en las áreas más oscuras del ruido. De la misma manera que un río podría fluir a través de un valle.

Una de las ventajas de la elección del ruido Perlin es que puede tener en cuenta sus obstáculos y evitarlos como parte del algoritmo.


1
¿Cómo haces este punto cambiando la base del ruido?
Khoi

1
Depende de cómo esté almacenando el ruido y la línea generada. Primero puede encontrar el ruido más cercano / más bajo perpendicular a la línea en el centro, luego en los puntos medios entre el centro y los extremos, y así sucesivamente.
MichaelHouse

3

El algoritmo A * también le permitirá asignar valores a los mosaicos que indican su idoneidad. Por ejemplo, puede asignar los puntajes de costo más bajos a tierras bajas para ríos, a tierras planas (pero no pantanosas) para carreteras y generar en función de eso. Esto no le ofrece la ruta más corta, pero sí la ruta más eficiente. Aplique un poco de aleatoriedad a sus valores de mosaico y puede obtener algunas rutas subóptimas.


2

¿Qué pasa cuando la altura es un factor? Puedo hacer un mapa de altura con el algoritmo de diamante cuadrado. Estaba pensando en agregar un poco de agua al azar a cada azulejo y luego iterar y mover el agua a elevaciones más bajas hasta que todo se asentara, pero eso se ralentizaría y probablemente haría lagos, no ríos.

También estaba pensando en mirar las normales para cada ficha. Si 2 normales apuntan una hacia la otra, entonces debe ser un valle. El agua se acumularía en un valle. Si apuntan en la misma dirección o lejos el uno del otro, el agua no se acumulará. Esto probablemente sería más rápido que el método de iteración, pero podría no crear lagos, solo ríos. Tendría que jugar con él para evitar convertir cada instancia de mosaico en un río.


Leí uno de los documentos donde puede agregar un peso a cada mosaico, además de que ciertos mosaicos son simplemente intransitables.
Joe Plante
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.