Слишком резкое управление яркостью и насыщенностью на одном из краёв диапазона и абсолютный ноль на реакцию в средине и с другого края.
Я разработал свою функцию преобразования HSV в RGB, которая избавлена от этих досадных недостатков.
255 оттенков, 255 уровней насыщенности, 255 уровней яркости.
Чем меньше задержка в цикле, тем быстрее будут меняться цвета.
Для радужных переливов в обратную сторону достаточно сделать обратный цикл, в котором значения убавляются.
Функция очень удобная с человеческой точки зрения.
Проще ведь для нашего понимания выставить с её помощью бледно-голубой яркий цвет так: (hue = 128 - номер цвета, sat=128 - насыщенность, val=255 - яркость),
Мы ведь когда определяем цвет, не говорим что он состоит из красного, зелёного и синего в таких-то отношениях?
Мы говорим просто - ярко красный, бледно желтый, светло-зелёный.
На основе этой функции можно сделать многие эффекты.
На основе стандартного RGB - радуга в одну или другую сторону, мигание цветами, эффект стробоскопа.
Я не видел управления яркостью, а тем более насыщенностью.
Кроме вращения цвета (Hue), можно плавно менять яркость выбранного в данный момент оттенка (Value).
Например - плавно зажёгся и потух красный, затем также оранжевый, затем жёлтый...
Можно получить похожий эффект, только цвет будет не разгораться и тухнуть, а перетекать в белый и проявляться из него.
Можно оперативно регулировать общую яркость или общую насыщенность.
Намного упрощается написание кода, рассчитывающего RGB параметры.
Практически для любого эффекта будет достаточно 1-2 вложенных циклов.
В таблицах описаны данные при которых всё работает "красиво".
Это результат многих экспериментов.
Изменяете в цикле значение цвета, наблюдаете за результатом, корректируете значения в таблице цветов.
Тоже самое с яркостью и насыщенностью.
Я думаю, что код можно ещё оптимизировать.
Также желательно вместо ШИМа применять ВАМ, он намного меньше ресурсов ест.
Попробуйте применить в своих разнообразных цветовых конструкциях, вы сразу же оцените удобство в использовании!
'==========Объявление функций==========
'Функция преобразования HSV в RGB
' Вход:
' 0 <= hue < 255 - Hue - оттенок. Основные цвета:
' 0 - красный, 43 - желтый,
' 85 - зеленый, 128 - голубой
' 170 - синий, 213 - пурпурный
' 0 <= sat <= 255 - Saturation - насыщенность - 255 максимум
' 0 <= val <= 255 - Value - яркость - 255 максимум
' Выход:
' 0 <= r,g,b <= 255 - значения красного, зеленого, синего для выбранного канала
Declare Sub Hsv2rgb(byval In_h As Byte , Byval In_s As Byte , Byval In_v As Byte , Out_r As Byte , Out_g As Byte , Out_b As Byte)
'==========Объявление переменных==========
Dim R As Byte 'Значение ШИМ для каналов R
Dim G As Byte 'Значение ШИМ для каналов G
Dim B As Byte 'Значение ШИМ для каналов B
'==========ПРИМЕР ВЫЗОВА ФУНКЦИИ==========
Call Hsv2rgb(0 , 255 , 255 , R , G , B )
'Цвет - красный, насыщенность и яркость - максимальные.
'На выходе - значения RGB для дальнейшего формирования ШИМ или отправки в адресуемые ленты или пиксели
'==========Функция преобразования HSV в RGB==========
'http://ru.wikipedia.org/wiki/HSV_(%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)
Sub Hsv2rgb(byval In_h As Byte , Byval In_s As Byte , Byval In_v As Byte , Out_r As Byte , Out_g As Byte , Out_b As Byte)
Local Hr As Byte
Local Hg As Byte
Local Hb As Byte
Local Sr As Byte
Local Sg As Byte
Local Sb As Byte
Local Tmp As Byte
Local Temps As Word
'Получим логарифмические значения цвета RGB каналов для заданного цвета из расчитанной таблицы
Hr = Lookup(in_h , Hsv_r)
Hg = Lookup(in_h , Hsv_g)
Hb = Lookup(in_h , Hsv_b)
'Получим значения насыщенности
In_s = Lookup(in_s , Saturation)
Temps = Hr * In_s
Temps = Temps / 256
Temps = Temps + 255
Temps = Temps - In_s
Sr = Temps
Temps = Hg * In_s
Temps = Temps / 256
Temps = Temps + 255
Temps = Temps - In_s
Sg = Temps
Temps = Hb * In_s
Temps = Temps / 256
Temps = Temps + 255
Temps = Temps - In_s
Sb = Temps
'Получим значения яркости
In_v = Lookup(in_v , Value)
Temps = In_v * Sr
Temps = Temps / 256
Out_r = Temps
Temps = In_v * Sg
Temps = Temps / 256
Out_g = Temps
Temps = In_v * Sb
Temps = Temps / 256
Out_b = Temps
End Sub
'==========Насыщенность==========
Saturation:
Data 0 , 6 , 12 , 17 , 22 , 27 , 32 , 37 , 42 , 46 , 51 , 55 , 59 , 64 , 68 , 72
Data 76 , 80 , 84 , 87 , 91 , 94 , 98 , 101 , 105 , 108 , 111 , 114 , 117 , 120 , 123 , 126
Data 129 , 131 , 134 , 137 , 139 , 142 , 144 , 147 , 149 , 151 , 154 , 156 , 158 , 160 , 162 , 164
Data 166 , 168 , 170 , 172 , 174 , 175 , 177 , 179 , 180 , 182 , 184 , 185 , 187 , 188 , 190 , 191
Data 193 , 194 , 195 , 197 , 198 , 199 , 200 , 201 , 203 , 204 , 205 , 206 , 207 , 208 , 209 , 210
Data 211 , 212 , 213 , 214 , 215 , 216 , 217 , 217 , 218 , 219 , 220 , 221 , 221 , 222 , 223 , 224
Data 224 , 225 , 226 , 226 , 227 , 228 , 228 , 229 , 229 , 230 , 231 , 231 , 232 , 232 , 233 , 233
Data 234 , 234 , 235 , 235 , 235 , 236 , 236 , 237 , 237 , 238 , 238 , 238 , 239 , 239 , 240 , 240
Data 240 , 241 , 241 , 241 , 242 , 242 , 242 , 242 , 243 , 243 , 243 , 244 , 244 , 244 , 244 , 245
Data 245 , 245 , 245 , 246 , 246 , 246 , 246 , 246 , 247 , 247 , 247 , 247 , 247 , 248 , 248 , 248
Data 248 , 248 , 248 , 249 , 249 , 249 , 249 , 249 , 249 , 250 , 250 , 250 , 250 , 250 , 250 , 250
Data 250 , 251 , 251 , 251 , 251 , 251 , 251 , 251 , 251 , 251 , 252 , 252 , 252 , 252 , 252 , 252
Data 252 , 252 , 252 , 252 , 252 , 252 , 253 , 253 , 253 , 253 , 253 , 253 , 253 , 253 , 253 , 253
Data 253 , 253 , 253 , 253 , 253 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254
Data 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'==========Яркость==========
Value:
Data 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1
Data 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2
Data 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3
Data 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 4
Data 4 , 4 , 4 , 4 , 4 , 4 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 6
Data 6 , 6 , 6 , 6 , 6 , 6 , 6 , 7 , 7 , 7 , 7 , 7 , 7 , 8 , 8 , 8
Data 8 , 8 , 8 , 9 , 9 , 9 , 9 , 9 , 10 , 10 , 10 , 10 , 10 , 11 , 11 , 11
Data 11 , 12 , 12 , 12 , 12 , 13 , 13 , 13 , 14 , 14 , 14 , 14 , 15 , 15 , 15 , 16
Data 16 , 16 , 17 , 17 , 18 , 18 , 18 , 19 , 19 , 20 , 20 , 21 , 21 , 21 , 22 , 22
Data 23 , 23 , 24 , 24 , 25 , 25 , 26 , 27 , 27 , 28 , 28 , 29 , 30 , 30 , 31 , 32
Data 32 , 33 , 34 , 35 , 35 , 36 , 37 , 38 , 39 , 39 , 40 , 41 , 42 , 43 , 44 , 45
Data 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 55 , 56 , 57 , 58 , 59 , 61 , 62 , 63
Data 65 , 66 , 68 , 69 , 71 , 72 , 74 , 76 , 77 , 79 , 81 , 82 , 84 , 86 , 88 , 90
Data 92 , 94 , 96 , 98 , 100 , 102 , 105 , 107 , 109 , 112 , 114 , 117 , 119 , 122 , 125 , 127
Data 130 , 133 , 136 , 139 , 142 , 145 , 148 , 151 , 155 , 158 , 162 , 165 , 169 , 172 , 176 , 180
Data 184 , 188 , 192 , 197 , 201 , 205 , 210 , 214 , 219 , 224 , 229 , 234 , 239 , 244 , 250 , 255
'==========Цветовой тон для R==========
Hsv_r:
'От красного до желтого - 43 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'От желтого до зеленого - 42 ступени
Data 223 , 192 , 170 , 148 , 130 , 113 , 99 , 86 , 76 , 66 , 58 , 50 , 44 , 38 , 34 , 29 , 26 , 22 , 20 , 17 , 15
Data 13 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 4 , 3 , 3 , 3 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 0
'От зеленого до голубого - 43 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'От голубого до синего - 42 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'От синего до фиолетового - 43 ступени
Data 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 , 4 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15
Data 17 , 20 , 22 , 26 , 29 , 34 , 38 , 44 , 50 , 58 , 66 , 76 , 86 , 99 , 113 , 130 , 148 , 170 , 192 , 223 , 255
'От фиолетового до красного - 43 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'==========Цветовой тон для G==========
Hsv_g:
'От красного до желтого - 43 ступени
Data 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 , 4 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15
Data 17 , 20 , 22 , 26 , 29 , 34 , 38 , 44 , 50 , 58 , 66 , 76 , 86 , 99 , 113 , 130 , 148 , 170 , 192 , 223 , 255
'От желтого до зеленого - 42 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'От зеленого до голубого - 43 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'От голубого до синего - 42 ступени
Data 223 , 192 , 170 , 148 , 130 , 113 , 99 , 86 , 76 , 66 , 58 , 50 , 44 , 38 , 34 , 29 , 26 , 22 , 20 , 17 , 15
Data 13 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 4 , 3 , 3 , 3 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 0
'От синего до фиолетового - 43 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'От фиолетового до красного - 43 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'==========Цветовой тон для B==========
Hsv_b:
'От красного до желтого - 43 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'От желтого до зеленого - 42 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'От зеленого до голубого - 43 ступени
Data 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 , 4 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15
Data 17 , 20 , 22 , 26 , 29 , 34 , 38 , 44 , 50 , 58 , 66 , 76 , 86 , 99 , 113 , 130 , 148 , 170 , 192 , 223 , 255
'От голубого до синего - 42 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'От синего до фиолетового - 43 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'От фиолетового до красного - 43 ступени
Data 223 , 192 , 170 , 148 , 130 , 113 , 99 , 86 , 76 , 66 , 58 , 50 , 44 , 38 , 34 , 29 , 26 , 22 , 20 , 17 , 15
Data 13 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 4 , 3 , 3 , 3 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 0
Я надеюсь, что эта информация вам будет полезной и вы сможете применить её в своих конструкциях.
С уважением, Рубашка В.Н. (Radan)