Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2016-10-02 01:39:30 Sketchs semblables mais résultats différents... Please, help

AcousticQuantum
membre
Date d'inscription: 2014-11-25
Messages: 33

Sketchs semblables mais résultats différents... Please, help



Bonjour,

Voici 2 sketchs annotés réalisés par mes soins sur Processing 2.2.1 ... Il s'agit de l'évolution d'un petit projet en cours. Le premier sketch (WaveField1) affiche une onde "élégante", mais est incomplet car je ne peux créer plusieurs ondes simultanément. Je tente donc actuellement d'y remédier dans le second sketch (WaveField2) via la création d'une classe. Ce sketch est toujours en cours de "développement" mais il y a un problème dont je ne parviens pas à cibler l'origine et que je ne parviens donc pas à comprendre: avec des valeurs identiques et un code à peine modifier, les résultats obtenus sont vraiment différents!!!

Quelqu'un autait-il une idée de ce qui se passe?

Merci d'avance big_smile

AQ


WaveField1:


ArrayList<PointField> points;    // liste des points
PVector posMouse;   // position de la souris lors du clique

int step = 20;      // espace entre chaque points;
int vit = 3;        // vitesse de propagation des vagues
float freq = 8;     // frequence d'ondulation des vagues
int ampli = 80;     // amplitude des vagues
float ratio = 0.9;  // perte d'énergie des vagues

int time;  // compteur

void setup(){
 
  size(800, 600, P3D);
  stroke(255);
 
  points = new ArrayList<PointField>();
  posMouse = new PVector(width/2, height/2);
 
  for(int j = step/2; j < height; j += step){
    for(int i = step/2; i < width; i += step){
      PointField p = new PointField(i, j);      // création des points
      points.add(p);    // on ajoute les points dans la liste
    }
  }
}

void draw(){
 
  background(0);

  for(int i = 1; i < points.size(); i++){
   
    PVector posPoint = new PVector(points.get(i).x, points.get(i).y, points.get(i).z);
    float dist = posMouse.dist(posPoint);    // distance entre le centre de da vague et les points
   
    if(dist < time){          // si distance < rayon de la vague
      points.get(i).move();   // alors le point rentre en movement
    }
   
    if(points.get(i).y == points.get(i-1).y){    // si les points sont sur la même ligne horizontale
      line(points.get(i).x, points.get(i).y, points.get(i).z, points.get(i-1).x, points.get(i-1).y, points.get(i-1).z);    // alors on dessine le trait
    }
  }
  time += vit;
}

void mousePressed(){
 
  posMouse.x = mouseX;
  posMouse.y = mouseY;
  time = 0;
  for(int i = 1; i < points.size(); i++){
    points.get(i).arret();
  }
}


class PointField{
 
  int x;
  int y;
  float z;
  int chrono;
 
  PointField(int _x, int _y){
   
    x = _x;
    y = _y;
  }
 
  void move(){
   
    float atenu = pow(ratio, chrono) * ampli;
    z = atenu * sin(radians(chrono * freq));
    chrono ++;
  }
 
  void arret(){
    chrono = 0;
  }
 
}




WaveField2:


ArrayList<PointField> points;    // liste des points
ArrayList<Wave> waves;    // liste des vagues

int step = 20;      // espace entre chaque points;
int vit = 3;        // vitesse de propagation des vagues
float freq = 8;     // frequence d'ondulation des vagues
int ampli = 80;     // amplitude des vagues
float ratio = 0.9;  // perte d'énergie des vagues

void setup(){
 
  size(800, 600, P3D);
  stroke(255);
 
  points = new ArrayList<PointField>();
  waves = new ArrayList<Wave>();
 
  for(int j = step/2; j < height; j += step){
    for(int i = step/2; i < width; i += step){
      PointField p = new PointField(i, j);      // création des points
      points.add(p);    // on ajoute les points dans la liste
    }
  }
 
}

void draw(){

  background(0);
 
  for(int i = 1; i < points.size(); i++){
    for(int j = 0; j < waves.size(); j++){
     
      PVector posPoint = new PVector(points.get(i).x, points.get(i).y, points.get(i).z);
      PVector posWave = new PVector(waves.get(j).x, waves.get(j).y);
      float dist = posPoint.dist(posWave);    // distance entre le centre de da vague et les points
     
      if(dist < waves.get(j).ray){               // si distance < rayon de la vague
        points.get(i).move();                    // alors le point rentre en movement
      }
    }
   
    if(points.get(i).y == points.get(i-1).y){                                                                            // si les points sont sur la même ligne horizontale
      stroke(255);
      line(points.get(i).x, points.get(i).y, points.get(i).z, points.get(i-1).x, points.get(i-1).y, points.get(i-1).z);  // alors on dessine le trait
    }
    //points.get(i).show();  // affichage des points
  }
 
  for(int k = 0; k < waves.size(); k++){
    waves.get(k).ray ++;    // on augmente le rayon de chaque vague
    //waves.get(k).show();  // affiche les ondes
  }
}

void mousePressed(){
 
  Wave w = new Wave(mouseX, mouseY);    // création d'une vague
  waves.add(w);    // on ajoute la vague à la liste
}


class PointField{
 
  int x;
  int y;
  float z;
  int time;
 
  PointField(int _x, int _y){
   
    x = _x;
    y = _y;
  }
 
  void move(){
   
    float atenu = pow(ratio, time) * ampli;
    z = atenu * sin(radians(time * freq));
    time ++;
  }
 
  /*void show(){
   
    fill(255);
    pushMatrix();
    translate(x, y, z);
    ellipse(0, 0, 5, 5);
    popMatrix();
  }*/
 
}


class Wave{
 
  int x;
  int y;
  int ray;
 
  Wave(int _x, int _y){
   
    x = _x;
    y = _y;
  }
 
  void show(){
   
    noStroke();
    fill(255, 0, 0, 31);
    ellipse(x, y, 2*ray, 2*ray);
  }
 
}

Dernière modification par AcousticQuantum (2016-10-02 02:02:07)

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024