Maison >développement back-end >C++ >Comment générer des îles réalistes à l'aide d'un algorithme de diamant carré modifié ?

Comment générer des îles réalistes à l'aide d'un algorithme de diamant carré modifié ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-07 12:27:45473parcourir

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

Îles de bruit Perlin sans cercles

Au lieu d'utiliser des cercles dégradés, envisagez d'utiliser l'algorithme Diamond & Square avec quelques modifications pour créer un aspect naturel. îles dans votre générateur de carte.

Algorithme Diamant et Carré avec Modifications

  • Configurer les propriétés de génération : Établir des paramètres tels que les élévations maximales et minimales, le niveau de la mer et les plages de végétation.
  • Créer une carte de hauteur de terrain (zed[][]) :

    • Modifier l'algorithme Diamond & Square pour éviter les terrains « intérieurs » en initialisant les coins avec l'élévation la plus basse.
    • Ignorez le premier pas de losange et initialisez le point médian avec une valeur aléatoire.
    • Après chaque itération carrée, ajustez les points de bordure au élévation minimale (sous-marine).
  • Créer une carte de surface (typ[][]) :

    • Attribuez des caractéristiques de surface en fonction de l'altitude, comme l'eau, le sable, la végétation et les roches.
    • Ajoutez des caractéristiques en fonction de la pente du terrain, tels que des rochers.
    • Incluez des éléments supplémentaires tels que des rivières, des ruisseaux et des bâtiments en fonction de caractéristiques spécifiques. règles.

Exemple de mise en œuvre C

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
  ...
}

Sortie

Cette approche produit des îles d'apparence plus naturelle avec de multiples collines et des côtes réalistes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn