public static async Task <double[, ]> GenerateHeatmap(NoiseGen noise, int yin, int xin, double[,] heightMap = null)
        {
            Task[] tasks = new Task[yin];
            double[,] heatmap = new double[yin, xin];

            for (int y = 0; y < yin; y++)
            {
                double gradient = GenerateGradient((double)y / yin);
                int    yCopy    = y;

                tasks[y] = Task.Factory.StartNew(() =>
                {
                    for (int x = 0; x < xin; x++)
                    {
                        heatmap[yCopy, x] = Lerp(noise.FractalFBM(4, 2, x, yCopy), gradient, .85) * (heightMap != null ? 1 - ((heightMap[yCopy, x] + 1) / 2) : 1);
                    }
                });
            }
            await Task.WhenAll(tasks);

            return(heatmap);
        }