public void CreateRandomHeightMap(int seed, float noiseSize, float persistence, int octaves) { for (var y = 0; y < HeightMapHeight; y++) { for (var x = 0; x < HeightMapWidth; x++) { var xf = (x / (float)HeightMapWidth) * noiseSize; var yf = (y / (float)HeightMapHeight) * noiseSize; var total = 0.0f; for (var i = 0; i < octaves; i++) { var freq = (float)Math.Pow(2.0f, i); var amp = (float)Math.Pow(persistence, i); var tx = xf * freq; var ty = yf * freq; var txi = (int)tx; var tyi = (int)ty; var fracX = tx - txi; var fracY = ty - tyi; var v1 = MathF.Noise(txi + tyi * 57 + seed); var v2 = MathF.Noise(txi + 1 + tyi * 57 + seed); var v3 = MathF.Noise(txi + (tyi + 1) * 57 + seed); var v4 = MathF.Noise(txi + 1 + (tyi + 1) * 57 + seed); var i1 = MathF.CosInterpolate(v1, v2, fracX); var i2 = MathF.CosInterpolate(v3, v4, fracX); total += MathF.CosInterpolate(i1, i2, fracY) * amp; } var b = (int)(128 + total * 128.0f); if (b < 0) { b = 0; } if (b > 255) { b = 255; } _heightMap[x + y * HeightMapHeight] = (b / 255.0f) * MaxHeight; } } }