Chasse Neige
De Centre de Ressources Numériques - Labomedia
Chasse Neige |
---|
Pour modifier la page utiliser l'onglet Modifier avec formulaire.
Résumé | Sketch Processing qui chasse la neige. |
---|---|
Auteur(s) | 01ivier |
Licence | CC-BY-SA 3 |
Date de création | 31 janvier 2015 |
Sommaire
Intentions / Contexte
En vue de réécrire un filtre vidéo vue il y a quelques années dans un coin du Web, je me suis penché sur un traitement simple des collisions entre deux cercles.
Principe de fonctionnement
Des cercles blancs se déplacent de 1px vers le bas à chaque image, et se décalent de 1px vers la droite ou vers la gauche si la la distance entre leur centre et celui d'un cercle rouge est plus grande que la somme des deux rayon blanc-rouge.
Besoins / Compétences
Processing.
Documentation
Le rendu
Le code
PVector vitesse;
ArrayList<Balle> mesBalles;
ChasseNeige[] armada;
void setup() {
size(640, 360);
frameRate(120);
noStroke();
// crée les 7 bouges rouges
armada = new ChasseNeige[7];
for (int i = 0; i < armada.length; i++) {
armada[i] = new ChasseNeige(i);
}
// définie le vecteur de déplacement des boules blanches
vitesse = new PVector(0, 1);
// crée la liste dynamique qui contiendra les boules blanches
mesBalles = new ArrayList<Balle>();
}
void draw() {
background(0);
// dessine les 7 boules rouges
for (int i = 0; i < armada.length; i++) {
armada[i].dessine();
}
// ajoute trois boules blanches à chaque frame
mesBalles.add(new Balle());
mesBalles.add(new Balle());
mesBalles.add(new Balle());
// dessine les boules blanches
// et les supprime si elles sortent du cadre par le bas
for (int i = mesBalles.size ()-1; i >= 0; i--) {
Balle element = mesBalles.get(i);
if (element.centre.y > height+element.rayon) mesBalles.remove(i);
element.dessine();
}
}
// classe qui définit les boules blanches
class Balle {
PVector centre;
int diametre, rayon;
Balle() {
diametre = int(random(20))+10;
rayon = diametre/2;
centre = new PVector(int(random(width)), -diametre);
}
void dessine() {
fill(255);
ellipse(centre.x, centre.y, diametre, diametre);
// fait descendre les boules blanches vers le bas
centre.add(vitesse);
// teste la distance avec toutes les boules rouges
for (int i = 0; i < armada.length; i++) {
// si cette distance est plus petite que la somme des rayons blanc et rouge
if (centre.dist(armada[i].centre) < rayon+armada[i].rayon) {
// si le centre de la boule blanche
// est à droite du centre de la boule rouge
// alors on décale la boule blanche de 1px vers la droite
if (centre.x >= armada[i].centre.x) centre.x++;
// si le centre de la boule blanche
// est à gauche du centre de la boule rouge
// alors on décale la boule blanche de 1px vers la gauche
else if (centre.x < armada[i].centre.x) centre.x--;
}
}
}
}
// Classe qui définit les boules rouges
class ChasseNeige {
PVector centre;
int diametre, rayon, decalage, posInit;
ChasseNeige(int num) {
diametre = 50;
rayon = diametre/2;
posInit = width/2;
;
centre = new PVector(posInit, num*60);
decalage = num * 10;
}
void dessine() {
fill(255, 0, 0);
ellipse(centre.x, centre.y, diametre, diametre);
// les boules rouges sont déssinées suivant la fonction cosinus
// les ajustements sont empiriques concernant la vitesse et l'amplitude
centre.x = posInit + cos(radians(frameCount/4+decalage))*200;
}
}