Good morning everyone.
It is the first time I come in this place. Also, because my mother tongue is not english, I will try to explain my problem as clearly as possible.
I have difficulties to understand how the G4P button is working. My program has a loop "for" which create a curve. Now, I must create a button using the G4P library which change the formula of my curve, as soon as the user click on it. I am thinking about using a if(condition){}, like :
if(button == Clicked){
formula1;
}else{
formula2;
}
Something like that... But it does not work and I have no idea how to call the button into my "if condition". Is that clear ?
Here is my code, I let you try it out :
// fdm_2016_trans-geometrique_tp2
// Exemple similaire sur Processing : https://processing.org/examples/sinewave.html
// possibilité de dessiner avec "line" ou "point"
import g4p_controls.*; // importation de la librarie g4p
GSlider sAmpli;
GSlider sPhase;
GSlider sFreq;
GButton sincos;
float temps; // (ou période) En pixel et non en sec. Combien de pixel avant que la vague se répète ?
float ampli; // hauteur de la "vague"
float w; // vitesse angulaire : détermine le nombre de cycles/période dans le temps
float phase; // dans lequel figurera l'angle
float x, y;
float xc, yc;
boolean b;
void setup(){
size(600, 400);
sAmpli = new GSlider(this, 120, 265, 200, 20, 12); // slider : emplacement, coord X, coord Y, taille X, taille Y, épaisseur
sAmpli.setLimits(50, 0, 100); // plage de valeur : valeur par défaut, minimum, maximum
sAmpli.addEventHandler(this, "slider_change"); // écouteur d’événement : emplacement, fonction
sPhase = new GSlider(this, 120, 305, 200, 20, 12); // slider : emplacement, coord X, coord Y, taille X, taille Y, épaisseur
sPhase.setLimits(0, 0, 360); // plage de valeur : valeur par défaut, minimum, maximum
sPhase.addEventHandler(this, "slider_change"); // écouteur d’événement : emplacement, fonction
sFreq = new GSlider(this, 120, 345, 200, 20, 12); // slider : emplacement, coord X, coord Y, taille X, taille Y, épaisseur
sFreq.setLimits(width/2, 0, width); // plage de valeur : valeur par défaut, minimum, maximum
sFreq.addEventHandler(this, "slider_change"); // écouteur d’événement : emplacement, fonction
}
void draw(){
background(240);
strokeWeight(1);
line(0, 100, width, 100);
temps = sFreq.getValueI(); // fréquence
ampli = sAmpli.getValueI();
w = (2*(PI))/temps;
phase = (radians(sPhase.getValueI()));
x = 0; // incrémentation
y = 0; // formule
yc = 0;
for(x = 0 ; x <= width ; x++){
y = ampli*sin(w*x+phase); // a*sin(w.t+ph);
yc = ampli*cos(w*x+phase); // a*cos(w.t+ph);
// point(x, y);
stroke(0, 0, 0);
ellipse(x, 100+y, 1, 1); // utilisation de l'ellipse pour gérer la position Y de la courbe
stroke(255, 0, 0);
ellipse(x, 100+yc, 1, 1); // utilisation de l'ellipse pour gérer la position Y de la courbe
}
// Ligne de séparation
stroke(0);
strokeWeight(4);
line(0, height/2, width, height/2);
// Texte Commande + Formule
fill(0);
textSize(16);
text("Commandes", 40, height/2 + 40);
text("Formule : y(t) = a.sin(w.t+ph)", width/2 + 40, height/2 + 40);
// Texte Slider
textSize(12); // taille du texte
text("Amplitude", 40, 279); // text("valeur", coord X, coord Y);
text("Phase", 40, 319); // text("valeur", coord X, coord Y);
text("Fréquence", 40, 359); // text("valeur", coord X, coord Y);
// Texte valeur slider
text(sAmpli.getValueI()+"px", 335, 279);
text(sPhase.getValueI()+"°", 335, 319);
text(sFreq.getValueI()+"px", 335, 359);
sincos = new GButton(this, 440, 300, 90, 30, "Sin / Cos"); // slider : emplacement, coord X, coord Y, taille X, taille Y, épaisseur
sincos.addEventHandler(this, "button_change");
}
void mouseClicked(){
}
public void slider_change(GSlider s, GEvent e) {
// les paramètres présent ici changeront lorsque les valeurs du slider sont modifiées
// GSlider s lit les données de tous les sliders présent dans le code
}
public void button_change(GButton b, GEvent e) {
}
Important : I tried the following code... but the change is only temporary. It only last when the user click on the button.
public void button_change(GButton b, GEvent e) {
// les paramètres présent ici changeront lorsque le bouton est appelé
if(b == sincos && e == GEvent.CLICKED){
for(x = 0 ; x <= width ; x++){
yc = ampli*cos(w*x+phase); // a*cos(w.t+ph);
// point(x, y);
stroke(0, 0, 0);
ellipse(x, 100+yc, 1, 1); // utilisation de l'ellipse pour gérer la position Y de la courbe
}
}else{
for(x = 0 ; x <= width ; x++){
y = ampli*sin(w*x+phase); // a*sin(w.t+ph);
// point(x, y);
stroke(0, 0, 0);
ellipse(x, 100+y, 1, 1); // utilisation de l'ellipse pour gérer la position Y de la courbe
}
}
}