Функция linear_interpolate должна вычислять цвет между двумя цветами на основе линейной функции y = mx + b.Чтобы применить линейную функцию к цветам, y - это выходной цвет, m - это разница между двумя цветами, b - это начальный цвет, а x - это значение между 0 и 1. Когда x равно 0, эта функция выводит начальный цвет.Когда х равен 1, эта функция выводит конечный цвет.
Для этого вычисления нам нужен цвет в виде трех чисел.Если вам нужно использовать шестнадцатеричные строки, вам придется разделить их и проанализировать каждые два символа как 16-битное число.Я собираюсь использовать палитру, которая уже в числовой форме, потому что она проще.
Вот моя трехцветная палитра.Я не рекомендую использовать эти цвета, это просто для демонстрации:
let palette = [{r:255,g:0,b:0},{r:0,g:255,b:0},{r:0,g:0,b:0}]
Эта первая функция выполняет итерацию, которая, вероятно, не является целым числом и может быть больше 1. Она берет словоитерации, превращая его в целое число, которым должен быть индекс массива.Затем требуется остаток от итерации, деленный на 1, чтобы получить число от 0 до 1.
function interpolation(iteration) {
let color1 = palette[Math.floor(iteration)];
let color2 = palette[Math.floor(iteration) + 1];
return linear_interpolate(color1, color2, iteration % 1);
}
Теперь нам нужно создать функцию линейной интерполяции, которая должна применять линейную функцию к каждому цветовому каналу и использоватьпол, чтобы превратить их в целый ряд.У меня он возвращает цвет CSS в rgb (), но вы можете вместо этого преобразовать его в шестнадцатеричный.
function linear_interpolate(color1, color2, ratio) {
let r = Math.floor((color2.r - color1.r) * ratio + color1.r);
let g = Math.floor((color2.g - color1.g) * ratio + color1.g);
let b = Math.floor((color2.b - color1.b) * ratio + color1.b);
return 'rgb(' + r + ',' + g + ',' + b + ')';
}
Вот прямоугольники штриховки кода: https://jsfiddle.net/q7kLszud/