Heim >Backend-Entwicklung >C++ >Wie generiert man realistische Inseln mithilfe eines modifizierten Diamant-Quadrat-Algorithmus?

Wie generiert man realistische Inseln mithilfe eines modifizierten Diamant-Quadrat-Algorithmus?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-07 12:27:45473Durchsuche

How to Generate Realistic Islands Using a Modified Diamond-Square Algorithm?

Perlin Noise Islands ohne Kreise

Anstatt Verlaufskreise zu verwenden, sollten Sie den Diamond & Square-Algorithmus mit einigen Modifikationen verwenden, um ein natürliches Aussehen zu erzielen Inseln in Ihrem Kartengenerator.

Diamond & Square Algorithmus mit Änderungen

  • Generierungseigenschaften konfigurieren: Parameter wie maximale und minimale Höhen, Meeresspiegel und Vegetationsbereiche festlegen.
  • Erstellen Sie eine Geländehöhenkarte (zed[][]):

    • Ändern Sie die Raute & Quadratischer Algorithmus zur Vermeidung von Gelände im Landesinneren durch Initialisierung von Ecken mit der niedrigsten Höhe.
    • Ignorieren Sie den ersten Diamantschritt und initialisieren Sie den Mittelpunkt mit einem zufälligen Wert.
    • Passen Sie nach jeder Quadratiteration die Randpunkte an bis zur minimalen (Unterwasser-)Höhe.
  • Erstellen Sie eine Oberflächenkarte (typ[][]):

    • Weisen Sie Oberflächenmerkmale basierend auf der Höhe zu, wie Wasser, Sand, Vegetation und Felsen.
    • Fügen Sie Features basierend auf der Geländeneigung hinzu. B. Felsen.
    • Fügen Sie zusätzliche Elemente wie Flüsse, Bäche und Gebäude basierend auf bestimmten Merkmalen hinzu Regeln.

Beispiel C-Implementierung

void map_random(int _xs, int _ys) {
  // Configuration and parameter initialization

  // Terrain generation
  ter=new int*[mys+1]; for (y=0;y<=mys;y++) ter[y]=new int[mxs+1];
  typ=new int*[mys+1]; for (y=0;y<=mys;y++) typ[y]=new int[mxs+1];
  ...

  // First pass
  t=-r2;
  ter[  0][  0]=t;
  ter[  0][mxs]=t;
  ter[mys][  0]=t;
  ter[mys][mxs]=t;
  ter[dy2][dx2]=r2;

  ...

  for (;dx2|dy2;dx=dx2,dx2>>=1,dy=dy2,dy2>>=1)    // subdivide step until full image is filled
  {
    ...
    // diamond (skip first one for islands)
    if ((!_island)||(dx!=mxs))
     for (y=dy2,yy=mys-dy2;y<=yy;y+=dy)
      for (x=dx2,xx=mxs-dx2;x<=xx;x+=dx)
       ter[y][x]=((ter[y-dy2][x-dx2]+ter[y-dy2][x+dx2]+ter[y+dy2][x-dx2]+ter[y+dy2][x+dx2])>>2)+Random(r)-r2;
    ...
    // adjust border
    if (_island)
        {
        for (y=0;y<=mys;y+=dy2) { ter[y][0]=t; ter[y][mxs]=t; }
        for (x=0;x<=mxs;x+=dx2) { ter[0][x]=t; ter[mys][x]=t; }
        }
  }

  // Additional steps and enhancements
  ...
}

Ausgabe

Dieser Ansatz erzeugt natürlicher aussehende Inseln mit mehreren Hügeln und realistischen Küstenlinien.

Das obige ist der detaillierte Inhalt vonWie generiert man realistische Inseln mithilfe eines modifizierten Diamant-Quadrat-Algorithmus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn