Полный алгоритм генерации карты высот

 

   public void GenerateHeightmap(int SizeX, int SizeY, GenMethod LandGenMethod, Convolution[] Convs, bool Smoothing, bool Valley, bool Island)

   {

       this.SizeX = SizeX;

       this.SizeY = SizeY;

       Heightmap = new double[SizeX, SizeY];

       PerlinNoise Noise = new PerlinNoise(256);

 

       double min = 99999;

       double max = -99999;

 

       double[,] ar = new double[SizeX, SizeY];

 

       if (LandGenMethod == GenMethod.Perlin)

       {

           for (int i = 0; i < SizeX; i++)

               for (int j = 0; j < SizeY; j++)

               {

                   for (int l = 0; l < Convs.Length; l++)

                   {

                       if (Convs[l].Operation == Operation.Plus)

                           if (Convs[l].Coef!= 0)

                               ar[i, j] += Noise.Generate(i, j, Convs[l].Coef);

                       else

                           if (Convs[l].Coef!= 0)

                               ar[i, j] *= Noise.Generate(i, j, Convs[l].Coef);

                   }

 

                   if (max < ar[i, j]) max = ar[i, j];

                   if (min > ar[i, j]) min = ar[i, j];

               }

       }

       else

       {

           Random rand = new Random();

           double theta;

           double distanceX, distanceY;

           double Radius;

           double x, y;

           double t;

 

           min = 0;

           for (int k = 0; k < Convs[0].Coef; k++)

             {

               Radius = rand.NextDouble() * (SizeX * Convs[1].Coef);

 

               if (Island)

               {

                   theta = rand.NextDouble() * Math.PI * 2;

                   t = rand.NextDouble();

                   distanceX = t * (SizeX * Convs[2].Coef - Radius);

                   distanceY = t * (SizeY * Convs[2].Coef - Radius);

                   x = SizeX / 2.0 + Math.Cos(theta) * distanceX;

                   y = SizeY / 2.0 + Math.Sin(theta) * distanceY;   

               }

               else

               {

                   x = SizeX * rand.NextDouble();

                   y = SizeY * rand.NextDouble();

               }

 

               for (int i = 0; i < SizeX; i++)

                   for (int j = 0; j < SizeY; j++)

                   {

                       t = Radius * Radius - ((i - x) * (i - x) + (j - y) * (j - y));

                       if (t > 0)

                           ar[i, j] += t;

 

                       if (max < ar[i, j]) max = ar[i, j];

                       //if (min > ar[i, j]) min = ar[i, j];

                   }

           }

       }

 

 

       double coef = 1 / ((max - min));

       for (int i = 1; i < SizeX-1; i++)

           for (int j = 1; j < SizeY-1; j++)

           {

               if (Smoothing) 

                   Heightmap[i, j] =  (ar[i - 1, j - 1] + ar[i - 1, j] + ar[i - 1, j + 1] +

                                            ar[i, j - 1] + ar[i, j] + ar[i, j + 1] +

                                            ar[i + 1, j - 1] + ar[i + 1, j] + ar[i + 1, j + 1] - 9.0*min) / (9.0*(max-min));

               else

                   Heightmap[i, j] = (ar[i, j] - min) * coef;

               if (Valley)

                   Heightmap[i, j] = Math.Sqrt(Heightmap[i, j]);

           }

Алгоритмы визуализации ландшафта и окружающей среды


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: