Dumbom Cap (2 / 4 steg)
Steg 2: Koden
ColorduinoPlasma - Plasma demo med Colorduino bibliotek för Arduino
Copyright (c) 2011 Sam C. Lin lincomatic alla rättigheter reserverade
baserat på färg cykling plasma
Version 0.1 - 8 juli 2009
Copyright (c) 2009 Ben Combee. Alla rättigheter reserverade.
Copyright (c) 2009 Ken Corey. Alla rättigheter reserverade.
Copyright (c) 2008 Windell H. Oskay. Alla rättigheter reserverade.
Copyright (c) 2011 Sam C. Lin alla rättigheter reserverade
Denna demo är fri programvara; Du kan vidaredistribuera det och/eller
ändra den enligt villkoren i den GNU Lesser allmänna offentliga
Licens som offentliggörs av Free Software Foundation; antingen
version 2.1 av licensen, eller (vid ditt alternativ) någon senare version.
Denna demo distribueras i hopp om att det kommer att vara användbar,
men utan garantier; utan att ens underförstådd garanti om
SÄLJBARHET eller lämplighet för ett visst ändamål. Se GNU
Lesser General Public License för mer detaljer.
Du bör ha fått en kopia av den GNU Lesser allmänna offentliga
License tillsammans med detta bibliotek; om inte, skriv till fri programvara
Foundation, Inc., 51 Franklin St, femte våningen, Boston, MA 02110-1301 USA
*/
#include
TypeDef struct
{
unsigned char r;
unsigned char g;
unsigned char b;
} ColorRGB;
en färg med 3 komponenter: h, s och v
TypeDef struct
{
unsigned char h;
unsigned char s;
unsigned char v.
} ColorHSV;
unsigned char plasma [ColorduinoScreenWidth] [ColorduinoScreenHeight];
lång paletteShift;
Konverterar en HSV-färg till RGB-färg
void HSVtoRGB (void * vRGB, void * vHSV)
{
float r, g, b, h, s, v. denna funktion fungerar med flöten mellan 0 och 1
flyta f, p, q, t;
int i;
ColorRGB * colorRGB =(ColorRGB *) vRGB;
ColorHSV * colorHSV =(ColorHSV *) vHSV;
h = (float) (colorHSV -> h/256,0);
s = (float) (colorHSV -> s/256,0);
v = (float) (colorHSV -> v/256,0);
om mättnad är 0, är färgen en nyans av grå
IF(s == 0.0) {
b = v;
g = b;
r = g;
}
om mättnad > 0, mer komplexa beräkningar är behövs
annat
{
h * = 6.0; att få nyans till ett tal mellan 0 och 6, bättre för beräkningarna
Jag = (int)(floor(h)); e.g. 2,7 blir 2 och 3.01 blir 3 eller 4.9999 blir 4
f = h - i, //the decimaldelen av h
p = (float) (v * (1.0 - s));
q = (float) (v * (1,0 - (s * f)));
t = (float) (v * (1,0 - (s * (1.0 - f)));
Switch(i)
{
fall 0: r = v; g = t; b = p; bryta;
fall 1: r = q; g = v; b = p; bryta;
fall 2: r = p; g = v; b = t; bryta;
fall 3: r = p; g = q; b = v; bryta;
fall 4: r = t; g = p; b = v; bryta;
fall 5: r = v; g = p; b = q; bryta;
standard: r = g = b = 0; bryta;
}
}
colorRGB -> r = (int)(r * 255.0);
colorRGB -> g = (int)(g * 255.0);
colorRGB -> b = (int)(b * 255.0);
}
flöte
dist (float, float b, float c, flyta d).
{
återvända sqrt((c-a)*(c-a)+(d-b)*(d-b));
}
void
plasma_morph()
{
unsigned char x, y;
flytvärdet;
ColorRGB colorRGB;
ColorHSV colorHSV;
för (y = 0; y < ColorduinoScreenHeight; y ++)
för (x = 0; x < ColorduinoScreenWidth; x ++) {
{
värde = synd (dist (x + paletteShift, y, 128.0, 128.0) / 8,0)
+ sin (dist (x, y, 64,0, 64,0) / 8,0)
+ sin (dist (x, y + paletteShift/7, 192.0, 64) / 7.0)
+ sin (dist (x, y, 192.0, 100,0) / 8.0);
colorHSV.h= (osignerade char)((value) * 128) & 0xff;
colorHSV.s=255;
colorHSV.v=255;
HSVtoRGB (& colorRGB & colorHSV);
Colorduino.SetPixel (x, y, colorRGB.r, colorRGB.g, colorRGB.b);
}
}
paletteShift ++;
Colorduino.FlipPage(); byta skärm buffertar för att visa den
}
/********************************************************
Namn: Färgfyll
Funktion: Fylla ramen med en färg
Parameter: R: värdet av rött. Utbud: röd 0 ~ 255
G: värdet av grönt. Utbud: röd 0 ~ 255
B: värdet av blått. Utbud: röd 0 ~ 255
********************************************************/
void Färgfyll (unsigned char R, unsigned char G, unsigned char B)
{
PixelRGB * p = Colorduino.GetPixel(0,0);
för (unsigned char y = 0; y för (unsigned char x = 0, x p -> r = R;
p -> g = G;
p -> b = B;
p ++;
}
}
Colorduino.FlipPage();
}
void setup()
{
Colorduino.Init(); initiera styrelsen
kompensera relativa intensitet skillnader i R/G/B ljusstyrka
matris med 6-bitars bas värden för RGB (0 ~ 63)
whiteBalVal [0] = röd
whiteBalVal [1] = grön
whiteBalVal [2] = blå
unsigned char whiteBalVal [3] = {36,63,63}. för LEDSEE 6x6cm runda matris
Colorduino.SetWhiteBal(whiteBalVal);
börja med morphing plasma, men tillåta att färg cykling om så önskas.
paletteShift = 128000;
unsigned char bcolor;
Generera plasman en gång
för (unsigned char y = 0; y < ColorduinoScreenHeight; y ++)
för (unsigned char x = 0; x < ColorduinoScreenWidth; x ++)
{
plasma bufferten är en summa av sines
bcolor = (unsigned char)
(
128.0 + (128.0 * synd (x * 8.0/16,0))
+ 128.0 + (128.0 * synd (y * 8.0/16,0))
) / 2;
plasma [x] [y] = bcolor;
}
Om du vill justera vitbalans kan du ta bort denna rad
och kommentera ut plasma_morph() i loop()
och experimenterar med whiteBalVal ovan
ColorFill(255,255,255);
}
void loop()
{
plasma_morph();
}