 /***************************************************************************
 * 
 *                  NE PAS MODIFIER CETTE SECTION 
 *                  
 **************************************************************************/
import java.awt.*;
import Listes.*;

public class JeuChaos extends FenetreTortue
{ 
     
/***************************************************************************
 * 
 *                      SECTION MODIFIABLE 
 *                  
 **************************************************************************/
 
 
 
/********************** Parametres de l'interface ************************/

    public static int baseFenetre = 800; // Largeur de la fenêtre
    public static int hauteurFenetre = 600; // Hauteur de la fenêtre
    public static String titreFenetre = ""; // Titre de la fenêtre
    // Le texte
    public static boolean zoneTexte = false; // Indique si on désire ou non une zone de texte
    // Les boutons
     public static String[] nomsBoutonsLigne1 = {"Ajouter points", "Quitter"}; // Noms des boutons de la ligne 1
    public static String[] nomsBoutonsLigne2 = {}; // Noms des boutons de la ligne 2
    // Les menus
    public static String[] nomsMenus1 = {}; // Exemple: private static String[] nomsMenus1 = {"nomMenu", "nomItem_1", ...};
    public static String[] nomsMenus2 = {}; // Laissez vide si vous ne désirez pas de menu
    public static String[] nomsMenus3 = {};
    public static String[] nomsMenus4 = {};
    public static String[] nomsMenus5 = {};
    public static String[] nomsMenus6 = {};
    public static String[] nomsMenus7 = {};
    public static String[] nomsMenus8 = {};
    
    public static void ajoutDeGlissieres(){
        ajouterGlissiereLigne1("Nombre de points", 0,10000,5,0);
        ajouterGlissiereLigne1("Coefficient", 0,1,0.5,2);
        ajouterGlissiereLigne2("Nombre de sommets", 0,9,3,0);
        ajouterGlissiereLigne2("Rayon", 0,10,5,0);
    }

/****************** Initialisation *********************************/
   
    public void initialisation(){
        tracerPoints((int) valeurGlissiere(1), true);
    }
    
/****************** Placer vos procedures ici ****************************/

int nbSommets=3, sommetCourant = -1;
double [] sommetX = {-100,0,100,-100,0,100,-100,0,100};
double [] sommetY = {100,100,100,0,0,0,-100,-100,-100};
Color[] couleurs = {bleu, rouge, vert, magenta, cyan, orange, rose, noir, jaune};
double pointX = 0, pointY = 0, pointX0 = 0, pointY0 = 0, gamma;

public void tracerSommets() {
    double rayon = valeurGlissiere(4);
    if (rayon != 0) {
    for(int i=0;i<nbSommets;i++) {
        couleurCrayon(noir);
        couleurRemplissage(couleurs[i]);
        disque(sommetX[i],sommetY[i],rayon);
    };}
}

public void tracerPoints(int nbPoints, boolean effacer) {
    int noSommet; double exPointX,exPointY;
    nbSommets = (int) valeurGlissiere(3);
    gamma = valeurGlissiere(2);
    if (effacer) {videGraphique(); pointX = pointX0; pointY = pointY0;}
    for(int i=0;i<nbPoints;i++) {
        noSommet = hasard(0,nbSommets-1);
        if (nbPoints < 101) {
            exPointX=pointX; exPointY=pointY; 
            pointX = pointX + gamma*(sommetX[noSommet]-pointX);
            pointY = pointY + gamma*(sommetY[noSommet]-pointY);
            couleurRemplissage(couleurs[noSommet]);disque(pointX,pointY,valeurGlissiere(4)*2/3);
            couleurCrayon(gris); segment(exPointX,exPointY,pointX,pointY);
        } else { 
            pointX = pointX + gamma*(sommetX[noSommet]-pointX);
            pointY = pointY + gamma*(sommetY[noSommet]-pointY);
            couleurCrayon(couleurs[noSommet]);
            segment(pointX,pointY,pointX,pointY);}
    }
    tracerSommets();
}

public void deplacerSommet(double x, double y){
    sommetX[sommetCourant]=x;
    sommetY[sommetCourant]=y;
    tracerPoints((int) valeurGlissiere(1), true);
}

public int trouverSommet(double x, double y) { 
    double rayonCarre = valeurGlissiere(4)*valeurGlissiere(4);
    for(int i=0;i<nbSommets;i++) {
        if(distanceAuCarre(x,y,sommetX[i],sommetY[i])<=rayonCarre) {return (i);}
    }
    return (-1);
}

public double distanceAuCarre(double x, double y, double u, double v) {
    return (x-u)*(x-u)+(y-v)*(y-v);
}




/**************  Les actions des boutons  ************************************/

public void actionBouton1(){ 
    tracerPoints(10 * (int) valeurGlissiere(1), false); 
} 

public void actionBouton2(){
    quitter();
}

/**************  Les actions des menus  ****************************/
public void actionMenu1Item1(){    
} 

public void actionMenu1Item2(){    
}

// etc..
/*************** Les actions des glissieres *********************************/  

public void actionGlissiere1(double d){
    //tracerPoints((int) valeurGlissiere(1), false);
}

public void actionGlissiere2(double d){
    tracerPoints((int) valeurGlissiere(1), true);
}
public void actionGlissiere3(double d){
    nbSommets = (int) valeurGlissiere(3);
    tracerPoints((int) valeurGlissiere(1), true);
}
public void actionGlissiere4(double d){
    tracerPoints((int) valeurGlissiere(1), true);
}

// etc..
/**************** Les actions de la souris *******************************/
    
    public void clicSouris(double x, double y){
        pointX0=x; pointY0=y;
        tracerPoints((int) valeurGlissiere(1), true);     
    }
    
    public void debutGlisser(double x, double y){
        sommetCourant = trouverSommet(x,y);
        if (sommetCourant != -1) {deplacerSommet(x,y);}
    }
    
    public void finGlisser(double x, double y){
        if (sommetCourant != -1) {deplacerSommet(x,y);}
        sommetCourant = -1;
    }
    
    public void glisserEnCours(double x, double y){
        if (sommetCourant != -1) {deplacerSommet(x,y);}
    }
    
    
/********************* Changement de taille de la fenetre *******************/ 
    public void actionTailleChange(){
    }
/***************************************************************************
 * 
 *                  NE PAS MODIFIER CETTE SECTION 
 *                  
 **************************************************************************/    
     
    public static String[][] Menus = {nomsMenus1, nomsMenus2, nomsMenus3, nomsMenus4, nomsMenus5, nomsMenus6, nomsMenus7, nomsMenus8};    
    
    public JeuChaos(int l, int h, String titre, String[] nomsBoutons1, String[] nomsBoutons2, String[][] Menus, boolean avecTexte){
        super(l, h, titre, nomsBoutons1, nomsBoutons2, Menus, avecTexte);
    }
    
    public JeuChaos() {
        this(baseFenetre, hauteurFenetre, titreFenetre, nomsBoutonsLigne1, nomsBoutonsLigne2, Menus, zoneTexte);
    }
    
    public static void executer(boolean applet){
        initGlissieres();
        ajoutDeGlissieres();
        JeuChaos maFenetre = new JeuChaos();
        faireApplet(applet);
        maFenetre.toFront();
        maFenetre.initialisation();
    }
    
    public static void main(String[] args){
        javax.swing.SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                executer(false);
            }
        });
    }

     
}  
