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
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
Pages: 1