Étape 2: Le Code
ColorduinoPlasma - démo de Plasma à l’aide de la bibliothèque de Colorduino pour Arduino
Lincomatic Copyright (c) 2011 Sam C. Lin tous droits réservés
fonction couleur cyclisme plasma
Version 0.1 - 8 juillet 2009
Copyright (c) 2009 Ben Combee. Tous droits réservés.
Copyright (c) 2009 Ken Corey. Tous droits réservés.
Copyright (c) 2008 soso H. Oskay. Tous droits réservés.
Copyright (c) 2011 Sam C. Lin tous droits réservés
Cette démo est un logiciel libre ; vous pouvez le redistribuer et/ou
modifier selon les termes de la GNU Lesser Grand Public
License telle que publiée par la Free Software Foundation ; ou l’autre
version 2.1 de la licence, ou (à votre choix) toute version ultérieure.
Cette démo est distribuée dans l’espoir qu’il sera utile,
mais sans aucune garantie ; sans même la garantie implicite de
Qualité marchande ou ADEQUATION a un usage particulier. Voir la GNU
Lesser General Public License pour plus de détails.
Vous devriez avoir reçu une copie de la GNU Lesser Grand Public
License along with this library ; Si tel n’est pas le cas, écrivez à la Free Software
Foundation, Inc., 51 Franklin St, 5ème étage, Boston, MA 02110-1301 USA
*/
#include
typedef struct
{
unsigned char r ;
unsigned char g ;
unsigned char b ;
} ColorRGB ;
une couleur avec 3 composants: h, s et v
typedef struct
{
unsigned char h ;
unsigned char s ;
unsigned char v ;
} ColorHSV ;
plasma d’unsigned char [ColorduinoScreenWidth] [ColorduinoScreenHeight] ;
long paletteShift ;
Convertit une couleur HSV en couleur RVB
void HSVtoRGB (void * vRGB, void * vSHV)
{
flotteur r, g, b, h, s, v ; Cette fonction fonctionne avec des flotteurs entre 0 et 1
flotteur f, p, q, t ;
int i ;
ColorRGB * colorRGB =(ColorRGB *) vRGB ;
ColorHSV * colorHSV =(ColorHSV *) SHV ;
h = (float) (colorHSV -> h/256,0) ;
s = (float) (colorHSV -> s/256,0) ;
v = (float) (colorHSV -> v/256,0) ;
Si la saturation est 0, la couleur est une nuance de gris
if(s == 0.0) {}
b = v ;
g = b ;
r = g ;
}
Si saturation > 0, des calculs plus complexes sont nécessaires
d’autre
{
h * = 6.0 ; pour mettre teinte à un nombre compris entre 0 et 6, mieux pour les calculs
J’ai = (int)(floor(h)) ; par exemple, 2.7 devient 2 et 3.01 devient 3 ou 4.9999 devient 4
f = h - i; //the partie fractionnaire de 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)
{
case 0: r = v ; g = t ; b = p ; rupture ;
cas 1: r = q ; g = v ; b = p ; rupture ;
cas 2: r = p ; g = v ; b = t ; rupture ;
case 3: r = p ; g = q ; b = v ; rupture ;
case 4: r = t ; g = p ; b = v ; rupture ;
cas 5: r = v ; g = p ; b = q ; rupture ;
par défaut: r = g = b = 0 ; rupture ;
}
}
colorRGB -> r = (int)(r * 255.0) ;
colorRGB -> g = (int)(g * 255.0) ;
colorRGB -> b = (int)(b * 255.0) ;
}
flotteur
dist (float float a, float b, float c, d).
{
Return sqrt((c-a)*(c-a)+(d-b)*(d-b)) ;
}
Sub
plasma_morph()
{
unsigned char x, y ;
nombre en virgule flottante ;
ColorRGB colorRGB ;
ColorHSV colorHSV ;
pour (y = 0; y < ColorduinoScreenHeight; y ++)
pour (x = 0; x < ColorduinoScreenWidth; x ++) {}
{
valeur = sin (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= (unsigned 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() ; échanger des mémoires tampons d’écran pour montrer
}
/********************************************************
Nom : ColorFill
Fonction : Remplir le cadre avec une couleur
Paramètre: R: valeur de rouge. Gamme : rouge 0 ~ 255
G: valeur de vert. Gamme : rouge 0 ~ 255
B: la valeur de bleu. Gamme : rouge 0 ~ 255
********************************************************/
ColorFill Sub (unsigned char R, unsigned char G, unsigned char B)
{
PixelRGB * p = Colorduino.GetPixel(0,0) ;
pour (unsigned char y = 0; y (unsigned char x = 0; x p -> r = R ;
p -> g = G ;
p -> b = B ;
p ++ ;
}
}
Colorduino.FlipPage() ;
}
void setup()
{
Colorduino.Init() ; initialiser le Conseil
compenser les différences d’intensité relative de luminosité R/G/B
Tableau de valeurs de base 6-bit RGB (0 ~ 63)
whiteBalVal [0] = rouge
whiteBalVal [1] = vert
whiteBalVal [2] = bleu
unsigned char whiteBalVal [3] = {36,63,63} ; pour LEDSEE 6x6cm ronds matrice
Colorduino.SetWhiteBal(whiteBalVal) ;
commencer par morphing plasma, mais permettent d’aller à vélo si vous le souhaitez de la couleur.
paletteShift = 128000 ;
unsigned char bcolor ;
générer du plasma une fois
pour (unsigned char y = 0; y < ColorduinoScreenHeight; y ++)
pour (unsigned char x = 0; x < ColorduinoScreenWidth; x ++)
{
le tampon de plasma est une somme de sines
BColor = (unsigned char)
(
128,0 + (128.0 * sin (x * 8.0/16,0))
+ 128,0 + (128.0 * sin (y * 8.0/16,0))
) / 2;
plasma [x] [y] = bcolor ;
}
pour ajuster la balance des blancs, vous pouvez décommenter cette ligne
et mettez en commentaire la plasma_morph() en loop()
et puis expérimenter la whiteBalVal ci-dessus
ColorFill(255,255,255) ;
}
void loop()
{
plasma_morph() ;
}