Другие языки программирования и технологии
Как рассчитать палитру радуги.
Имеется 120 светодиодов. Нужно каждому из них задать цвет в формате RGB (тремя байтами), так чтобы получилась радуга. Как рассчитать значения этих байт?
Поскольку в радуге 7 цветов, то на один цвет приходится 120/7=17 оттенков одного цвета.
Причем от чистого цвета в сторону соседнего чистого цвета по радуге. Вот и считай..
На примере перехода от красного (254,0,0) к оранжевому (254,126,0) - шаг изменения цвета G равен 126/17=7
Итого
for(G=0 ; G <126 ; G +=7) {выводим цвет RGB}
Если же тебе нужен не плавный, а резкий переход, то задача намного упрощается - просто цикл от 1 до 7 и выводишь подряд 17 чистых цветов радуги.
Причем от чистого цвета в сторону соседнего чистого цвета по радуге. Вот и считай..
На примере перехода от красного (254,0,0) к оранжевому (254,126,0) - шаг изменения цвета G равен 126/17=7
Итого
for(G=0 ; G <126 ; G +=7) {выводим цвет RGB}
Если же тебе нужен не плавный, а резкий переход, то задача намного упрощается - просто цикл от 1 до 7 и выводишь подряд 17 чистых цветов радуги.
В качестве идеи:
0 - максимум красного, отсутствие синего и зелёного
60 - максимум зелёного, отсутствие красного и синего
120 - максимум синего - отсутствие красного и зелёного
Сначала постепенно снижаем красный и увеличиваем зелёный, потом постепенно снижаем зелёный и увеличиваем синий. Но вот границы диапазонов и линейность увеличения/уменьшения - это экспериментально.
Для большей реалистичности на синем конце надо добавить немного красного - чтобы получить фиолетовый. Это уже особенность рецепторов глаза.
0 - максимум красного, отсутствие синего и зелёного
60 - максимум зелёного, отсутствие красного и синего
120 - максимум синего - отсутствие красного и зелёного
Сначала постепенно снижаем красный и увеличиваем зелёный, потом постепенно снижаем зелёный и увеличиваем синий. Но вот границы диапазонов и линейность увеличения/уменьшения - это экспериментально.
Для большей реалистичности на синем конце надо добавить немного красного - чтобы получить фиолетовый. Это уже особенность рецепторов глаза.
Как вариант (пример на C#):
Color[] colors = new Color[120];
Color[] rc = { Color.Red, Color.Orange, Color.Yellow, Color.Lime, Color.SkyBlue, Color.Blue, Color.Violet };
for (int i = 0; i < 6; i++) {
for (int x = 0; x < 20; x++) {
int r = rc[i].R - (rc[i].R - rc[i + 1].R) / 20 * x;
int g = rc[i].G - (rc[i].G - rc[i + 1].G) / 20 * x;
int b = rc[i].B - (rc[i].B - rc[i + 1].B) / 20 * x;
colors[i * 20 + x] = Color.FromArgb(r, g, b);
}
}
Color[] colors = new Color[120];
Color[] rc = { Color.Red, Color.Orange, Color.Yellow, Color.Lime, Color.SkyBlue, Color.Blue, Color.Violet };
for (int i = 0; i < 6; i++) {
for (int x = 0; x < 20; x++) {
int r = rc[i].R - (rc[i].R - rc[i + 1].R) / 20 * x;
int g = rc[i].G - (rc[i].G - rc[i + 1].G) / 20 * x;
int b = rc[i].B - (rc[i].B - rc[i + 1].B) / 20 * x;
colors[i * 20 + x] = Color.FromArgb(r, g, b);
}
}
Похожие вопросы
- Как сменить вид палитры в Adobe Illustrator?
- Палитра цветов в фотошопе стала как в пэинте вместо стандартной
- Как рассчитать масштаб?
- Как рассчитать стаж между определенными датами с помощью MS OF EXCEL
- Хочу издавать газету в формате 2+2 (3 цвета) , как перевести цветовую палитру макет в 3 цвета (3-й сиреневый)?
- Напишите программу которая рассчитает значение полинома n-й степени.
- я вот не могу понять, язык Паскаль рассчитан чисто для учебных целей в школах?
- Помогите с лабораторной на языке С. Программа должна рассчитать сколько раз изменился знак во вводимых числах.
- 3D - как рассчитать угол между камерой и полигоном?
- Отчего зависит цвет осенних листьев? Почему одни листья золотистые, другие багряные, третьи имеют целую палитру красок?)