Generieren einer Landschaft

Seit längerem versuche ich einen vernünftigen Algorithmus zu entwickeln, um eine binäre Landschaft zu erzeugen. Binär daher, da ich wissen möchte was ist Land und was ist Meer. Eine reine Zufallsverteilung führt dazu dass viele kleine „Inseln“ entstehen. Dies bedeutet, dass bei der Entscheidung ob ein Feld Wasser oder Land ist eine Gewichtung einfliessen muss. Diese Gewichtung muss dazuführen, dass sich gleich zu gleich gesellt.
Im Netz finden sich einige Ansätze, die ein Vorgehen beschreiben, einige bringen sogar Code mit. Dabei ist die Erstellte Landschaft jedoch direkt in Graphik umgesetzt:

Folgende Ansätze sind mir als Möglichkeiten eingefallen:

  • Genetischer Ansatz: Ausgehend von einer vorhandenen Landschaft, wird die Küstenlinie zufällig mutiert. Nach einigen Mutationen entsteht eine neue Landschaft. Dabei muss auch dem Umstand Rechnung getragen werden, dass neue Inseln entstehen können, Beispielsweise durch erstellen von Mini-Inseln (Nucleoli) zu Beginn der Mutation.
  • Wachstums-Ansatz: Ausgehen von einer zufälligen Anzahl Nucleoli (untere Grenze definieren) Land wachsen lassen. Dies simuliert gewissermassen die Entstehung von Land aufgrund vulkanischer Aktivität. Diesen Ansatz habe ich verfolgt. Weitere Details siehe unten.
  • Elevation Ansatz: Dieser ist auch im obigen Link beschrieben. Dabei wird die Fläche durch eine Linie geteilt. Alle Punkte auf einer Seite werden um 1 angehoben, alle anderen um 1 abgesenkt. Dies führt dazu dass alles was nach x Iterationen unter 0 ist zum Mehr wird alles darüber zu Land. Da dieser Ansatz den Mehrwert bietet, dass sich daraus auch Gebirge und Hügel ableiten lassen habe ich auch diesen versucht, – meine Programm-adaption muss jedoch irgendwo eine Schachstelle aufweisen, da 1. keine Verteilung um 0 entsteht und 2. Immer eine grosse Landmasse der Form „X“ entsteht. Der Ursprüngliche Algorithmus ist für eine Kugel gedacht, was sich in openGL leicht umsetzen lässt. Auf eine Fläche adaptiert, die einer zylindrischen Welt entspricht muss jede Linie, die die horizontale und vertikale Kante kreuzt gespiegelt werden. Dies gilt ebenfalls für die zu erhöhenden/abzusinkenden Flächen. Linien die beide vertikalen Seiten kreuzen müssten eigentlich auch gespiegelt werden, was ich nicht gemacht habe, da dies durch eine zufällige Wahl und genügend Iterationen ausgeglichen werden sollte.
    Dieser Algorithmus lässt sich vereinfachen indem nur horizontale und Vertikale Linien verwendet werden. Dadurch ist auch sichergestellt, dass jedes Feld eindeutig der einen oder anderen Seite zugeordnet werden kann.
  • Tektonischer Ansatz: Ausgehend von einer einzigen Landmasse werden zufällige Trennlinien definiert. Dadurch entstehen x Teilstücke. Für jedes Teilstück wird nun ein Bewegungvektor weg von der Mitte definiert. Dann wird die tektonische Plattenverschiebung für t simuliert. Dies kann auch zu Gebirgsbildung führen.
  • Graphitonischer Ansatz: Gestartet wird mit einer zufälligen Verteilung. Jede Landmasse besitzt eine graphitonische Anziehung auf alle anderen. Die Anziehungskraft ist abhängig von der Grösse und der Entfernung. Zudem gibt es so etwas wie Trägheit, die verhindert dass aus all den kleinen Landeinheiten eine grosse wird.

Beim Wachsumsansatz bin ich wie folgt vorgegangen. Das Wachstum wird für jede Runde für alle Nucleoli simuliert. Je mehr Felder bereits definiert sind, umso mehr Felder werden Pro Runde definiert, nämlich genau 4*((Runde-1)*2+1)+4, wobei Runde zu Beginn 0 ist.
Zu beachten ist: Wenn man für das Feld, das in der Vorrunde als erstes erstellte Feld wählt so ergibt sich ergibt sich eine Land Verteilung in dieser Richtung. Daher sollte für jede Runde ein neues Startfeld gewählt
Landscape with diagonal driftwerden.
Wenn die Felder in der richtigen Reihenfolge definiert werden (Ost, West, Süd, Nord, Diagonal) sollte eine einigermassen Ansprechende Verteilung entstehen.
Binäre Landschaft

Ein Gedanke zu „Generieren einer Landschaft“

Schreibe einen Kommentar