Actualmente tengo islas que se ven así:
Y quiero subdividirlo procesalmente en regiones, así:
¿Qué algoritmo hace lo que estoy buscando? ¿Tiene sugerencias sobre cómo crear regiones coherentes como en la imagen inferior? Tu ayuda es apreciada.
procedural-generation
terrain
domisum
fuente
fuente
Respuestas:
En el mundo real, esas fronteras provinciales a menudo seguirán características geológicas como los ríos.
Entonces, ¿quizás un buen enfoque sería modelar la geología de la isla y hacer que las fronteras se salgan de esto?
Red Blob Games tiene algunos buenos artículos sobre este tema, con buenos resultados.
Su enfoque parece implicar el uso de la teselación de Voronoi y definir los ríos como los límites entre las células.
Mira los otros artículos en su sitio, ha escrito mucho sobre el tema de la generación de mapas .
fuente
Resolvería este problema con dos pases de diagramas de Voronoi:
Primer Pase: Particionamiento de Región
La primera pasada usaría una distribución de puntos algo dispersa (es decir, la distancia entre los puntos debería ser relativamente grande) para dividir aproximadamente la isla en regiones (ver la nota a continuación sobre la generación de puntos). Luego genere un diagrama de Voronoi basado en estos puntos. Esto dividirá la isla en regiones poligonales alrededor de cada punto como se muestra a continuación:
Segundo pase: aleatorización de fronteras
Ahora que la isla se ha dividido en regiones, el siguiente paso es 'desbastar' los límites entre ellas. Para hacerlo, genere una nueva capa de puntos usando una distribución más compacta de puntos (es decir, la distancia entre puntos debe ser pequeña) y nuevamente use estos puntos para crear otro diagrama de Voronoi. Luego, para cada región más pequeña, asígnela a una región más grande marcando su punto 'semilla'. Esto dará como resultado límites más irregulares entre las subdivisiones más grandes. Aquí hay un primer plano de cómo se ve con ambos diagramas de Voronoi en su lugar:
Y aquí está esa misma área que muestra solo los límites finales:
Comentarios en Generación de puntos
Con respecto a la generación de puntos, me gusta usar una distribución de disco de Poisson para obtener una distribución de puntos relativamente agradable y uniforme. La otra opción común es obtener una distribución igualmente pareja es usar el algoritmo de Lloyd en un conjunto de puntos aleatorios 'regulares'. LLoyd's es más fácil de codificar, pero puede tomar algunas pruebas y errores para determinar cuántos pases se requieren para obtener el resultado deseado.
Un problema potencial con este enfoque es que la partición de primer paso puede generar algunas regiones muy pequeñas. Si no los quiere en su resultado final, simplemente los fusionaría con una región adyacente aleatoria.
Notas finales
Las ilustraciones que proporcioné son imágenes rasterizadas, pero esta técnica también funciona con representaciones poligonales / vectoriales.
fuente
MineCraft hace esto muy bien, y su algoritmo de generación mundial ha sido analizado y documentado a fondo.
Hay varias descripciones del algoritmo, una de ellas aquí: https://github.com/UnknownShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-algorithm
El núcleo del algoritmo es un generador de ruido Perlin . Esto controla la elevación directamente (más o menos, ya que el paso posterior para crear cuevas también puede cambiar la superficie), así como la generación de biomas. Probablemente, algo como el generador de bioma es lo que desea utilizar para crear sus áreas.
(Una versión anterior) está documentada , básicamente funciona mediante el uso de dos generadores de ruido Perlin diferentes, uno para "temperatura", uno para "precipitación", y luego elige el bioma de esos dos. Las variables mismas (temperatura y precipitación) no se usan realmente en el juego más tarde; por ejemplo, los desiertos no tienen lluvia, pero el juego determina esto a partir de la propiedad "desierto", no del valor de precipitación original.
Existen varias herramientas en línea para generar un mapa de bioma a partir de una semilla aleatoria, una de ellas es mineatlas.com . Supongo que, internamente, usan un servidor java que usa las clases internas de MineCraft; No sé si alguno de sus códigos fuente está disponible directamente.
fuente
Un algoritmo típico utilizado, por ejemplo, por Azgaar ( código fuente ). Es más o menos así:
fuente
Si está interesado en hacer esto en formato vectorial en lugar de enfoques basados en ráster, he escrito una publicación de blog hace un tiempo sobre casi exactamente esto.
http://blog.particracy.com/worlds-and-their-geography/
La idea es comenzar con una malla (generalmente basada en Voronoi) y hacer crecer las regiones concéntricamente a partir de puntos sembrados al azar que están suficientemente separados.
fuente
Qué pregunta más divertida :) Este enfoque se basa en las células de Vornoi, pero la métrica de distancia no es del todo euclidiana (utilicé el poder de 1.5 en lugar de 2.0) y tiene algo de aleatoriedad incorporada. Puede saltar sobre el agua, lo que no es ideal.
Las regiones cercanas se pueden fusionar para obtener formas más interesantes, aquí utilicé los N vecinos más cercanos para determinar esto.
Si está interesado, puedo entrar en más detalles y compartir el código de Python.
fuente