Программирование RGB ленты
- Войдите на сайт для отправки комментариев
Пнд, 04/12/2017 - 22:24
Доброго здравия!
Интересует создание рандомайзера для RGB ленты. Нужен полный охват всех цветов (16,5 млн) в рандомном порядке,переключение цвета с помощью плавного перехода(чтобы R,G,B изменялись с дискретностью в единицу)
Есть такой исходник, который делает переход цветов, но по ограниченному периоду.(Охватывает всего лишь до трёх тысяч цветов)
Есть идея, что можна реализовать это, как в бильярде, а именно в векторном виде, чтобы вектор отбивался от граней куба.
#include <time.h> int a1,a2,a3,c1,c2,c3,l; void setup() { Serial.begin(9600); // put your setup code here, to run once: srand(time(NULL)); a1=rand() %255+1; analogWrite(3, a1); a2=rand() %255+1; analogWrite(5, a2); a3=rand() %255+1; analogWrite(6, a3); c1=1; c2=0; c3=1; } void loop() { // put your main code here, to run repeatedly: //Serial.print("a1="); Serial.print(a1); //Serial.print(" a2="); Serial.print(" "); Serial.print(a2); //Serial.print(" a3="); Serial.print(" "); Serial.print(a3); Serial.print(" "); Serial.print(c1); Serial.print("\n"); delay(10); if(0<=a1&&a1<=5) {c1=1;} else if(250<=a1&&a1<=255) {c1=0;} if(0<=a2&&a2<=5) {c2=1;} else if(250<=a2&&a2<=255) {c2=0;} if(0<=a3&&a3<=5) {c3=1;} else if(250<=a3&&a3<=255) {c3=0;} analogWrite(3, a1); if(c1==1) { l=rand() % 5 +1; a1+=l;; } else { l=rand() % 5 +1; a1-=l;; } delay(25); analogWrite(5, a2); if(c2==1) {l=rand() % 5 +1; a2+=l;; } else {l=rand() % 5 +1; a2-=l;; } delay(2); analogWrite(6, a3); if(c3==1) {l=rand() % 5 +1; a3+=l;; } else {l=rand() % 5 +1; a3-=l;; } delay(2); //delay (500); }
так рандом или плавный переход на 1...???
И то, и то. Суть в том, чтоб изменялись R, G, B независимо друг от друга в рандомном порядке с дискретностью в единицу
Представте себе куб, три оси которого R, G, B. Каждый канал имеет 256 значений интенсивности, в сумме мы получаем куб с 16,7 млн возможными оттенками цветов. Возьмем любую ячейку в этом кубе, для плавного изменения цвета мы должны перемещатся через каждую ячейку, но в какую сторону это должно выбираться произвольно. Например, возможные перемещения: [55,100,30] -> [54,101,31]->[53,100,32]->...и т.д. Важна именно рандомизация направленя перемещения ячейки в этом кубе.
Есть идея, что можна реализовать это, как в бильярде, а именно в векторном виде, чтобы вектор отбивался от граней куба.
Например, возможные перемещения: [55,100,30] -> [54,101,31]->[53,100,32]->...и т.д. Важна именно рандомизация направленя перемещения ячейки в этом кубе.
Вы сами себе противоречите. Где же тут "как в бильярде"? Если первый и третий параметры уменьшаются и увеличиваются соответственно (55-54-53... и 30-31-32...) - норма, то второй прыгает, как заяц - 100-101-100... "Как в бильярде" - это, я так понимаю, есть определенное направление, при котором параметры постепенно увеличиваются/уменьшаются, пока один из них не достигнет "стенки" (0 или максимума) и только потом возможна смена знака приращения.
Пример с бильярдом это как один вариант движения, а с координатами другой вариант.
Похоже вы перетрудились . Что бы RGB ,были независимы им надо друг на друга начхать. Возьмем один параметр. к примеру R. на сколько надо поменять значение. Направление в +/- это один параметр . Длительность развития от 1 милисек до 1 сек. и скорость прироста быстрая вспышка или медленая. Задаете рандом на 3 параметра , вычисляете до реальной реализации и ждете следующий шаг.
Не сложно это пишется. Пусть rgb - текущий цвет свечения. Генерим случайные RGB. Пока rgb!=RGB крутим цикл в котором if(r<R) r++; if(r>R)r--; остальные цвета аналогично. По завершению цикла генерим новые RGB и повторяем. Можна еще чесней - на 1 изменяем только тот цвет у которого разница между текущим и случайным по модулю наибольшая. Остальные цвета изменяем пропорционально, на дробную часть. Однако не партесь, результат Вам и в том и в другом случае скорей всего не понравится. Потому что теорию вероятности учить надо было ;)