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.
Respuestas:
Puede generar la ruta óptima con A *, luego distorsionarla con el desplazamiento del punto medio.
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:
Luego muestre con la ruta óptima en rojo y la ruta desplazada en azul:
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.
fuente
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.
fuente
¿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.
fuente