• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przekazywanie wartości w funkcjach
#1
Cześć,
piszę własnie program którego zadaniem jest sterowanie adresowaną taśmą led RGB.

Niestety, ale ustawianie kolorów w RGB jest dla mnie nieintuicyjne. Nie jestem w stanie napisać kodu który będzie płynnie przechodził przez całą paletę barw. Postanowiłem więc, ze będę zamienia RGB na HSV i odwrotnie.
Poszukałem gotowego kodu który wykonuje taką operacje, ale w jego konstrukcji są elementy których jeszcze nie znam i nie bardzo wiem czego szukać w internecie żeby je poznać więc tutaj pojawia się pojawia prośba do was.

Generalnie wiem, że zmienne podane w nawiasie za nazwą funkcji to wartości, które przekazuję do niej. Dlaczego przy niektórych z nich jest gwiazdka, dlaczego funkcja wymaga ode mnie podania zarówno wartości HSV jak i rgb skoro rgb powinny być zwracane jako wynik na podstawie podanych wartości SHV, oraz ostatnie pytanie: jak funkcja zwraca więcej niż jedną wartość, bo przecież zgodnie z założeniem powinienem dostać r, g, b w odpowiedzi. 

Kod:
void HSV_to_RGB(float h, float s, float v, byte *r, byte *g, byte *b)
{
 int i,f,p,q,t;
 
 h = max(0.0, min(360.0, h));
 s = max(0.0, min(100.0, s));
 v = max(0.0, min(100.0, v));
 
 s /= 100;
 v /= 100;
 
 if(s == 0) {
   // Achromatic (grey)
   *r = *g = *b = round(v*255);
   return;
 }

 h /= 60; // sector 0 to 5
 i = floor(h);
 f = h - i; // factorial part of h
 p = v * (1 - s);
 q = v * (1 - s * f);
 t = v * (1 - s * (1 - f));
 switch(i) {
   case 0:
     *r = round(255*v);
     *g = round(255*t);
     *b = round(255*p);
     break;
   case 1:
     *r = round(255*q);
     *g = round(255*v);
     *b = round(255*p);
     break;
   case 2:
     *r = round(255*p);
     *g = round(255*v);
     *b = round(255*t);
     break;
   case 3:
     *r = round(255*p);
     *g = round(255*q);
     *b = round(255*v);
     break;
   case 4:
     *r = round(255*t);
     *g = round(255*p);
     *b = round(255*v);
     break;
   default: // case 5:
     *r = round(255*v);
     *g = round(255*p);
     *b = round(255*q);
   }
}
 
Odpowiedź
  


Wiadomości w tym wątku
Przekazywanie wartości w funkcjach - przez BorokaMan - 27-01-2018, 16:47

Skocz do:


Przeglądający: 1 gości