2015-12-04 1 views
1

J'ai créé un bruit blanc, que je voudrais diminuer avec le temps (changement commençant après 2 sec, intensifiant après 10 sec etc.), tendant lentement vers un écran noir. Qu'est-ce que je ne peux pas comprendre, comment puis-je faire seulement quelques pixels aléatoires (disons, 50% de tous les pixels) changer de couleur, tandis que le reste est juste noir, dans la même image? Jusqu'ici, je ne pouvais faire que tous changer aléatoirement, ou tous rester noirs. Toute aide serait très appréciée, merci !!Traitement: Faire seulement quelques pixels aléatoires changer de couleur

void setup() { 
    size(1000, 800); 
} 

void draw() { 
    if (millis() < 2000) { 
    loadPixels(); 
    for (int i=0; i<pixels.length; i++) 
     pixels[i] = color(random(255)); 
    updatePixels(); 
    } 

    if (millis() > 2000) { 
    loadPixels(); 
    if (random(1) >= 0.5) { 
     for (int i=0; i<pixels.length; i++) 
     pixels[i] = color(random(255)); 
     updatePixels(); 
    } else { 
     loadPixels(); 
     for (int i=0; i<pixels.length; i++) 
     pixels[i] = color(0); 
     updatePixels(); 
    } 
    } 

    if (millis() > 10000) { 
    loadPixels(); 
    for (int i=0; i<pixels.length; i++) 
     pixels[i] = color(random(255)); 
    updatePixels(); 
    } 
} 

Répondre

1

Une manière simple serait de prendre en compte que random() renvoie une valeur aléatoire dans une plage. Si vous lui donnez une valeur faible, vous aurez une valeur aléatoire faible. Si vous utilisez cette valeur comme couleur, plus la valeur est basse, plus vous êtes proche du noir, ce qui pourrait bien fonctionner dans votre cas.

Si vous avez un caractère aléatoire à 255, vous augmentez les changements de ayant des pixels lumineux, sinon (avec de faibles valeurs aléatoires), les pixels seront sombres:

//noise image 
PImage noise; 
//amount of noise image image 0 = 0%, 255 = 100% 
int noiseAmt = 255; 

void setup(){ 
    noise = createImage(width,height,RGB); 
} 
void draw(){ 
    //decrease noise over time 
    noiseAmt--; 
    if(noiseAmt < 0) noiseAmt = 255; 

    //apply noise based on noise amount 
    noiseImage(); 
    //render image 
    image(noise,0,0); 
} 

void noiseImage(){ 
    int numPixels = noise.pixels.length; 
    for(int i = 0 ; i < numPixels; i++){ 
    //random(noiseAmt) is the key - low values = darker pixels 
    noise.pixels[i] = color(random(noiseAmt)); 
    } 
    noise.updatePixels(); 
} 

Pour obtenir un coup de cela, voici un version légèrement modifiée du code qui utilise les touches fléchées UP/DOWN pour contrôler le bruit:

//noise image 
PImage noise; 
//amount of noise image image 0 = 0%, 255 = 100% 
int noiseAmt = 127; 

void setup() { 
    noise = createImage(width, height, RGB); 
} 
void draw() { 
    //apply noise based on noise amount 
    noiseImage(); 
    //render image 
    image(noise, 0, 0); 
} 

void noiseImage() { 
    int numPixels = noise.pixels.length; 
    for (int i = 0; i < numPixels; i++) { 
    //random(noiseAmt) is the key - low values = darker pixels 
    noise.pixels[i] = color(random(noiseAmt)); 
    } 
    noise.updatePixels(); 
} 
void keyPressed(){ 
    if(keyCode == UP) noiseAmt += 5; 
    if(keyCode == DOWN) noiseAmt -= 5; 
    noiseAmt = constrain(noiseAmt,0,255); 
    println("noiseAmt: " + noiseAmt); 
} 

Retour à la question de temps, vous pouvez jeter un oeil this answer qui couvre le suivi du temps en utilisant millis(). La seule partie supplémentaire est la cartographie du temps de fondu à la quantité de bruit, ce qui serait un certain ratio. Cela pourrait être plus facile si nous cartographions le temps passé en tant que valeur normalisée (de 0.0 à 1.0) qui peut facilement passer de 0.0 à 255.0 simplement en multipliant par 255:

//noise image 
PImage noise; 
//amount of noise image image 0 = 0%, 255 = 100% 
int noiseAmt = 255; 

int timestamp,fadeTime = 10000;//fade to black in 10s 

void setup(){ 
    noise = createImage(width,height,RGB); 
    timestamp = millis(); 
} 
void draw(){ 
    //decrease noise over time 
    int now = millis(); 
    //if the difference between an initial timestamp and the current time is less than 10s 
    if(now - timestamp <= fadeTime){ 
    //compute the ratio between the time difference and total fadeTime which will be from 0.0 to 1.0 
    //subtract this difference from 1.0 to flip the ratio direction from 0.0 -> 1.0 to 1.0 -> 0.0 
    float fadeRatio = 1.0 - ((float)(now-timestamp)/fadeTime); 
    //this ratio multiplied to 255 will be 
    noiseAmt = (int)(fadeRatio * 255); 
    } 

    //apply noise based on noise amount 
    noiseImage(); 
    //render image 
    image(noise,0,0); 
} 

void noiseImage(){ 
    int numPixels = noise.pixels.length; 
    for(int i = 0 ; i < numPixels; i++){ 
    //random(noiseAmt) is the key - low values = darker pixels 
    noise.pixels[i] = color(random(noiseAmt)); 
    } 
    noise.updatePixels(); 
} 

traitement a des fonctions très pratiques pour faire face aux mapping et constraining nombre varie:

//noise image 
PImage noise; 
//amount of noise image image 0 = 0%, 255 = 100% 
int noiseAmt = 255; 
int timestamp,fadeTime = 10000;//fade to black in 10s 

void setup(){ 
    noise = createImage(width,height,RGB); 
    timestamp = millis(); 
} 
void draw(){ 
    //decrease noise over time 
    int now = millis(); 
    //if the difference between an initial timestamp and the current time is less than 10s 
    noiseAmt = (int)map(now - timestamp,0,fadeTime,255,0); 
    noiseAmt = constrain(noiseAmt,0,255); 

    //apply noise based on noise amount 
    int numPixels = noise.pixels.length; 
    for(int i = 0 ; i < numPixels; i++){ 
    //random(noiseAmt) is the key - low values = darker pixels 
    noise.pixels[i] = color(random(noiseAmt)); 
    } 
    noise.updatePixels(); 

    //render image 
    image(noise,0,0); 
} 

Notez le fadeTime est réglé sur 10s (10000 millisecondes). N'hésitez pas à bricoler avec la valeur fadeTime.

+0

Merci beaucoup pour ça! Désolé de devoir continuer à demander - comment je ferais exactement ce processus, mais au cours d'un certain temps, en le reliant à la 'millis()' if-déclarations que j'ai mentionné ci-dessus? – elf

+0

Jetez un oeil à la réponse ci-dessus. C'est supposer que vous voulez fondre au fil du temps, par opposition à passer de 100% de bruit, à 50% après 2 secondes, puis soudainement à 0% après 10 secondes. –

+0

OUI, maintenant je l'ai. merci à @KevinWorkman! – elf

0

Au lieu d'afficher tous votre code dans un site Web externe, faire bouillir votre problème à un MCVE et l'inclure directement dans votre question.

Cela étant dit, vous avez deux options:

Option 1: stocker tous vos pixels dans une sorte de structure de données. Vous pouvez avoir un tableau 2D d'objets MyPixel, où MyPixel est une classe que vous créez et qui contient toutes les informations dont vous avez besoin pour savoir quelles instances de ce tableau doivent changer de couleur.

Option 2: Dessinez directement sur un PImage. Ensuite, vous pouvez itérer à travers ce PImage pour trouver un pixel non-noir et le changer.

L'approche que vous adoptez dépend entièrement de vous. Je choisirais personnellement la première option, mais c'est juste ma préférence personnelle. Essayez l'une de ces approches et publiez un MCVE lorsque vous êtes bloqué. Notez que ceci devrait être aussi peu de lignes que possible tout en démontrant le problème, pas votre croquis entier - nous n'avons pas besoin de voir votre logique de synchronisation, par exemple.

+0

Merci beaucoup! Désolé de l'erreur de débutant, le stress de l'échéance m'a fait un peu à courte vue. Je peux défo travailler avec ça! – elf