public static double[] HSL2RGB(double H, double S, double L)
{
while (H < 0.0) H += 360.0;
while (H > 360.0) H -= 360.0;
S = S < 0.0 ? 0.0 : S > 1.0 ? 1.0 : S;
L = L < 0.0 ? 0.0 : L > 1.0 ? 1.0 : L;
double C = (1.0 - System.Math.Abs(2.0 * L - 1.0)) * S;
double H2 = H / 60.0;
double X = C * (1.0 - System.Math.Abs(H2 % 2.0 - 1.0));
double[] RGB;
if (H2 >= 0.0 && H2 < 1.0) RGB = new double[] { C, X, 0 };
else if (H2 >= 1.0 && H2 < 2.0) RGB = new double[] { X, C, 0 };
else if (H2 >= 2.0 && H2 < 3.0) RGB = new double[] { 0, C, X };
else if (H2 >= 3.0 && H2 < 4.0) RGB = new double[] { 0, X, C };
else if (H2 >= 4.0 && H2 < 5.0) RGB = new double[] { X, 0, C };
else if (H2 >= 5.0 && H2 < 6.0) RGB = new double[] { C, 0, X };
else RGB = new double[] { 0, 0, 0 };
double m = L - C / 2.0;
for (int i = 0; i < 3; i++) RGB[i] += m;
return RGB;
}