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]);
}
Алгоритмы визуализации ландшафта и окружающей среды