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 :D
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); } }
|