Las paletas cosenoidales lineales son un método procedural sencillo para generar paletas de colores continuas, muy útil en proyectos de arte generativo y visualización de datos. La idea original fue propuesta por Inigo Quilez en su blog sobre paletas procedurales simples, y posteriormente adaptada al lenguaje R por Mike Cheng en una publicación en Mastodon, que sirvió de punto de partida para la autora.
El mecanismo se apoya en cuatro vectores de longitud 3 —denominados a, b, c y d— que codifican los colores base a partir de los cuales se interpola la paleta. La fórmula combina esos vectores mediante una expresión con coseno parametrizada por una variable t que recorre el intervalo [0, 1]. La regla es deliberadamente simple: a + b·cos(2π·(c·t + d)). Como las operaciones trigonométricas están altamente optimizadas en CPUs y GPUs modernas, la generación de paletas resulta muy eficiente en la práctica, aunque la autora señala que la velocidad no suele ser un cuello de botella en su flujo de trabajo.
En el artículo se ofrece una implementación en R con un ajuste menor sobre la versión de Cheng: la función cosine_palette() muestrea colores base aleatorios desde colors() y devuelve una paleta de longitud n. La función incluye el manejo de valores fuera de rango, fijando los componentes que superan 1.
Para validar la utilidad de la técnica, la autora aplica las paletas generadas a dos sistemas propios de arte generativo: subdivision(), basado en subdivisión recursiva de planos, y lissajous, basado en curvas de Lissajous. Con 12 semillas secuenciales y sin ajustes manuales adicionales, los resultados son heterogéneos: algunas piezas resultan poco atractivas, otras muy logradas y la mayoría correctas. La valoración global es positiva, considerando que no se optimizó la alineación entre la paleta y la estructura de las piezas.
El texto incluye el código R completo, por lo que resulta una referencia práctica para programadoras y programadores que quieran incorporar paletas procedurales a sus proyectos creativos o analíticos en R.
