Chasse Neige

De Centre de Ressources Numériques - Labomedia
Révision de 6 février 2015 à 02:04 par Olivier (discussion | contributions)

(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher
Chasse Neige
Chasse-neige-processing.png


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


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;
  }
}