← На главную

Даниэль Наварро: cosine_palette() в R — приемлемые результаты на subdivision и lissajous

05.06.2026 03:40 · hackernews

Даниэль Наварро решила написать короткий пост — и у неё получилось. Она рассказывает о простом методе генерации непрерывных цветовых палитр, который подсмотрела у Майка Ченга и Иниго Килеза. Идея до смешного простая: берём три вектора a, b, c и d, каждый длиной 3, они задают «базовые» цвета. Палитра на отрезке от 0 до 1 вычисляется по формуле f(t) = a + b * cos(2 * pi * (c * t + d)). Работает быстро, потому что современные CPU и GPU здорово оптимизируют вычисление косинуса, хотя сама Наварро признаётся, что скорость для её задач не критична.

Она реализовала это в R функцией cosine_palette(). Функция принимает количество цветов n, опциональный список базовых цветов и seed для воспроизводимости. Если базовые цвета не заданы, берутся из colors(distinct = TRUE). Векторы b, c, d получаются случайным выбором одного цвета из базы, переводом в RGB и делением на 255. a всегда c(0.5, 0.5, 0.5). Значения палитры обрезаются по 1, затем переводятся в hex через rgb() с модулем (abs()). Пример вызова cosine_palette(n = 16, seed = 11) выдаёт 16 цветов — от "#7F1616" до "#7F54D6".

Чтобы оценить палитры визуально, Наварро использует функцию shade_strip(), которая рисует их как полоску. Она взяла 12 последовательных seed (от 11 до 22) и сгенерировала для каждого 256-цветную палитру. Первый seed выбран потому, что ей понравилась получившаяся работа, но дальше она не подбирала seed специально.

Затем она применила палитры в двух генеративных системах. Первая — subdivision(), где прямоугольник рекурсивно делится на более мелкие блоки, и каждый блок получает значение, которое маппится на палитру. Вторая — lissajous — рисует фигуры Лиссажу. Для каждого из 12 seed она создала по одному изображению в каждой системе. Результаты — «не так плохо»: некоторые вышли ужасными, несколько — прекрасными, большинство — сойдёт. Без какой-либо подгонки палитры к структуре рисунков это даже лучше, чем она ожидала. Пост короткий, Наварро довольна, что уложилась в несколько часов.

Читать оригинал →