/// <summary>
        /// Gets a color for given 0 to 1 ratio (i.e. position in range)
        /// </summary>
        /// <param name="ratio">The ratio - position in range from 0 to 1.</param>
        /// <returns></returns>
        public ColorHSVPoint GetHSVColor(Double ratio)
        {
            if (!IsReady)
            {
                Prepare();
            }


            ColorHSVPoint output = BaseColor.Clone();


            if (gradient.HasFlag(ColorGradientFunction.Hue))
            {
                output.H = Convert.ToInt32(RangeH.GetValueForRangePosition(ratio));
            }

            if (gradient.HasFlag(ColorGradientFunction.Value))
            {
                output.V = Convert.ToSingle(RangeV.GetValueForRangePosition(ratio));
            }

            if (gradient.HasFlag(ColorGradientFunction.Saturation))
            {
                output.S = Convert.ToSingle(RangeS.GetValueForRangePosition(ratio)); // output.S + r.S;
            }

            if (gradient.HasFlag(ColorGradientFunction.Alpha))
            {
                output.A = Convert.ToSingle(RangeA.GetValueForRangePosition(ratio));
            }

            output.DeployValues();
            return(output);
        }
        protected void Prepare()
        {
            var pointA = new ColorHSVPoint(HexColorA);
            var pointB = new ColorHSVPoint(HexColorB);

            RangeA.Learn(pointA.A);
            RangeA.Learn(pointB.A);

            RangeS.Learn(pointA.S);
            RangeS.Learn(pointB.S);

            RangeV.Learn(pointA.V);
            RangeV.Learn(pointB.V);

            RangeH.Learn(pointA.H);
            RangeH.Learn(pointB.H);

            BaseColor = pointA;
        }