import java.awt.Graphics;
import java.awt.Color; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; 
import java.awt.BorderLayout; 
import javax.swing.BorderFactory; 
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.Dimension;
import javax.swing.JPanel;
import java.awt.Font; 
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;	// applet 
/*import javax.swing.*;*/
import java.awt.Dimension;


import java.awt.*;
import java.awt.event.*;  
import javax.swing.*;

//public class Fenetre extends JPanel {	//applet JFrame
public class Fenetre extends JFrame {
        static Panneau pan = new Panneau();
        static JLabel lpas = new JLabel();
 //       "<html>pas du traveling="+pan.pastravel+" , vers le haut ou vers la droite<br>montre les bassins d'attraction<br>C=0 <br>+ 0 i<br>Mandelbrot pour Zn+1=Zn*Zn+C en cours</html>");
   			static JLabel lvide = new JLabel("");
   			
        static JButton bmandel = new JButton("Mandelbrot");
        static JButton bjulia = new JButton("Julia");
        static JButton bmontre = new JButton("<html>Cacher C<br>et les axes</html>");
        static JButton bnextpointc = new JButton("<html>Point<br>suivant</html>");
        static JButton bprecpointc = new JButton("<html>Point<br>precedent</html>");
        static JButton bmemepointc = new JButton("<html>Meme<br>point<html>");
        static JButton btravelingh = new JButton("<html>Traveling<br>Julia<br>horizontal</html>");
        static JButton btravelingv = new JButton("<html>Traveling<br>Julia<br>vertical</html>");
        static JButton btravelingstop = new JButton("<html>Arret<br>Traveling<br>et cycles</html>");
        static JButton baccelere = new JButton("<html>Accelere<br>traveling</html>");
        static JButton bralenti = new JButton("<html>Ralenti<br>traveling</html>");
        static JButton binverse = new JButton("<html>inverse<br>traveling</html>");
        static JButton bunzoom = new JButton("<html>unZoom</html>"); 
        static JButton bnextfon = new JButton("<html>Autre<br>fonction<br></html>");
        static JButton bpointc = new JButton("<html>Définir le<br>point C<br></html>");
      //static JButton bstopdyna = new JButton("<html>Arret<br>Zoom</html>");	// il est dans pan
        static JButton bstartdyna = new JButton("<html>Zoom<br>dynamique</html>");
        static JButton battracteur = new JButton("<html>Points et<br>Bassins<br>d'attraction</html>");
        static JButton bperiode = new JButton("<html>Periodes<br>des cycles</html>");
        static JButton bcoloration = new JButton("<html>Coloration</html>");
        static JButton bhelp = new JButton("<html>Aide et<br>commentaires</html>");
				private Dimension dim = new Dimension(95, 60);	//95
				static JPanel menu = new JPanel();  
				static JPanel menugauche = new JPanel();
				Font police = new Font("Arial", Font.BOLD, 12);
				static String str=new String();
				Timer t;
				static double maxthecx; 
				static double maxthecy; 
				static double deltravy;
				static double deltravx; 
 
        static double x;  
        static double y;
        static double deltaX;
        static double deltaY;
        static double del;
       
public void affiche(String str,String str2)
{
JOptionPane.showMessageDialog
	    							(null, 
	     							str, 
	     							str2, 
	     							JOptionPane.INFORMATION_MESSAGE);
}
        
public void help()
{
int indexhelp=0;
String tabhelp[]={"Mandelbrot","Julia","zoom","traveling","points fixes","2-cycles","n-cycles","période","séquence de Farey","Rapport de Feigenbaum","disques de Siegel","frontière et Mizukiewicz","fonctions","coloration et profondeur","souris","nombres complexes","pourquoi Z2+C"};
	     							
String reponse="help";
while (reponse!= null) 
	{
	reponse = (String) JOptionPane.showInputDialog
	    							(null,
	     							"Choisir une rubrique de l'aide Mandelbrot et Julia",
	     							"Aide Mandelbrot et Julia- http://www.pdbzro.com/gags", 
	     							JOptionPane.QUESTION_MESSAGE,
	     							null, 
	     							tabhelp,
	     							tabhelp[indexhelp]);
	 for (int i=0;i<tabhelp.length;i++)	
	 		{ 
	 		if (reponse==tabhelp[i])
	 				{
	 				switch (i)
	 					{
	 					case 0:{str="L'ensemble de Mandelbrot est l'ensemble des points C du plan complexe tels que la suite Zn+1=Zn*Zn+C avec Z0=(0,0) ne diverge pas vers l'infini \nil est fermé : f(Z) et sa limite appartient à l'ensemble\nil est connexe, c'est à dire que tous ses points sont reliés\nil est symétrique par rapport à l'axe des x\nil est inclus dans le disque fermé centré en 0 de rayon 2.";break;}
	 					case 1:{str="L'ensemble de Julia est, pour un C donné, l'ensemble des points Z0 du plan complexe tels que la suite Zn+1=Zn*Zn+C ne diverge pas vers l'infini\nil est fermé, f(z) et sa limite appartient à l'ensemble\nil est symetrique par rapport à (0,0)\nil est connexe et contient (0,0) si et seulement si C est dans l'ensemble de Mandelbrot\nil est totalement non connexe et ne contient pas (0,0) si et seulement si C n'est pas dans l'ensemble de Mandelbrot\nquand il n'est pas connexe, c'est toujours un nuage de points, une \"poussière de Cantor\" (quand C est près de la frontière il semble y avoir des composants connexes, mais cela est du à l'imprécision des calculs)\nJulia(C) est le symétrique de l'ensemble Julia(conjug(C)) par rapport à l'axe des abcisses\nsi C est sur l'axe des x le Julia est symétrique par rapport à l'axe des x et par rapport à l'axe des y\nil est inclus dans le disque fermé centré en 0 de rayon max(2,|C|)\nPour C=0, Julia(0) est le disque fermé centré en 0 de rayon 1\nPour C=-2, Julia(-2) est le segment [-2,0]\nPour C dans la cardioïde c'est une patatoïde centrée en (0,0)\npour C dans les disques tangents c'est une forme ressemblant à un lapin\npour C dans les disques voisins de l'axe des x à gauche de la cardioïde, le lapin s'applatit et c'est une forme ressemblant à un avion";break;}
	 					case 2:{str="Le zoom (souris gauche) recentre sur le point choisit et effectue un aggrandissement\nle zoom dynamique (souris du milieu) recentre et effectue un agrandissement toutes les secondes\nzoomer dans l'ensemble de Mandelbrot définit le point C";break;}
	 					case 3:{str="Le traveling consiste à faire déplacer le point C verticalement ou horizontalement et à redessiner l'ensemble de Julia correspondant\nla vitesse du déplacement est reglable, il faut la choisir très petite lorsque le point C est au voisinage de la frontière du Mandelbrot\ncar c'est là que l'ensemble de Julia change rapidement de forme pour passer de connexe à non connexe\nPendant le traveling, on peut recentrer et zoomer à l'aide de souris gauche et de unZoom";break;}
	 					case 4:{str="Pour trouver les points fixes, il faut résoudre f(Z)=Z\ndonc Z*Z+C=Z\nsoit Z2-Z+C=0\nil y a deux solutions pour chaque Julia:\n (1±sqrt(1-4 C))/2\nla derivée en ces points fixes donne leur nature : attractif (si f'<1), répulsif (si f'>1) ou neutre (si f'=1)\nf'(z)=2*z\net on pose |f'(z)|=1 et f'(z)=exp(i t)\nsoit, au point fixe neutre, exp(i t)=1 ± sqrt(1- 4 C)\nd'où C=exp(i t)/2 ( 1 - cos t ) + 1/4\nc'est la cardioïde principale de l'ensemble de Mandelbrot\n\nsi et seulement si C  est dans la cardioïde les suites du Julia convergent vers un point fixe\nen suivant un pseudo cycle influencé par le cycle du ou des disques tangents les plus proches\ndans certains cas le Julia est un filament, c'est une \"dentrite\" qui ne contient pas de points intérieurs et qui n'a ni point fixe ni cycle, tout converge à l'infini";break;}
	 					case 5:{str="Pour trouver les 2-cycles il faut résoudre f(f(Z))=Z\ndonc (z2+C)2+c=z\nor les points fixes précédents sont forcement solution donc cela se transforme en (z2-z+C)*(z2+z+C+1)=0\n et z2+z+C+1=0\nd'où les deux points 2-cycle 1/2 ( -1 ± sqrt( -3 - 4C) )\n et la dérivée de module 1 = 4Z(Z2+C)=4(c+1)=exp(i t)\ndonc C = -1 + exp(i t)/4 : c'est le cercle de centre -1, de rayon 1/4 et tangent à la cardioïde en -3/4\n\nsi et seulement si le point C est dans le cercle principal tangent à la cardioïde les suites du Julia convergent vers un cycle à deux points";break;}
	 					case 6:{str="Pour trouver les n-cycles il faut résoudre fn(z)=z\nPour C dans un de ces disques, et selon la position de ce disque, les cycles passent d'une antenne à l'autre, dans un sens ou dans l'autre en sautant m antennes à chaque pas\nen ces points des cycles f(Zi)=Zi+1,  fn(Zi)=Zi, et les dérivées nièmes de fn(z) sont toutes égales à 2**n * z1 * z2 *... * zn\ndans tous les autres zones que l'on trouve en zoomant il apparait aussi des cycles\n\nPour visualiser les cycles, cliquer droit dans les Julia";break;}
	 					case 7:{str="Chaque attracteur absorbe un point critique, (solution de fn(0)=0) et centre d'un composant dont le cycle est de période n\nfn(Z)=0 est de degré 2**(n-1) en c\ndonc il y a au plus 2**(n-1) composants ayant un cycle de période n\nleurs centres sont solutions de c2+c=0 (centre du disque de gauche), (c2+c)2+c=0 (centre des deux disques supérieur et inférieur et du mini mandelbrot de gauche), ....";break;}
	 					case 8:{str="Les composants n-cycles sont, en particulier, tous les disques tangents à la cardioïde\nséquence de Farey : le disque tangent à gauche à la cardioïde est un 2-cycle, le disque supérieur est un 3-cycle. à partir du disque supérieur, en tournant vers la droite on trouve dans les disques des cycles 3,4,5,6,... \nentre deux disques n et n+1, le plus gros disque est 2n+1\nentre deux disques consécuitifs de périodes p et q, le plus gros est de période p+q\non trouve donc vers la gauche des cycles 3,5,7,9 ...\nles disques tangents à un n-disque ont une période double et suivent ces règles\np et q étant premiers entre eux, il existe un disque tangent à la cardioïde en =exp(2 i pi p/q)/2 * (1-exp(2 i pi p/q)/2) et le rayon du disque est sin(pi p/q)/q2, q étant la période\n\ncette règle s'applique à tout disque ayant des disques tangents, en multipliant q par la période du disque père\nles julia correspondants sont des \"lapins de Douady\" ayant chacun des pattes à n branches\n";break;}
	 					case 10:{str="si le polynome est de la forme ax+bx2+...,(donc pas dans le cas de Z2+C) avec a=exp(2 i pi alpha), et sous certaines conditions d'irrationalité du coefficient alpha,\nles \"disques de Siegel\" apparaissent autour des points fixes neutres,\net le cycle tourne autour de ces cercles\nsi alpha est rationel, alpha=p/q, a**n=1 et on a un n cycle autour de 0, sinon un cycle infini sur le cercle de centre O\nlorsque le polynome est de degré >3 apparaissent des \"anneaux de Herman\"";break;}
	 					case 9:{str="à la gauche du Mandelbrot les disques successifs ont un cycle de 2,4,8,... points\nle rapport des diamètres de ces disques tend vers 4.669, le nombre de Feigenbaum\nsur la gauche les centres des petits Mandelbrot sont repartis de sorte que (Cn-Cn-1)/Cn+1-Cn) tend vers 4";break;}
	 					case 11:{str="à la frontière, tout cercle contient des points du Mandelbrot et des points qui n'y sont pas\ntout cercle sur la frontière contient un Mandelbrot réduit\ncertains points de la frontière, les points de Misiurewicz, itèrent sur un point d'un cycle\nce sont les centres des spirales, les embranchements\nle julia correspondant ressemble à un agrandissement du Mandelbrot en ce point\nen ces points un  léger déplacement du point C déforme rapidement le Julia, qui passe d'un type de cycle à un autre (période différente, ...)\non les caractérise par : fn(0)=fn-k(0)";break;}
	 					case 12:{str="Les fonctions sont de deux sortes :\nZn+1=f(Zn)+C\nZn+1=C f(Zn)\nCertaines ont des temps de calcul longs";break;}
	 					case 13:{str="<html>plusieurs types de coloration sont possibles :<br>par le nombre d'itération avant la divergence vers l'infini<br>par le module de divergence<br>par l'angle de divergence<br>par le module minimum de fn(0)<br>Par le nombre d'itération pour atteindre le minimum de fn(0), nombre qui, résultat surprenant, suit la suite de Fibonacci (Fn=Fn-1  + Fn-2)<br><br>En visualisant les points et bassins d'attraction, la colorisation se fait par le nombre d'itération avant la convergence vers l'infini un point fixe ou un cycle<br>La détection du cycle est plus longue car il faut detecter l'égalité à epsilon près avec un des n points précédents</html>";break;}
	 					case 14:{str="souris gauche dans Mandelbrot : choix du point C, recentrage et zoom\nsouris gauche dans Julia : recentrage et zoom\nsouris droite dans Mandelbrot : choix du point C et affichage du Julia correspondant\nsouris droite dans Julia : choix d'un point Z et suivi de son cycle\nsouris du milieu : recentrage et zoom dynamique";break;}
	 					case 15:{str="le nombre complexe x + i y se représente par le point de coordonnées cartésiennes (x,y)\ntoutes les opérations et fonctions classiques sont définies piur des complexex\nZ= x + i y = r exp(i t) = r * (cos(t) + i sin(t)) avec r=sqrt(x*x + y*y) et t = arctang(y/x)\nx + i y     +    m + i n = x+m   + i (y+n)\n(x + i y) * (m + i n) = x * m - y * n  +i (x * n + y m)\nsin(x + i y) = sin(x)*ch(y) + i cos(x)*sh(y)\ncos(x + i y) = cos(x)*ch(y) - i sin(x)*sh(y)\nexp(x + i y) =exp(x) * (cos(y) + i sin(y))\nz**z'=exp(z'(log(r)i t))\n";break;}
	 					case 16:{str="on étudie az2+bz+c\nor, par un changement d'axe on peut se limiter à étudier\na(z2 + b/a z + c/a)\n puis (z+b/2a)2- (b2-4ac)\nsoit Z2+C";break;} 
	 					default:{}
	 					} 
	 				affiche(str,reponse);
	 				indexhelp++; 
	 				if (indexhelp==tabhelp.length) {indexhelp=0;}
	 				} // switch
	 		} // for
	 } // while
} // help

        
public void mmaj()
{
if (pan.pastravel>0)
	{str="<html>Pas du traveling="+pan.pastravel+" , vers le haut ou vers la droite<br>";}
else
	{str="<html>Pas du traveling="+pan.pastravel+" , vers le bas ou vers la gauche<br>";}
if (pan.attracteur==true)
	{str=str+"montre bassins d'attraction, ";}
else
	{str=str+"masque bassins d'attraction, ";}

if (pan.mandelbrot==true)  
	{str=str+"Mandelbrot";}
else
	{str=str+"Julia";}

str=str+" pour "+pan.tabfon[pan.numfon]+" ";

if (pan.flag==false)
	{str=str+" en cours<br>";}
else
	{str=str+" fait<br>";}
	
if (pan.thecy>0)
	{str=str+"C="+pan.thecx+"<br>+"+pan.thecy+" i</html>";}
else
	{str=str+"C="+pan.thecx+"<br>-"+pan.thecy+" i</html>";}
lpas.setText(str);
lpas.repaint();
}
        
public void maj()
{
mmaj();

if (pan.flag==true) {pan.repaint();}
}
 
public Fenetre()
						{ 
/* applet*/
  this.setTitle("Ensemble de Mandelbrot et ensembles de Julia");
  Dimension dime = Toolkit.getDefaultToolkit().getScreenSize();
  int theight = (int)dime.getHeight()-50;
	int twidth  = (int)dime.getWidth()-50;

  this.setSize(twidth, theight);	/* 1280 720 et 1920 1080 j'avais 1500 900 */
  this.setLocationRelativeTo(null);                           
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setUndecorated(false); 
//int i=Toolkit.getDefaultToolkit().getScreenSize().height; 
//System.out.println(""+i); 
//i=Toolkit.getDefaultToolkit().getScreenSize().width; 
//System.out.println(""+i); 
                
            this.setLayout(new BorderLayout()); 
						pan.haut=theight-150; 				/* 800 1320 */
						pan.longueur=twidth-150;            
            menu.setPreferredSize(new Dimension(pan.longueur+200, 70)); 
            menugauche.setPreferredSize(new Dimension(160, pan.haut)); 
    				pan.setPreferredSize(new Dimension(pan.longueur, pan.haut));
          
            lpas.setPreferredSize(new Dimension(400, 70)); //270
            lvide.setPreferredSize(new Dimension(10, 60)); 
              
            bmandel.setPreferredSize(dim);
            bmontre.setPreferredSize(dim);
            bjulia.setPreferredSize(dim);
						bnextpointc.setPreferredSize(dim);
						bprecpointc.setPreferredSize(dim);
						btravelingh.setPreferredSize(dim);
						btravelingv.setPreferredSize(dim);
						btravelingstop.setPreferredSize(dim);
						baccelere.setPreferredSize(dim);
						bralenti.setPreferredSize(dim);
						binverse.setPreferredSize(dim);
					  bmemepointc.setPreferredSize(dim);
					  bunzoom.setPreferredSize(dim); 
						bstartdyna.setPreferredSize(dim); 
						pan.bstopdyna.setPreferredSize(dim);
						battracteur.setPreferredSize(dim);
						bperiode.setPreferredSize(dim);
						bnextfon.setPreferredSize(dim);
						bpointc.setPreferredSize(dim);
						bcoloration.setPreferredSize(dim);
						bhelp.setPreferredSize(dim);

						//btravelingstop.setVisible(false);
						//pan.bstopdyna.setVisible(false);
						
 
						bmandel.addActionListener(new fmandel());
						bmontre.addActionListener(new fmontre());
						bjulia.addActionListener(new fjulia());
						bnextpointc.addActionListener(new fnextpointc());
						btravelingv.addActionListener(new ftravelingv());
						btravelingh.addActionListener(new ftravelingh());
						btravelingstop.addActionListener(new ftravelingstop());
						baccelere.addActionListener(new faccelere());
						bralenti.addActionListener(new fralenti());
						binverse.addActionListener(new finverse());
						bprecpointc.addActionListener(new fprecpointc());
						bmemepointc.addActionListener(new fmemepointc());
						bunzoom.addActionListener(new funzoom());
						bstartdyna.addActionListener(new fstartdyna());
						pan.bstopdyna.addActionListener(new fstopdyna());
						battracteur.addActionListener(new fattracteur());
						bperiode.addActionListener(new fperiode());
						bnextfon.addActionListener(new fnextfon());	
						bpointc.addActionListener(new fpointc());
						bcoloration.addActionListener(new fcoloration());
						bhelp.addActionListener(new fhelp());
				
						menu.add(lpas);
            menu.add(bmandel);
            menu.add(bmontre);
            menugauche.add(bjulia);
            menugauche.add(btravelingh);
            menugauche.add(btravelingv);
            menugauche.add(btravelingstop);
           	menugauche.add(baccelere);
            menugauche.add(bralenti);
            menugauche.add(binverse);
            menugauche.add(bnextpointc);
            menugauche.add(bprecpointc);
            menugauche.add(bmemepointc);
            menugauche.add(bcoloration);
            menu.add(bunzoom);
            menu.add(bstartdyna);
            menu.add(pan.bstopdyna); 
            menu.add(battracteur);
            menu.add(bperiode);
            menu.add(lvide);
            menu.add(bnextfon);
            menu.add(bpointc);
            menu.add(bhelp);
       //     menu.add(lc);
           
            this.add(menu, BorderLayout.NORTH);
            this.add(menugauche,BorderLayout.WEST);
            this.add(pan, BorderLayout.CENTER);
   			
      			//	this.setContentPane(container);
            this.setVisible(true);
               						
 						t=new Timer(); 
 						t.schedule(new timetask(),500,100);
      str="bbbb";
      mmaj();
        		} 
        class timetask extends TimerTask 
        	{
        	public void run() 
        		{
        		mmaj();
        						if ((pan.flag==true) && (pan.traveling==true) )
        								{pan.dyna=false;
        								pan.mandelbrot=false;
        								pan.thecx=pan.thecx-deltravx*pan.pastravel;
        								pan.thecy=pan.thecy-deltravy*pan.pastravel;
        								
 												pan.nb=200;
        								maj();
        								}
        			     	if ((pan.flag==true) && ((pan.dyna==true) && (pan.nbi<30)))
 										    { 
 										    deltaX=(pan.maxX-pan.minX)/3.0;
 									 	    deltaY=(pan.maxY-pan.minY)/3.0; 

 										    x=(pan.minX+pan.maxX)/2.0; 
 										    pan.minX=x-deltaX;
 										    pan.maxX=x+deltaX;
 										    y=(pan.minY+pan.maxY)/2.0;
 										    pan.minY=y-deltaY;
 										    pan.maxY=y+deltaY;
 										    pan.nbi=pan.nbi+1; 
 										  
 										    pan.nb=pan.nb+30; 
 										    maj();
      									} 
         		}
        }
      
         class fmandel implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{
                      //  String str = ((JButton)e.getSource()).getText();
        
                  pan.mandelbrot=true;  
                  pan.traveling=false;
                  pan.dyna=false;
       						pan.cycle=false; 
									del=2.0; 
                	if (pan.mandelbrot==false) {del=4.0;}
                	if (pan.indexpt==pan.cx.length/2) {pan.indexpt=0;};
                	pan.minX=pan.thecx-del;
                	pan.maxX=pan.minX+2*del;

									pan.minY=pan.thecy-del/2.0;
                	pan.maxY=pan.minY+del;
                	pan.nb=pan.nbdebut;
                	maj(); 
                	}  
        	}
        class fperiode implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
                     //  String str = ((JButton)e.getSource()).getText(); 
      
                  pan.mandelbrot=true;  
                  pan.numfon=0; 
                  pan.traveling=false;
                  pan.dyna=false; 
       						pan.cycle=false; 
       						pan.coloration=0;
       						
       						pan.montre=false;
									del=2;
									pan.thecx=0;
									pan.thecy=0;
                	pan.minX=pan.thecx-del;
                	pan.maxX=pan.minX+2*del;
									pan.minY=pan.thecy-del/2.0;
                	pan.maxY=pan.minY+del;
                	pan.nb=pan.nbdebut;
                	if (pan.showperiode==true)
                		{pan.showperiode=false;}
                	else 
                		{pan.showperiode=true;}
                	maj(); 
                	}    
        	}
        
        class fjulia implements ActionListener 
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
             
                  pan.mandelbrot=false;  
                  del=2.0;
                  pan.dyna=false;
                  pan.traveling=false;
                	if (pan.mandelbrot==false) {del=4.0;}
                	if (pan.indexpt==pan.cx.length/2) {pan.indexpt=0;};
                	pan.minX=-del;
                	pan.maxX=pan.minX+2*del;
                	pan.minY=-del/2.0;
                	pan.maxY=pan.minY+del;
                	pan.nb=pan.nbdebut;
                	if (pan.attracteur==true) {pan.nb=pan.nbdebut+100;}
                	maj();
                	}
                
        	}
        	
        class fnextpointc implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{  
                	del=2.0;
                	pan.cycle=false;
                	pan.traveling=false;
                	pan.dyna=false;
                	if (pan.mandelbrot==false) {del=4.0;}
                	pan.indexpt++;
                	if (pan.indexpt==pan.cx.length/2) {pan.indexpt=0;};
                	pan.thecx=pan.cx[2*pan.indexpt];
                	pan.thecy=pan.cx[2*pan.indexpt+1];
                	pan.minX=pan.thecx-del;
                	pan.maxX=pan.minX+2*del;
                	pan.minY=pan.thecy-del/2;
                	pan.maxY=pan.minY+del;
                	pan.nb=pan.nbdebut;
                	maj();
                	}
              
        	} 
 				class fprecpointc implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
                	del=2.0;
                	pan.cycle=false;
                	pan.traveling=false;
                	pan.dyna=false;
                	if (pan.mandelbrot==false) {del=4.0;}
                	pan.indexpt--;
                	if (pan.indexpt ==-1) {pan.indexpt=pan.cx.length/2-1;}
                	System.out.println(""+pan.indexpt+" "+pan.cx[2*pan.indexpt]+" "+pan.cx[2*pan.indexpt+1]);
                	pan.thecx=pan.cx[2*pan.indexpt];
                	pan.thecy=pan.cx[2*pan.indexpt+1];
                	pan.minX=pan.thecx-del;
                	pan.maxX=pan.minX+2*del;
                	pan.minY=pan.thecy-del/2;
                	pan.maxY=pan.minY+del;
                	pan.nb=pan.nbdebut;
                	maj();
                	} 
              
        	}
        class fmemepointc implements ActionListener
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{  
                	del=2.0;
                	if (pan.mandelbrot==false) {del=4.0;}
                	pan.dyna=false;
                	pan.cycle=false;
                	pan.traveling=false;
                	if (pan.indexpt==pan.cx.length/2) {pan.indexpt=0;};
                	if (pan.mandelbrot==true)
                		{pan.thecx=pan.cx[2*pan.indexpt];
                		pan.thecy=pan.cx[2*pan.indexpt+1];
                		}
                	pan.minX=pan.thecx-del;
                	pan.maxX=pan.minX+2*del;
                	pan.minY=pan.thecy-del/2.0;
                	pan.maxY=pan.minY+del;
                	pan.nb=pan.nbdebut;
                	maj();
                	}
               
        	}
  
       class faccelere implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
                        if (Math.abs(pan.pastravel)<0.01) {pan.pastravel=1.5*pan.pastravel; }
                        maj();
                	}
           }
       class fralenti implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
                        pan.pastravel=pan.pastravel/1.5; 
                        maj();   
                	}
           } 
        class finverse implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
                        pan.pastravel=-pan.pastravel;
                        maj();  
                	}
        	}   

      class fmontre implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{
                        if (pan.montre==true)
                        		{pan.montre=false; }
                        else 
                        	{pan.montre=true;}
                        maj();
                	}
                
        	}
    	class ftravelingh implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
   	            	{
                	pan.mandelbrot=false;
                	pan.dyna=false;
                  pan.cycle=false;
                	   		maxthecx=Math.abs(pan.thecx);
                	   		deltravx=-1.0;
                	   		deltravy=0.0;
                        if (pan.traveling==false)
                        	{ 
                        	btravelingstop.setVisible(true);
                        	del=4.0; 
                        	pan.traveling=true; 
        									pan.minX=-del;
                					pan.maxX=pan.minX+2*del; 
													pan.minY=-del/2.0;
                					pan.maxY=pan.minY+del;
                					}  
                	}
        	}  
      class ftravelingv implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{
                	pan.mandelbrot=false;
                	pan.dyna=false;
                	pan.cycle=false;
                	   		maxthecy=Math.abs(pan.thecy);
                	   		deltravx=0.0;
                	   		deltravy=1.0;
                        if (pan.traveling==false) 
                        	{
                        	btravelingstop.setVisible(true);
                        	pan.traveling=true;
                        	del=4.0;
        									pan.minX=-del;
                					pan.maxX=pan.minX+2*del;
													pan.minY=-del/2.0;
                					pan.maxY=pan.minY+del;
                					}  
                	}
               
        	}
        class ftravelingstop implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{
                	pan.traveling=false; 
                	pan.cycle=false;
                	//btravelingstop.setVisible(false);  
                	}
                
        	}
        class fstartdyna implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{
                	pan.cycle=false;
                	pan.traveling=false;
                  pan.dyna=true; 
                  pan.nbi=0;  
                  pan.bstopdyna.setVisible(true);  
                	}
             
        	}
       class fstopdyna implements ActionListener
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
                        pan.dyna=false; 
                        maj(); 
                	}
           
        	}
    	class fhelp implements ActionListener
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
                        help(); 
                	}
           
        	}
       class fattracteur implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
                        if (pan.attracteur==true)
                        	{pan.attracteur=false;}
                        else
                        	{pan.attracteur=true;}
                        maj();
                	}
              
        	} 
        class funzoom implements ActionListener
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{
                	deltaX=(pan.maxX-pan.minX)*1.1;
 									deltaY=(pan.maxY-pan.minY)*1.1; 
 									x=(pan.minX+pan.maxX)/2.0;
 									pan.minX=x-deltaX;
 									pan.maxX=x+deltaX;
 									y=(pan.minY+pan.maxY)/2.0;
 									pan.minY=y-deltaY;
 									pan.maxY=y+deltaY;
 									pan.nbi=pan.nbi+1;
 									maj();
                	} 
                
        	}
       class fnextfon implements ActionListener
        	{
                @Override
                public void actionPerformed(ActionEvent e) 
                	{
                	int i=pan.numfon+1;
 									if (i==pan.tabfon.length) {i=0;}
									String  reponse = (String) JOptionPane.showInputDialog
	    							(null, 
	     							"Choisir une fonction à analyser", 
	     							"Boutons personnalises", 
	     							JOptionPane.QUESTION_MESSAGE,
	     							null,
	     							pan.tabfon,
	     							pan.tabfon[i]);
	     						for (i=0;i<pan.tabfon.length;i++)
	     							if (reponse==pan.tabfon[i])
	     								{
	     								pan.numfon=i; 
											pan.cycle=false;
                			pan.dyna=false;
                			pan.traveling=false;
                			pan.indexpt=0;
                			pan.nb=200;
                			
                			pan.mandelbrot=true;
                			del=4.0;
                			pan.thecx=0.0;
                			pan.thecy=0.0;
        							pan.coloration=0;
                			switch (pan.numfon)
                					{
                					case 4:	//	C sin(Z)
                						{pan.mandelbrot=false;pan.thecx=1.0;pan.thecy=0.0;del=7.0;break;}
                					case 6:	//	sin(Z)+C
                						{pan.thecx=1.0;pan.thecy=0.0;del=5.5;break;}
                					case 7:	// cos(Z)+C
                						{del=5.0;break;}
                					case 8:	//	C exp(Z)
                						{pan.coloration=1;del=5.0;break;}
                					case 9:	//	sin(Zn) + exp(Zn) + C
                						{pan.coloration=1;del=7.0;break;}	
                					case 11:	//	ch(Z)+C
                						{pan.coloration=1;del=6.0;break;}	
                					case 12:	//	sh(Z)+C
                						{pan.coloration=1;del=6.0;break;}	
                					case 13:	//	C Zn(1-Zn)
                						{pan.mandelbrot=false;pan.thecx=3.0;pan.thecy=0;del=2.0;break;}	
                					case 15:	//	Zn**Zn+C
                						{pan.coloration=1;pan.mandelbrot=false;pan.thecx=3.0;pan.thecy=01.7;del=5;break;}	
                					
                					default:
                						{}
                					}
                			pan.minX=-del;
                			pan.maxX=pan.minX+2*del;
											pan.minY=-del/2.0;
                			pan.maxY=pan.minY+del;	
                      mmaj(); 	
                      maj();
                       }
                	} 
        	}
        class fcoloration implements ActionListener
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{
                	int color=pan.coloration+1;
                	if (color==pan.typescol.length) {color=0;}
                
            			String  reponse = (String) JOptionPane.showInputDialog
	    							(null,
	     							"Choisir un type de coloration", 
	     							"Coloration",
	     							JOptionPane.QUESTION_MESSAGE,
	     							null,
	     							pan.typescol, 
	     							pan.typescol[color]);
            			for (int i=0;i<pan.typescol.length;i++)
            				{if (pan.typescol[i]==reponse)
            				 		{pan.coloration=i;} 
            				 if ((i==6) || (i==7)) {pan.montre=false;}
                     maj();
                     } 
                	}
        	} 
        class fpointc implements ActionListener
        	{ 
                @Override
                public void actionPerformed(ActionEvent e) 
                	{ 
            			String  reponse = (String) JOptionPane.showInputDialog
	    							(null, 
	     							"Coordonnées x et y du point C (avec un point décimal)\nsans espace, séparées par une virgule\non peut aussi cliquer droit (zoom) ou gauche (julia) dans l'ensemble de Mandelbrot", 
	     							"Point C", 
	     							JOptionPane.QUESTION_MESSAGE);
	     							int i=reponse.indexOf(",");
	     							if (i>1)
	     								{
	     								try
		     								{pan.resux=Double.parseDouble(reponse.substring(0,i));
	     									pan.resuy=Double.parseDouble(reponse.substring(i+1,reponse.length()));}
	     								catch(Exception ee)
	     									{i=0;}
	     								if (i>1)
            						{pan.thecx=pan.resux;
            						pan.thecy=pan.resuy;
            						}
                     mmaj();
                     }
                	}
        	} 
}


