27-01-2018, 16:47
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.
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);
}
}