public static (double, double, double) RgbToHsl(double r, double g, double b)
        {
            double h, s, l;
            double min   = Math.Min(Math.Min(r, g), b);
            double max   = Math.Max(Math.Max(r, g), b);
            double delta = max - min;

            l = (max + min) / 2.0;
            if (delta <= 0.01)
            {
                h = 0.0;
                // reduce saturation for low lightness colors
                s = ColorMath.LinearInterpolation(delta, 0.005, 0.01, 0, delta / (max + min));
            }
            else
            {
                s = l <= 0.5 ? delta / (max + min) : delta / (2.0 - max - min);

                double hue;

                if (r >= max)
                {
                    hue = (g - b) / 6.0 / delta;
                }
                else if (g >= max)
                {
                    hue = 1.0 / 3.0 + (b - r) / 6.0 / delta;
                }
                else
                {
                    hue = 2.0 / 3.0 + (r - g) / 6.0 / delta;
                }

                if (hue < 0.0)
                {
                    hue += 1.0;
                }
                if (hue > 1.0)
                {
                    hue -= 1.0;
                }

                h = hue * 360.0;
            }

            return(h, s, l);
        }
        public static (double, double, double) RgbToHsv(double r, double g, double b)
        {
            double delta, min;
            double h = 0.0, s, v;

            min   = Math.Min(Math.Min(r, g), b);
            v     = Math.Max(Math.Max(r, g), b);
            delta = v - min;
            if (v <= 0.12)
            {
                // reduce saturation for low value colors
                s = ColorMath.LinearInterpolation(v, 0.005, 0.12, 0, delta / v);
            }
            else
            {
                s = delta / v;
            }

            if (s <= 0.001)
            {
                h = 0.0;
            }
            else
            {
                if (r.AboutEqual(v))
                {
                    h = (g - b) / delta;
                }
                else if (g.AboutEqual(v))
                {
                    h = 2.0 + (b - r) / delta;
                }
                else if (b.AboutEqual(v))
                {
                    h = 4.0 + (r - g) / delta;
                }

                h *= 60.0;

                if (h < 0.0)
                {
                    h = h + 360.0;
                }
            }

            return(h, s, v);
        }