Site-ul personal

Dorința de a căuta opțiuni de optimizare a codului pentru construirea DMU ma împins să folosesc funcția de transformare a culorilor unui model uman într-o mașină.







Căutarea pentru implementarea terminată a dat mai multe rezultate, în principal pe C, dar, de asemenea, nu a dat rezultate pozitive.

Controlul prea luminos al luminozității și saturației pe una dintre marginile domeniului și un zero absolut al reacției în mijloc și pe cealaltă parte.

Am dezvoltat propria funcție de conversie pentru HSV la RGB, care a eliminat aceste defecte enervante.

255 de nuanțe, 255 de niveluri de saturație, 255 de niveluri de luminozitate.

Specificați trei parametri ai modelului HSV - nuanță, saturație și luminozitate.

Funcția returnează trei valori - nivele de luminozitate pentru diodele RGB.

Și funcționează destul de repede. Am procesat 16 diode simultan, nu s-au observat frâne!

Ei bine, aici sunt formulele prin care toate acestea ar trebui luate în considerare!

Pentru orice nuanță H ∈ [0 °, 360 °), saturația S ∈ [0, 100] și luminozitatea V ∈ [0, 100]:

(A trebuit să reconstruiesc toți parametrii până la 256, deci este mai convenabil, nu trebuie să verific pentru corectitudine - folosim un byte pe deplin)

  • dacă da
  • dacă da
  • dacă da
  • dacă da
  • dacă da
  • dacă da

Valorile primite ale canalelor RGB roșii, verzi și albastre sunt calculate în procente.

Pentru a le aduce în concordanță cu popularul vizualizare COLORREF, trebuie să le multiplicați fiecare câte 2,55.

Cu codificare integer pentru fiecare culoare din HSV există o culoare corespunzătoare în RGB.

Cu toate acestea, inversul nu este adevărat: unele culori în RGB nu pot fi exprimate în HSV,

astfel încât valoarea fiecărei componente să fie un număr întreg.







De fapt, cu această codificare este disponibilă doar 1/256 parte din spațiul de culoare RGB.


Pentru a face curbarea curcubeului, este suficient sa faceti un ciclu in care sa schimbati parametrul Hue de la 0 la 255 (nuanta).

Valorile RGB rezultate sunt setate la PWM pentru LED-uri.

Cu cât întârzierea ciclului este mai mică, cu atât culorile se vor schimba mai repede.

Pentru deplasările irizate în direcția opusă, este suficient să se inverseze ciclul în care valorile sunt reduse.

Funcția este foarte convenabilă din punct de vedere uman.

Este mai ușor pentru noi să punem o culoare strălucitoare cu un albastru palid: (nuanță = 128 - număr de culoare, sat = 128 - saturație, val = 255 - luminozitate);

decât același lucru pentru a obține cu RGB standard: (R = 128, G = 200, B = 255).

În cele din urmă, când determinăm culoarea, nu spunem că este alcătuită din roșu, verde și albastru într-o astfel de relație?

Vorbim pur și simplu - roșu aprins, galben pal, verde deschis.

Multe efecte pot fi făcute pe baza acestei funcții.

Bazat pe standardul RGB - un curcubeu într-o direcție sau alta, culorile clipind, efectul unei strobe.

Nu am văzut controlul luminozității, cu atât mai puțin saturația.

Dar cu HSV un calico foarte diferit!

În plus față de rotirea culorii (Hue), puteți modifica fără probleme luminozitatea nuanței selectate în mod curent (valoare).

De exemplu, lumina este roșie și portocalie, apoi portocalie, apoi galben.

Este foarte interesant să folosiți saturația.

Puteți obține un efect similar, numai culoarea nu se va aprinde și va ieși, dar va curge în alb și se va manifesta din ea.

Puteți face tranziția între culori prin alb.

Puteți ajusta rapid luminozitatea globală sau saturația totală.

Este mult mai ușor să scrieți codul care calculează parametrii RGB.

Practic, pentru orice efect, 1-2 buze imbricate vor fi suficiente.

Care este diferența fundamentală a funcției mele?

Aceasta ține cont de nelinearitatea LED-urilor.

Tabelele descriu datele sub care funcționează totul "frumos".

Acesta este rezultatul multor experimente.

Nimeni nu vă împiedică să vă ajustați totul.

Modificați valoarea culorii în ciclu, observați rezultatul, corectați valorile din tabelul de culori.

La fel cu luminozitatea și saturația.

Cred că codul poate fi optimizat în continuare.

Este, de asemenea, de dorit să vă utilizați în loc de PWM, consumă mult mai puține resurse.

Încercați să aplicați în schemele de culori diferite, apreciați imediat ușurința utilizării!

Graficul luminozității la fiecare pas pentru percepția liniară a ochiului







Articole similare

Trimiteți-le prietenilor: