public override void WriteColorMap(int height, string filePath)
        {
            var width = 2 * height;

            if (ColorNoiseMap == null)
            {
                GenerateColorMap(height);
            }
            var bitmap       = new DirectBitmap(width, height);
            var tempMean     = Random.Uniform("life temperature mean", FreezingPoint, BoilingPoint);
            var tempVariance = Random.Uniform("life temperature variance", 20, 70);
            var sinPower     = Random.Uniform("sin power", 0, 2);

            for (var x = 0; x < width; x++)
            {
                for (var y = 0; y < height; y++)
                {
                    var value = ColorNoiseMap.GetValue(x, y);
                    var col   = OceanColor;
                    if (!HasOcean || HeightNoiseMap.GetValue(x, y) > OceanLevel)
                    {
                        col = ColorScale.Color(value);
                    }
                    if (HasLife && HeightNoiseMap.GetValue(x, y) > OceanLevel)
                    {
                        var delta = Abs(TemperatureNoiseMap.GetValue(x, y) - tempMean) / tempVariance;
                        if (delta < 0)
                        {
                            delta = 0;
                        }
                        if (delta > 1)
                        {
                            delta = 1;
                        }
                        delta *= (float)Pow(Sin(PI * y / height), sinPower);
                        col    = Interpolate(col, LifeColorScale.Color(value), delta);
                    }

                    if (HasAtmosphere && TemperatureNoiseMap.GetValue(x, y) < FreezingPoint * IceFactor)
                    {
                        col = IceColor;
                    }
                    bitmap.SetPixel(x, y, col);
                }
            }
            bitmap.Save(filePath);
        }
        /// <summary>Writes an equirectangular specular map of the planet at the specified path.</summary>
        /// <param name="height">The height of the output image, half the width.</param>
        /// <param name="filePath">The path of the output file including file extension.</param>
        public void WriteSpecMap(int height, string filePath)
        {
            if (HasOcean)
            {
                var bitmap = new DirectBitmap(HeightNoiseMap.Width, HeightNoiseMap.Height);
                if (HasOcean)
                {
                    for (var x = 0; x < HeightNoiseMap.Width; x++)
                    {
                        for (var y = 0; y < HeightNoiseMap.Height; y++)
                        {
                            var col = Color.Black;
                            if (HeightNoiseMap.GetValue(x, y) <= OceanLevel && TemperatureNoiseMap.GetValue(x, y) > FreezingPoint)
                            {
                                col = Color.White;
                            }
                            bitmap.SetPixel(x, y, col);
                        }
                    }
                }

                bitmap.Save(filePath);
            }
        }