Génération de routes / rivières sur une carte quadrillée


12

C'est une question pour les débutants, mais la voici:

Ma carte est une grille 2D, et je veux générer des routes et des rivières. L'itinéraire du point de départ au point d'arrivée ne doit pas être l'itinéraire optimal en nombre de tuiles. Au lieu de cela, ils devraient avoir un certain niveau d'aléatoire (tours).

Existe-t-il un algorithme standard pour ce genre de chose?

À votre santé!

MISE À JOUR:

Ceci est le résultat de jouer avec des poids sur la grille et d'appliquer un algorithme de chemin le plus court (Bellman-Ford) à l'aide de la bibliothèque jgrapht. Je suis allé avec la réponse de Donutz après tout.

http://pastebin.com/AGQGK5ik


Y a-t-il des obstacles sur la carte?
MichaelHouse

Pas encore, la rivière sera le premier obstacle à franchir.
Markos Fragkakis

Réponses:


18

Vous pouvez générer le chemin optimal en utilisant A *, puis le déformer avec un déplacement au milieu.

entrez la description de l'image ici

Cela garantira que vos points d'extrémité sont atteints et vous permettra de contrôler le caractère aléatoire dans une large mesure. Par exemple, je ne randomiserais pas autant les routes que les rivières. Quelle que soit l'intelligence qui construit des routes, elle tente généralement d'être optimale.

Veillez à ce que si votre carte comporte des obstacles, vérifiez après chaque itération que vous ne traversez pas ces obstacles.

Une autre méthode serait de générer du bruit Perlin après avoir trouvé le chemin optimal, puis de déplacer vos points en fonction du bruit généré. Par exemple, en utilisant ce bruit:

entrez la description de l'image ici

Ensuite, montrez avec le chemin optimal en rouge et le chemin décalé en bleu:

entrez la description de l'image ici

Remarquez comment le chemin décalé s'est «installé» dans les zones les plus sombres du bruit. De la même manière, une rivière peut traverser une vallée.

Un avantage du choix du bruit Perlin est que vous pouvez prendre en compte vos obstacles et les éviter dans le cadre de l'algorithme.


1
Comment faites-vous cette base de décalage de points sur le bruit?
Khoi

1
Cela dépend de la façon dont vous stockez le bruit et la ligne générée. Vous pouvez trouver le bruit le plus proche / le plus bas perpendiculaire à la ligne au centre d'abord, puis aux points médians entre le centre et les extrémités, etc.
MichaelHouse

3

L'algorithme A * vous permettra également d'attribuer des valeurs aux tuiles indiquant leur pertinence. Par exemple, vous pouvez attribuer les scores de coût les plus bas aux terres basses pour les rivières, aux terres plates (mais pas aux marais) pour les routes, et générer en fonction de cela. Cela ne vous donne pas l'itinéraire le plus court, mais cela vous donne l'itinéraire le plus efficace. Appliquez un peu de hasard à vos valeurs de tuiles et vous pouvez obtenir des itinéraires sous-optimaux.


2

Et quand la hauteur est un facteur? Je peux faire une carte de hauteur avec l'algorithme carré de diamant. Je pensais ajouter de l'eau au hasard à chaque tuile, puis itérer à travers et déplacer l'eau à des altitudes plus basses jusqu'à ce que tout soit réglé, mais cela ralentirait et ferait probablement des lacs, pas des rivières.

Je pensais aussi à regarder des normales pour chaque tuile. Si 2 normales pointent l'une vers l'autre, cela doit être une vallée. L'eau s'accumulait dans une vallée. S'ils pointent dans la même direction ou s'éloignent les uns des autres, l'eau ne s'accumulera pas. Ce serait probablement plus rapide que la méthode d'itération, mais cela pourrait ne pas faire des lacs, seulement des rivières. Je devrais jouer avec pour éviter de transformer chaque instance de tuiles pointées l'une vers l'autre en une rivière.


J'ai lu l'un des documents où vous pouvez ajouter un poids à chaque tuile, plus certaines tuiles sont tout simplement infranchissables.
Joe Plante
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.