J'ai actuellement des îles qui ressemblent à ceci:
Et je veux le subdiviser procéduralement en régions, comme ceci:
Quel algorithme fait ce que je recherche? Avez-vous des suggestions sur la façon de créer des régions cohérentes comme dans l'image du bas. Votre aide est appréciée.
procedural-generation
terrain
domisum
la source
la source
Réponses:
Dans le monde réel, ces frontières provinciales suivent souvent des caractéristiques géologiques comme les rivières.
Alors peut-être qu'une bonne approche serait de modéliser la géologie de l'île et d'en faire tomber les frontières?
Red Blob Games a de bons articles sur ce sujet, avec de beaux résultats.
Son approche semble impliquer l'utilisation de la tessellation Voronoi et définir les rivières comme les limites entre les cellules.
Consultez les autres articles sur son site, il a beaucoup écrit sur le sujet de la génération de cartes .
la source
Je résoudrais ce problème avec deux passes de diagrammes de Voronoi:
Premier passage: partitionnement de région
La première passe utiliserait une distribution de points quelque peu clairsemée (c'est-à-dire que la distance entre les points devrait être relativement grande) afin de diviser grossièrement l'île en régions (voir la note ci-dessous concernant la génération de points). Générez ensuite un diagramme de Voronoi basé sur ces points. Cela divisera l'île en régions polygonales autour de chaque point, comme indiqué ci-dessous:
Deuxième passage: randomisation des frontières
Maintenant que l'île a été divisée en régions, la prochaine étape consiste à «brouiller» les frontières entre elles. Pour ce faire, générez une nouvelle couche de points en utilisant une distribution de points plus compacte (c'est-à-dire que la distance entre les points doit être petite) et utilisez à nouveau ces points pour créer un autre diagramme de Voronoi. Ensuite, pour chaque petite région, affectez-la à une plus grande région en vérifiant son point de départ. Cela se traduira par des frontières plus dentelées entre les grandes subdivisions. Voici un aperçu de ce à quoi il ressemble avec les deux diagrammes de Voronoi en place:
Et voici cette même zone montrant uniquement les limites finales:
Commentaires sur Point Generation
En ce qui concerne la génération de points, j'aime utiliser une distribution de disques de Poisson afin d'obtenir une distribution relativement agréable et uniforme des points. L'autre option courante consiste à obtenir une distribution homogène de la même manière: utiliser l'algorithme de Lloyd sur un ensemble de points aléatoires «réguliers». LLoyd est plus facile à coder, mais peut prendre un certain nombre d'essais et d'erreurs pour déterminer le nombre de passes nécessaires pour donner le résultat souhaité.
Un problème potentiel avec cette approche est que le partitionnement de première passe peut générer de très petites régions. Si vous ne les voulez pas dans votre résultat final, je les fusionnerais simplement avec une région adjacente aléatoire.
Notes finales
Les illustrations que j'ai fournies sont des images tramées, mais cette technique fonctionne également avec les représentations polygonales / vectorielles.
la source
MineCraft le fait très bien, et son algorithme de génération mondiale a été analysé et documenté de manière approfondie.
Il existe différentes descriptions de l'algorithme, l'une d'elles ici: https://github.com/UnknownShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-algorithm
Le cœur de l'algorithme est un générateur de bruit Perlin . Cela contrôle directement l'élévation (plus ou moins, car l'étape suivante pour creuser des grottes peut également changer la surface), ainsi que la génération de biomes. Quelque chose comme le générateur de biome est probablement ce que vous souhaitez utiliser pour créer vos zones.
(Une ancienne version de celui-ci) est documentée , fondamentalement, cela fonctionne en utilisant deux générateurs de bruit Perlin différents, un pour la "température", un pour la "précipitation", puis en choisissant le biome parmi ces deux. Les variables elles-mêmes (température et précipitations) ne sont pas vraiment utilisées plus tard dans le jeu; par exemple, les déserts n'ont pas de pluie, mais le jeu le détermine à partir de la propriété "désert", pas à partir de la valeur des précipitations d'origine.
Il existe différents outils en ligne pour générer une carte du biome à partir d'une graine aléatoire, l'un d'eux est mineatlas.com . Je suppose que, en interne, ils utilisent un serveur java qui utilise les classes internes de MineCraft lui-même; Je ne sais pas si l'un de leurs codes source est disponible directement.
la source
Un algorithme typique utilisé, par exemple, par Azgaar ( code source ). Est à peu près comme ceci:
la source
Si vous êtes intéressé à le faire en format vectoriel plutôt qu'en approches raster, j'ai écrit un article de blog il y a quelque temps à peu près exactement à ce sujet.
http://blog.particracy.com/worlds-and-their-geography/
L'idée est de commencer avec un maillage (généralement basé sur Voronoi) et d'agrandir les régions de manière concentrique à partir de points semés au hasard et suffisamment espacés.
la source
Quelle question amusante :) Cette approche est un peu basée sur les cellules de Vornoi, mais la métrique de distance n'est pas tout à fait euclidienne (j'ai utilisé la puissance de 1,5 au lieu de 2,0) et a un certain caractère aléatoire intégré. Il peut sauter par-dessus l'eau, ce qui n'est pas idéal.
Les régions voisines peuvent être fusionnées pour obtenir des formes plus intéressantes, ici j'ai en quelque sorte utilisé les N voisins les plus proches pour le déterminer.
Si vous êtes intéressé, je peux entrer dans plus de détails et partager le code Python.
la source