 /***************************************************************************
 * 
 *                  NE PAS MODIFIER CETTE SECTION 
 *                  
 **************************************************************************/
import java.awt.*;
import Listes.*;

public class SegmentPixels extends FenetreTortue
{ 
     
/***************************************************************************
 * 
 *                      SECTION MODIFIABLE 
 *                  
 **************************************************************************/
 
    boolean montrerGrilleP=true, segmentBlancP=false, choixArrondisP = false;
    int choixArrondis = 0, pointDeplace = 0;
    static int depart = 10;
    int Px=1, Py=1, Qx=depart, Qy=depart;
    double origineX, origineY, delta;
 
/********************** Parametres de l'interface ************************/

    public static int baseFenetre = 620; // Largeur de la fenêtre
    public static int hauteurFenetre = 700; // Hauteur de la fenêtre
    public static String titreFenetre = "Segment de pixels"; // 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 = {"Cacher la grille", "Montrer le segment rouge", unicode("Autre possibilit#eaig"), "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("Nb de colonnes",4,400,depart,0);
        ajouterGlissiereLigne1("Nb de lignes",4,400,depart,0);
    }

/****************** Initialisation *********************************/
    
    public void initialisation(){
        dessinerSituation();
    }
    
/****************** Placer vos procedures ici ****************************/

    
    public void repositionnerPointsGlissiere() {
        int m = valEnt(valeurGlissiere(1));
        int n = valEnt(valeurGlissiere(2));
        Px = max(1,min(m,Px));
        Py = max(1,min(n,Py));
        Qx = max(1,min(m,Qx));
        Qy = max(1,min(n,Qy));
        dessinerSituation();
    }
    
    public void dessinerSituation() {
        choixArrondisP = false; 
        int m = valEnt(valeurGlissiere(1));
        int n = valEnt(valeurGlissiere(2));
        videGraphique();
        centreTortue();
        delta = min((largeurZoneGraphique() - 20)/m, (hauteurZoneGraphique() - 20)/n);
        origineX = -delta*m/2.0;
        origineY = -delta*n/2.0;
        if (montrerGrilleP) {dessinerGrille(m,n);};
        dessinerSegment();
        if (choixArrondisP) {activerBouton(3);} else {desactiverBouton(3);}
    }
    
    public void dessinerGrille(int m, int n) {
        for (int k=0;k<=m;k++) {
            segment(origineX+k*delta, origineY, origineX+k*delta, origineY+n*delta);
        }
        for (int k=0;k<=n;k++) {
            segment(origineX, origineY+k*delta, origineX+m*delta, origineY+k*delta);
        }
    }
    
    public void dessinerSegment() {
        double m; double b;
        if ((Px==Qx) && (Py==Qy)) {pixel(Px,Py,rouge); return;}
        if (abs(Px-Qx)>abs(Py-Qy)) {
            m = valDec(Py-Qy)/(Px-Qx);
            b = Py-m*Px;
            for (int i=min(Px,Qx)+1;i<=max(Px,Qx)-1;i++) {pixel(i,m*i+b,noir);}
        } else {
            m = valDec(Px-Qx)/(Py-Qy);
            b = Px - m*Py;
            for (int i=min(Py,Qy)+1;i<=max(Py,Qy)-1;i++) {pixel(m*i+b,i,noir);}
        }
        pixel(Px,Py,vert);
        pixel(Qx,Qy,bleu);
        if (segmentBlancP) {
            cc(rouge); // tc(3);
            segment(origineX+Px*delta-delta/2, origineY+Py*delta-delta/2,origineX+Qx*delta-delta/2, origineY+Qy*delta-delta/2);
        }
    }
    
    public void pixel(double a, double b, Color c) {
        couleurRemplissage(c);
        a = arrondisSpecial(a);
        b = arrondisSpecial(b);
        rectanglePlein(origineX+(a-1)*delta, origineY+(b-1)*delta, origineX+a*delta, origineY+b*delta);
    }
    
    public double valDec(int u) {return((double) u);}
    
    public int arrondisSpecial(double u) {
        if (abs(u+0.5 - arrondis(u+0.5)) < 0.000000001) 
        {couleurRemplissage(gris); choixArrondisP = true; return(plancher(u)+choixArrondis);} 
        else {return arrondis(u);}
    }
    
/**************  Les actions des boutons  ************************************/

public void actionBouton1(){ 
    montrerGrilleP = ! montrerGrilleP;
    if (montrerGrilleP) {changerNomBouton(1, "Cacher la grille");} else {changerNomBouton(1, "Montrer la grille");}
    dessinerSituation();
}

public void actionBouton2(){ 
    segmentBlancP = ! segmentBlancP;
    if (segmentBlancP) {changerNomBouton(2, "Cacher le segment rouge");} else {changerNomBouton(2, "Montrer le segment rouge");}
    dessinerSituation();
} 

public void actionBouton3(){ 
    choixArrondis = 1 - choixArrondis;
    dessinerSituation();
}

public void actionBouton4(){
    quitter();
}

// etc..
/**************  Les actions des menus  ****************************/
public void actionMenu1Item1(){    
} 

public void actionMenu1Item2(){    
}

// etc..
/*************** Les actions des glissieres *********************************/  

public void actionGlissiere1(double d){
    repositionnerPointsGlissiere();
}
public void actionGlissiere2(double d){
    repositionnerPointsGlissiere();
}

/**************** Les actions de la souris *******************************/
    
    public void clicSouris(double x, double y){
        
    }
    
    public void debutGlisser(double x, double y){
        identifierPoint(x,y);
    }
    
    public void finGlisser(double x, double y){
        deplacerPoint(x,y);
    }
    
    public void glisserEnCours(double x, double y){
        deplacerPoint(x,y);
    }
    public void identifierPoint(double x, double y) {
        pointDeplace = 0;
        int u = 1+plancher((x - origineX)/delta);
        int v = 1+plancher((y - origineY)/delta);
        if ((u==Px) && (v==Py)) {pointDeplace = 1;}
        if ((u==Qx) && (v==Qy)) {pointDeplace = 2;}
        if (pointDeplace == 0) {identifierPointAlt(x,y);}
    }
    
    public void identifierPointAlt(double x, double y) {
        //pointDeplace = 0;
        double eps = 5;
        if (abs(x-positionX(Px))<eps && abs(y-positionY(Py))<eps) {pointDeplace = 1;}
        if (abs(x-positionX(Qx))<eps && abs(y-positionY(Qy))<eps) {pointDeplace = 2;}
    }
    
    
    public double positionX(int a) {
        return origineX + delta*(a-0.5);
    }
    
    public double positionY(int b) {
        return origineY + delta*(b-0.5);
    }
    
    public void deplacerPoint(double x, double y) {
        if (pointDeplace == 0) {return;}
        int m = valEnt(valeurGlissiere(1));
        int n = valEnt(valeurGlissiere(2));
        int u = max(1, min(m,1+plancher((x - origineX)/delta)));
        int v = max(1, min(n,1+plancher((y - origineY)/delta)));
        if (pointDeplace == 1) {Px = u; Py = v;}
        if (pointDeplace == 2) {Qx = u; Qy = v;}
        dessinerSituation();
    }
    
/********************* Changement de taille de la fenetre *******************/ 
    public void actionTailleChange(){
           dessinerSituation();
    }
/***************************************************************************
 * 
 *                  NE PAS MODIFIER CETTE SECTION 
 *                  
 **************************************************************************/    
     
    public static String[][] Menus = {nomsMenus1, nomsMenus2, nomsMenus3, nomsMenus4, nomsMenus5, nomsMenus6, nomsMenus7, nomsMenus8};    
    
    public SegmentPixels(int l, int h, String titre, String[] nomsBoutons1, String[] nomsBoutons2, String[][] Menus, boolean avecTexte){
        super(l, h, titre, nomsBoutons1, nomsBoutons2, Menus, avecTexte);
    }
    
    public SegmentPixels() {
        this(baseFenetre, hauteurFenetre, titreFenetre, nomsBoutonsLigne1, nomsBoutonsLigne2, Menus, zoneTexte);
    }
    
    public static void executer(boolean applet){
        initGlissieres();
        ajoutDeGlissieres();
        SegmentPixels maFenetre = new SegmentPixels();
        faireApplet(applet);
        maFenetre.toFront();
        maFenetre.initialisation();
    }
    
    public static void main(String[] args){
        javax.swing.SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                executer(false);
            }
        });
    }

     
}  
