|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:19 am
RGB - алгоритъм за плавно преливане.
| Автор |
Съобщение |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Ъ? Това пък как ще го докарам. Ти съвсем ми усложни живота
Ще си настройва очите към RGB. Щото на мен ми е по лесно.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пон Авг 10, 2009 5:07 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
За този алгоритъм дето го постнах и гамата се смята лесно. Не съм я изследвал как я смята но е нещо от сорта на обратно пропорциолно. В смисъл цвета с най-малко запълване се усилва най-много. Пример : жълто R=255, G=255, B=0 -> бледо жълто R=255,G=255, B=241; оранж : р=255, г=110, б=0 -> малко по-светло става р=255, г=115, б=15. Може и зависимост да се извади ама сега не ми се смята.
|
| Пон Авг 10, 2009 5:15 pm |
|
 |
|
Wise
Ранг: Форумен бог
Регистриран на: Нед Дек 19, 2004 6:26 pm Мнения: 1628 Местоположение: Сливен
|
Художникът каза, че дори 5-6 стойности на PWM за всеки цвят стигат.
Няма нужда да са 256. По-важно било областите на преливане............
Не я разбирам тази наука............. 
|
| Пон Авг 10, 2009 5:22 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Е, аз не съм художник ама имам Corel. Ама си е кеф да работиш с художник. Имал съм тази чест и чак не съм можел да повярвам че нещото мога да го направя на компютър. Особено като ми каже "направи го с една йота по светло" - кеф. Тази мерна единица колко съм я търсил в менютата 
|
| Пон Авг 10, 2009 5:26 pm |
|
 |
|
kasparov
Ранг: Почетен член
Регистриран на: Сря Апр 05, 2006 9:52 pm Мнения: 877 Местоположение: Разград
|
Да не би да имаш предвид HSB (Hue, saturation, brightness) цветови модел? И аз мисля, че с него ще се генерират най лесно
всички цветови комбинации, фазата(цветът) се променя от 0 до 360°, а яркостта и насищането от 0 до 100. Едва ли обаче ще може да се мине през всичките 1000000 комбинаци, никой нама да има нерви да ги гледа всичките.
От модела HSB има формулки и код даже, за преобразуване в RGB и към PWM-а.
http://colorschemedesigner.com/
|
| Пон Авг 10, 2009 5:29 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Ще пробвам отначало простия алгоритъм с дъгата. Ще кажа какво се е получило. Като ми остане време да го пробвам 
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пон Авг 10, 2009 5:41 pm |
|
 |
|
optron
Ранг: Ориентиран
Регистриран на: Чет Ное 20, 2008 1:49 pm Мнения: 276 Местоположение: Бургас
|
Аз съм правил нещо такова, не е чак толкова трудно, както се опитват да те плашат колегите.
Ползувам таймер 0, за да генерирам модулираните импулси. За целта го чета постоянно и сравнявам текущата му стойност със зададените ми стойности за яркост на трите цвята. Получава се леко колебание в широчината на импулсите, ама без инструменти не се вижда.
Самото преливане реализирам, като след всеки импулс отделям няколко цикъла от процесора за пресмятане и зареждане на нови стойности. След това генерирам нов импулс, после пак смятам и зареждам нови стойности и така съм го зациклил.
С подходящо инкрементиране и декрементиране може да се получи не само дъга - зависи кой цвят накъде местиш. Така съм направил постепенна смяна към различни цветове, фейд ин, фейд аут и подобни. Като че ли бавната дъга е най-приятният ефект от всичките. Естествено, сложил съм и бутончета за смяна на програмите - все пак и потребителят трябва да има някакъв контрол.
За дъгата, го правя така: инициализирам от пълен мрак като постепенно светвам червеното. След това бавно загасвам червеното, като в същото време пак така бавно светвам зеленото. Същата процедура след това със зеленото и синьото. После със синьото и червеното. И така зациклям.
Като разширение на този алгоритъм, може след инициализацията първо постепенно да светнеш зеленото и след това да угасиш червеното и така нататък, но тогава ще се получават разлики в яркостта.
Според мен, ще ти е най-лесно да работиш с 24-битов цвят, защото все пак тея машинки мислят 8-битово.  Аз поне така правя ... Дори и да имам данни за цвят с по-малко битове, първо си ги пресмятам до 24-битови и тогава ги правя каквото съм решил.
За съжаление, в момента прототипа съм го разпарчосал, за да ползвам частите за друг, така че не мога да демонстрирам. Но ако пожелаеш, ще го събера наново и ще го снимам.
Само едно не мога да направя все още и то е преобразуване от HSB към RGB. Трябва ми, за да мога да направя програма, при която да се задава цвят чрез потенциометър, като ъгълът на завъртане означава цвят от палитрата. Засега съм го направил като чета левите девет бита на АЦП, цепя го на три и зареждам полученото в съответните байтове за цвят, но така се получават едни накъсвания, не ти е работа. Някой да има идеи ?
_________________ Digitally yours: Optron
|
| Вто Авг 11, 2009 10:16 am |
|
 |
|
the_electronic_m@n
Ранг: Минаващ
Регистриран на: Пет Окт 05, 2007 8:34 pm Мнения: 76 Местоположение: Русе
|
Колега виж този пример за плавно преливане http://www.youtube.com/watch?v=OxDnNIoGRlw
Теоретично имаш 255х255х255 цвята (използват се от 1 до 255 бита шим за всеки от трите светодиода). PWM е софтуерен! Както са ти отговорили колегите по-горе отваряш Corel и гледаш палитрата (стълбчето с цветовете от червено до червено), след това като плъзгаш скролера гледай цифрите (битовете) в полетата на R G B. Те започват от 0 0 0 при черно и 255 255 255 при бяло. За твоята гимнастика трябва да направиш няколко " стълбчета" за да получиш "плавното" преливане.
|
| Сря Авг 12, 2009 10:41 am |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
http://www.alvyray.com/Papers/PapersCG.htm#HWB
HWB-A More Intuitive Hue-Based Color Model (with Eric Ray Lyons)
the journal of graphics tools, Vol 1, No 1: 3-17, 1996
ABSTRACT: The two most common color selector models, other than RGB (Red-Green-Blue), are the hue-based HSV (Hue-Saturation-Value) and HSL (Hue-Saturation-Lightness) color models. It is shown that both of these models are flawed. A closely related model, HWB (Hue-Whiteness-Blackness), is introduced that avoids the flaws, is slightly faster to compute, and is very easy to teach to new users: Choose a hue. Lighten it with white. Darken it with black. That whitening is not the complement of blackening is explained. (The two pages below should be consulted for fixes to errata in the paper.)
C code implementing the color transforms in the paper:
HWB to RGB transforms
http://www.alvyray.com/Papers/hwb2rgb.htm
HSV to RGB transforms
http://www.alvyray.com/Papers/hsv2rgb.htm
|
| Сря Авг 12, 2009 11:34 am |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
Преди няколко години правих трифазно RGB с 12F508 (тогава с такова разполагахме във фирмата)  . Идеята беше да се постигнат колкото се може повече цветове с плавно преливане, но нямаше възможност за контрол. 7-битов PWM, като трите цвята са дефазирани на 120 градуса. 128-те стойности за PWM ги бях сложил в една таблица, като се изменяха от 0 до макс по гаусова крива (едната половина на камбаната). Таблицата се спретва за 2 минути в ексел. Имаше моменти, в които се получаваше дори и някакъв вид бяло, като за непретенциозно приложение беше много доволно.
|
| Нед Авг 16, 2009 11:55 am |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
А аз го направих вече. Направих една "дъга". Натурях и разни други преливащи програмки, дето ги сътворих ей тъй "на око". Сложих и разни прости разноцветни премигвания. Абе стана прилично. Важното е, че човека си го харесва, много е доволен. Аз също, щото ми се махна тая работа от главата  .
Благодаря на всички за идеите 
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пон Авг 17, 2009 8:44 am |
|
 |
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 10:32 pm Мнения: 710
|
Първо решаваш как искаш да се преливаш - това става най-лесно така: Отваряш пропъртитата на десктопа на Win и местиш мишката по петното с много цветове - гледаш резултантния цвят, докато решиш кое движение на мишката те устройва.
После измисляш алгоритъм да ти генерира горе -долу последователността на RGB през които си минал (виждат им се стойностите, докато местиш мишката)
После го тестваш
И накрая го публикуваш тука 
|
| Пон Авг 17, 2009 3:25 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Е аз така направих де. Ама няма да го публикувам тука, всеки знае как се прави цикъл на C.  Няма нищо интересно в него.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пон Авг 17, 2009 5:05 pm |
|
 |
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 10:32 pm Мнения: 710
|
Имам спомен, че на времето бях правил някаква сложнотия, която не стана много добре (това, за разглеждането на готова палитра ми дойде на ум по-късно).
Щеше да ми е интересно да видя  , няма значени,  .
|
| Пон Авг 17, 2009 6:33 pm |
|
 |
|
kokaracha
Ранг: Минаващ
Регистриран на: Вто Авг 25, 2009 12:06 pm Мнения: 1
|
 RGB PWM модулация
Ето едно примерче за PWM модулация на трите цвята от 0 до 255:
void pwm_rgb(int8 time, int8 duty_r, int8 duty_g, int8 duty_b)
{
int8 i, time_off_red, time_off_green, time_off_blue =0;
int8 time_on_red, time_on_green, time_on_blue =0;
time_on_red = duty_r;
time_off_red = (250 - duty_r);
time_on_green = duty_g;
time_off_green = (250 - duty_g);
time_on_blue = duty_b;
time_off_blue = (250 - duty_b);
for (i=1; i<=250; i++)
{
delay_us(time);
if (time_off_red == i)
{
output_high (PIN_A0);
}
if (time_off_green == i)
{
output_high (PIN_A1);
}
if (time_off_blue == i)
{
output_high (PIN_B1);
}
}
output_low (PIN_A0);
output_low (PIN_A1);
output_low (PIN_B1);
}
а за различните цветове може да се ползва цикъл, който увеличава всеки цвят по-отделно като почва от R=0, G=0, B=0 и завършва с максималните им стойности.
|
| Пон Сеп 14, 2009 9:56 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|