Один из способов сделать то, что вы хотите, - это интерполировать каждый из цветов компонентов (RGB) от их начала до конечного значения. Это означает использование шагов, которые имеют равный размер, насколько это возможно.
Для получения компонентов RGB необходимо немного манипулировать. Этот код дает вам три компонента цвета для полностью указанного цвета fullColour
:
std::array<float, 3> colourRGB;
for(unsigned i = 0; i<3; ++i) {
colourRGB[i] = (fullColour & (0xFF << (i*8))) >> (i*8);
Вы используете это, чтобы получить массив RGB вашего начального и конечного цвета (например, для красно-оранжевого диапазона в вашем примере это будет RGB пробой 0xFF0000
и 0xFFA200
). Для каждого компонента вы затем определяете размер шага, необходимый для каждого шага в вашем «затухании». Это определяется общим изменением этого компонента, деленным на общее количество шагов. Для красно-оранжевого примера размер шага для компонента Red будет таким образом 1,91 (потому что у вас есть 86 шагов и общее изменение (0xA2
- 0x00
или 162 в десятичной форме, что дает 162/86 = 1,91). Размеры шага для остальные компоненты равны нулю, так как они не меняются.
Затем вы можете выполнить итерацию по шагам, добавив еще один размер шага и округление, чтобы получить новое значение для каждого компонента. Например, на этапе s
:
red[s] = startingRed + ((float)s * stepSizeRed)
Чтобы повторно объединить значения RGB обратно в полном цвете, просто применить некоторые манипуляции с битами снова:
fullColour[s] = 0;
for(unsigned i=0; i<3; ++i)
fullColour[s] += rgbComponent[s][i] << (i*8);
Этот подход дает требуемое «затухание» от любого начала до любого конечного цвета на любом количестве шагов.
_ «Это не обязательно должно быть радуга, отображаемая выше». Итак, случайные 256 значений? – P0W
@ P0W больше похоже на радугу, но не на то, что я бы предположил. – Borgleader
Подсказка: значения Hex могут показаться сложными для изменения, но на самом деле каждый цвет представляет собой комбинацию из трех целых чисел (R, G, B). – SingerOfTheFall