Stadt-Region-Generation


7

Ich erstelle derzeit eine prozedural generierte Karte und wollte den Städten Regionen hinzufügen, die ihre Reichweite angeben. Ich erreiche dies derzeit, indem ich mich vom Stadtzentrum nach außen ausdehne, bis entweder die Reichweite der Stadt überschritten wird oder das Wasser- / Berggelände überschritten wird getroffen, ein bisschen wie Raytracing, nehme ich an:

Bild des Problems, kann Bild nicht direkt posten

Dies führt zu den oben genannten Problemen, da große hässliche / unnatürliche Löcher entstehen und Bereiche nicht außer Sichtweite gefüllt werden, sondern wohl in Reichweite der Stadt liegen. Stadtregionen sollen durch Gebirgszüge und größere Gewässer blockiert sein, sich aber auf natürliche Weise um kleine Seen / Felsen krümmen. Ich kann meinen aktuellen Code bereitstellen. Ich glaube, er ist grundlegend fehlerhaft für das, was ich tun möchte, und nicht verwendbar.

Grundsätzlich sollte die gewünschte Region, die ich großartig machen möchte, ungefähr so ​​aussehen: Geben Sie hier die Bildbeschreibung ein

Ich bin ein bisschen ratlos, wonach ich suchen muss, um Literatur zu diesem Thema zu finden, sei es ein Algorithmus oder ein Hinweis, also frage ich mich im Grunde, wie das heißt. (Alle Tipps / Tricks wäre auch sehr dankbar)


1
Können Sie nicht einfach in zufällige Punkte neben dem bereits angrenzenden beanspruchten Gebiet expandieren, solange diese sich nicht in natürlichen Barrieren befinden?
Kyranstar

Ich würde die Form Ihres 'gewünschten' zweiten Beispiels stark in Frage stellen - das erste gewünschte Ergebnis ist ziemlich natürlich (abgesehen von den Lücken entlang der Ränder des Sees oben rechts und dem 'Strahl' der Stadt unten), aber das Zweitens sieht für mich unglaublich künstlich aus. Die Antworten hier sind vernünftig, aber ich denke, Sie sollten wahrscheinlich damit beginnen, Ihre Hypothesen in Frage zu stellen.
Steven Stadnicki

Antworten:


3

Um den Kommentaren von @Ranth & @JackFrost nachzugehen, sollte eine breite erste Suche, die sich vom Ursprungsort weg erstreckt, das gewünschte Ergebnis liefern. Dabei:

  • Verwenden Sie eine 8-Wege-Nachbarschaft (IE ermöglicht diagonale Suchbewegungen)
  • Verwenden Sie eine euklidische Metrik für Entfernungen, um 1 diagonale Bewegung über 2 Kardinalbewegungen zu fördern
  • Begrenzen Sie die Suche auf den gewünschten maximalen Radius
  • Machen Sie Hindernisse unpassierbar oder erhöhen Sie die Bewegungskosten ihrer Zellen

Da sich die Suche entweder um Hindernisse wickeln oder langsamer durch sie bewegen muss, erhalten Sie keinen perfekten Kreis um Ihren Ursprungspunkt. Wenn die Dinge immer noch zu glatt aussehen und / oder Sie einen Bereich ohne Hindernisse haben, können Sie jederzeit einige falsche Hindernisse für die Suche nach der Stadt hinzufügen.

Wie bei den meisten PCG-Dingen müssen Sie wahrscheinlich ein wenig experimentieren, um das zu finden, was Sie wollen. Ich verwende gerne Perlin / Simplex-Rauschen und / oder Poisson-Festplattenverteilungen für solche Dinge, aber für jeden seine eigenen.


2

Ich glaube, dies könnte mit dem Flutfüllungsalgorithmus erreicht werden, der im Grunde alle verbundenen Bereiche in einem bestimmten Raum berechnet, je nachdem, wie Sie möchten, dass dies funktioniert, da dies zu Bereichen führen kann, die beispielsweise einem Fluss gegenüberliegen (wo der Fluss den ganzen Weg entlang fließt) Das größte Gebiet, das die Stadt einnehmen kann, wird nicht in das Gebiet einbezogen, das einer besonderen Behandlung bedarf.

In Bezug auf das Wachstum können Sie einfach den Radius des Kreises vergrößern und die Flutfüllung den Bereich innerhalb dieses Kreises auswählen lassen.

In Bezug auf die Implementierung ist es am besten, einem Tutorial zu folgen, aber Wikipedia hat auch eine anständige Pseudo-Code-Implementierung: https://en.wikipedia.org/wiki/Flood_fill#Pseudocode


Dies würde einen ziemlich perfekten Kreis um die Stadt bilden, oder? Um es ungleichmäßig zu machen, müsste der Code ziemlich stark geändert werden, oder? Aber als ich durch die Wikipage schaute, sah ich das Warteschlangenbeispiel für Speicher und brachte mich auf den Gedanken, dass ein Pfadfindungsalgorithmus für die Breitensuche richtig funktionieren könnte, oder?
Ranth

1
Heya, mit einer Breitensuche könnten Sie im Wesentlichen alle Orte in x Entfernung von der Stadt über einen Pfad finden, der befahren werden könnte, und dann, wenn die Stadt wächst, die Länge der Pfadgrenze auf eine größere Größe erhöhen. Ich habe die Breitensuche verwendet, aber nicht für so etwas, daher bin ich mir bei der Implementierung in diesem speziellen Fall nicht 100% sicher!
JackFrost

Dijkstra könnte wahrscheinlich auch funktionieren, und Sie könnten zufällige Gewichte hinzufügen, damit kein perfekter Kreis ausgegeben wird.
Tally

0

Wie Kyranstar erklärte in seinem Kommentar vielleicht zellulären Automaten kann eine Lösung sein.

Fordern Sie neues Terrain mit einer zufälligen Logik an, die den Geländetyp und die Wasserpräsenz überprüft (eine Stadt wächst normalerweise in der Nähe eines Flusses oder der Seekosten).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.