Stap 4: Willekeurige kleuren
OK, regenboog gedaan, laten we enkele mooie willekeurige kleuren. Wat kunnen gemakkelijker? Gewoon
byte r, g, b;r = random(255); g = random(255); b = random(255); setRGBpoint(LED, r, g, b);
zal doen, juist? Ik denk dat je al zien dat dit in oncontroleerbare stroomfluctuaties resulteren zal. Wat is meer, dit ding meestal ziet eruit als net iets getint tinten van wit, als het vult alle drie kanalen met sommige huisvuil (in HSV-model dat gemiddeld 50 worden zal % verzadiging – maar we willen 100%!).
Kijk naar dit:
r = random(256);g = random(256-r); b = (255-r-g); setRGBpoint(LED, r, g, b);
Er is hier geen probleem met energieverbruik, maar je kunt zien dat dit specifieke algoritme het eerste kanaal (rood gunsten): het wordt 50% van willekeurige waarden, en de andere helft wordt gedeeld tussen de twee resterende degenen. Dit is niet zo slecht aangezien het eruit ziet en je moet niet ontslaan dit algoritme. Menselijk oog is niet erg goed in de omgang met blauwe en groene kleuren (in feite, ik heb gelezen ergens dat we geleerd om te onderscheiden die kleuren niet zo lang geleden; zij waren voor de oude Egyptenaren hetzelfde). Maar we zijn mooi OK met reds. We kunnen gemakkelijk vertellen elkaar scarlet, sinaasappel, oker, geel en citroen – deze kleuren zijn tussen rood en groen in het RGB-model. Hetzelfde geldt voor violet, paars, fuchsia, magenta, roze en roze. Maar kunt u zich herinneren de dezelfde hoeveelheid cyaan tinten? Emerald? Err... hemelsblauwe?... Een beetje vals spelen met rood in uw willekeurige algoritme kan dus volkomen o.k. Als u weet wat u doet.
Laten we proberen een echte willekeurige die niet het voordeel van een enkele kleurkanaal. Voor dit liever ik met een kleine matrix van bytes en een teller die heeft verhoogd telkens wanneer de functie wordt uitgevoerd:
byte color[3];byte count, a0, a1, a2; color[count]=random(256); a0=count+random(1)+1; color[a0%3]=random(256-color[count]); color[(a0+1)%3]=255-color[a0%3]-color[count]; setRGBpoint(LED, color[0], color[1], color[2]); count+=random(15); // to avoid repeating patterns count%=3;
It's ok, maar deze drie randoms zijn niet verzadigd genoeg omdat we drie kanalen met sommige waarden vullen. Als we mooie diepe kleuren willen moet vullen we slechts twee van hen, het verlaten van de laatstgenoemde op nul. Dit algoritme zal dergelijke kleuren produceren (in feite het volledig overeenstemt met de 'macht-bewuste' HSV model geven ons duidelijk tinten op 100% verzadiging):
color[count]=random(256);a0=random(1); a1=((!a0)+count+1)%3; a0=(count+a0+1)%3; color[a0]=255-color[count]; color[a1]=0; setRGBpoint(LED, color[0], color[1], color[2]); count+=random(15); // to avoid repeating patterns count%=3;
Hoe zit het met de opzoektabel van de sinus we zojuist heeft gedaan? Het kan ook worden gebruikt, en het produceert zelfs dieper en helderder kleuren, een beetje meer verschoven naar basis rood, groen en blauw:
a0=random(240);color[count]=lights[a0]; a1=random(1); a2=((!a1)+count+1)%3; a1=(count+a1+1)%3; color[a1]=lights[(a0+100)%240]; color[a2]=0; setRGBpoint(4, color[0], color[1], color[2]); count++; count%=3;
Dit zijn slechts enkele voorbeelden, test hen uit te vinden welke u het beste uitkomt. Er zijn vele manieren om willekeurige kleuren, en het is een goed idee om ze te mixen voor betere resultaten.