Algoritmo para generar aleatoriamente una paleta de colores estéticamente agradable [cerrado]
Estoy buscando un algoritmo simple para generar una gran cantidad de colores aleatorios y estéticamente agradables. Así que nada de locos colores neón, colores que recuerden a las heces, etc.
Encontré soluciones a este problema, pero se basan en paletas de colores alternativas a RGB. Prefiero usar RGB directo que mapear de un lado a otro. Estas otras soluciones también pueden generar como máximo sólo 32 colores aleatorios agradables.
Cualquier idea sería genial.
Podrías promediar los valores RGB de colores aleatorios con los de un color constante:
(ejemplo en Java)
public Color generateRandomColor(Color mix) {
Random random = new Random();
int red = random.nextInt(256);
int green = random.nextInt(256);
int blue = random.nextInt(256);
// mix the color
if (mix != null) {
red = (red + mix.getRed()) / 2;
green = (green + mix.getGreen()) / 2;
blue = (blue + mix.getBlue()) / 2;
}
Color color = new Color(red, green, blue);
return color;
}
La mezcla de colores aleatorios con blanco (255, 255, 255) crea pasteles neutros al aumentar la luminosidad y mantener el tono del color original. Estos pasteles generados aleatoriamente suelen combinar bien, especialmente en grandes cantidades.
Aquí hay algunos colores pastel generados usando el método anterior:
También puedes mezclar el color aleatorio con un pastel constante, lo que da como resultado un conjunto teñido de colores neutros. Por ejemplo, usar un azul claro crea colores como estos:
Yendo más allá, podrías agregar heurísticas a tu generador que tengan en cuenta colores complementarios o niveles de sombreado, pero todo depende de la impresión que quieras lograr con tus colores aleatorios.
Algunos recursos adicionales:
- http://en.wikipedia.org/wiki/Color_theory
- http://en.wikipedia.org/wiki/Complementary_color
Yo usaría una rueda de colores y, dada una posición aleatoria, podría agregar el ángulo dorado (137,5 grados)
http://en.wikipedia.org/wiki/Golden_angle
para conseguir colores diferentes cada vez que no se superpongan.
Al ajustar el brillo de la rueda de colores también se pueden obtener diferentes combinaciones de colores brillantes/oscuros.
Encontré esta publicación de blog que explica muy bien el problema y la solución utilizando la proporción áurea.
http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
ACTUALIZACIÓN: Acabo de encontrar este otro enfoque:
Se llama método RYB (rojo, amarillo, azul) y se describe en este documento:
http://tresreyes.tk/mirror/ryb_TR.pdf
como "Composición de colores inspirada en pintura".
El algoritmo genera los colores y cada nuevo color se elige para maximizar su distancia euclidiana a los previamente seleccionados.
Aquí puedes encontrar una buena implementación en javascript:
http://afriggeri.github.com/RYB/
ACTUALIZACIÓN 2:
Sciences Po Medialb acaba de lanzar una herramienta llamada "I want Hue" que genera paletas de colores para científicos de datos. Usando diferentes espacios de color y generando las paletas usando agrupamiento de k-medias o vectores de fuerza (gráficos de repulsión). Los resultados de esos métodos son muy buenos, muestran la teoría y una implementación en su página web.
http://tools.medialab.sciences-po.fr/iwanthue/index.php
En javascript:
function pastelColors(){
var r = (Math.round(Math.random()* 127) + 127).toString(16);
var g = (Math.round(Math.random()* 127) + 127).toString(16);
var b = (Math.round(Math.random()* 127) + 127).toString(16);
return '#' + r + g + b;
}
Vi la idea aquí: http://blog.functionalfun.net/2008/07/random-pastel-color-generator.html
Convertir a otra paleta es una forma muy superior de hacerlo. Hay una razón por la que hacen eso: otras paletas son "perceptuales", es decir, juntan colores aparentemente similares y al ajustar una variable se cambia el color de una manera predecible. Nada de eso es cierto para RGB, donde no existe una relación obvia entre colores que "van bien juntos".
Tuve éxito al usar TriadMixing y CIE94 para evitar colores similares. La siguiente imagen utiliza colores de entrada rojo, amarillo y blanco. Mira aquí .
// http://devmag.org.za/2012/07/29/how-to-choose-colours-procedurally-algorithms/#:~:text=120%20and%20240.-,7.%20Triad%20Mixing,-This%20algorithm%20takes
public static Color RandomMix(Color color1, Color color2, Color color3,
float greyControl)
{
int randomIndex = random.NextByte() % 3;
float mixRatio1 =
(randomIndex == 0) ? random.NextFloat() * greyControl : random.NextFloat();
float mixRatio2 =
(randomIndex == 1) ? random.NextFloat() * greyControl : random.NextFloat();
float mixRatio3 =
(randomIndex == 2) ? random.NextFloat() * greyControl : random.NextFloat();
float sum = mixRatio1 + mixRatio2 + mixRatio3;
mixRatio1 /= sum;
mixRatio2 /= sum;
mixRatio3 /= sum;
return Color.FromArgb(
255,
(byte)(mixRatio1 * color1.R + mixRatio2 * color2.R + mixRatio3 * color3.R),
(byte)(mixRatio1 * color1.G + mixRatio2 * color2.G + mixRatio3 * color3.G),
(byte)(mixRatio1 * color1.B + mixRatio2 * color2.B + mixRatio3 * color3.B));
}