public static Color getRandomColor() // obtengo un color aleatorio { /* * obtengo el color en hsl, para ayudarme un poco de que el color que se selecciona sea atractivo y no se vea feo * el algoritmo elige primero un valor para h de 0 a 360, despues para s de 35 a 100, y por ultimo de l de 20 a 85 * lo hago entre esos rangos porque esos son los rangos en los cuales la saturacion del color es adeccuada y el color * no se encuentra en la escala de grises o es muy laro o muy oscuro con esos valores de luminosidad * voy cambiando la semila de generacion de los valores con respecto al primer valor para que haya mas aleatoriedad * pero no tanta y que el color no sea bonito, pero de esto ultimo la verdad no estoy muy segura, puede mejorar. */ int h; byte s, l; Random rnd = new Random(); h = rnd.Next(360); rnd = new Random(h * 10); s = (byte)rnd.Next(35, 100); rnd = new Random(h * 5); l = (byte)rnd.Next(20, 85); HSL hsl = HSL.FromHSL(h, s, l); Color rndColor = hsl.ToRgb(); rndColor.A = 250; return(rndColor); }
public static HSL ToHsl(this Color color) // paso de color rgb a hsl { double double_l, double_s, double_h; byte l, s; int h; double r = color.R / 255.0; double g = color.G / 255.0; double b = color.B / 255.0; double max = r; if (max < g) { max = g; } if (max < b) { max = b; } double min = r; if (min > g) { min = g; } if (min > b) { min = b; } double diff = max - min; double_l = (max + min) / 2; if (Math.Abs(diff) < 0) { double_h = 0; double_s = 0; } else { if (double_l <= 0.5) { double_s = diff / (max + min); } else { double_s = diff / (2 - max - min); } double r_dist = (max - r) / diff; double g_dist = (max - g) / diff; double b_dist = (max - b) / diff; if (r == max) { double_h = b_dist - g_dist; } else if (g == max) { double_h = 2 + r_dist - b_dist; } else { double_h = 4 + g_dist - r_dist; } double_h = double_h * 60; if (double_h < 0) { double_h += 360; } } h = Convert.ToInt32(double_h); s = Convert.ToByte(double_s * 100); l = Convert.ToByte(double_l * 100); HSL hsl = HSL.FromHSL(h, s, l); return(hsl); }