/*  
    Aqui vamos a hacer un programa que nos permita hacer mosdificaciones de tipo, cambiar el color de los circulos, 
    cambiar el tamanio del radio y cambiar la cantidad de circulos.... utillizar listados para poder elegir valores
    determinados.
　　　　　Ahora tratar de ingresar a mano los valores de la radio y de la cantidad de circulos.    

CONCLUSIONES: Este grafico tiene algunos conceptos a considerar.  Los numeros multiplos de 4, se concentran en el (400,530) y en (400,270)
que son los puntos extremos superior e inferior del circulo.  Estos puntos del radio se aproximan al cero, y no dibuja ningun circulo.   

*/

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Vector;

public class programaOketsu2 extends Applet
{
   
         
   miCanvas mc;
   Panel pnl_1;
   Panel pnl_2 = new Panel ();
   Panel pnl_3 = new Panel ();
   Panel pnl_4 = new Panel ();

   Label lbl_1 = new Label ("色");
   Label lbl_2 = new Label ("円の数");

   Label lbl_3 = new Label ("中心の円の半径");

   TextField tf_nro_circulo = new TextField ("50");
   TextField tf_valor_radio = new TextField ("130");

   Choice color_circulo = new Choice ();

   Button botonCirculo = new Button ("変える");
   Button botonRadio = new Button ("変える");

   int n = Integer.parseInt(tf_nro_circulo.getText());
   int radio = Integer.parseInt(tf_valor_radio.getText());

  public void init ()
  {
    setBackground (Color.white);  /*  Dar color de fondo  */
    
    setLayout (new BorderLayout ());  /*  Divide en secciones  */
    //lbl_1.setFont (new Font ("TimesRoman", Font.BOLD, 15));
    //lbl_2.setFont (new Font ("TimesRoman", Font.BOLD, 15));
    //lbl_3.setFont (new Font ("TimesRoman", Font.BOLD, 15));
    add ("Center", mc = new miCanvas ());
    add ("North", pnl_1 = new Panel ());
    pnl_1.setBackground (Color.pink); 
    //pnl_1.setLayout (new GridLayout (1, 3));
    pnl_2.add (lbl_1);
    color_circulo.add ("黒");
    color_circulo.add ("赤");
    color_circulo.add ("青");
    color_circulo.add ("緑");
    color_circulo.add ("黄色");
    color_circulo.add ("マグネンタ");
    color_circulo.add ("水色");
    color_circulo.add ("ピンク");
    color_circulo.add ("オレンジ色");
    pnl_2.add (color_circulo);
    pnl_1.add (pnl_2);
    pnl_3.add (lbl_2);
    pnl_3.add(tf_nro_circulo);
    pnl_3.add(botonCirculo);
    pnl_1.add (pnl_3);
    pnl_4.add (lbl_3);
    pnl_4.add (tf_valor_radio);
    pnl_4.add(botonRadio); 
    pnl_1.add(pnl_4);

// oidores de los colores
    color_circulo.addItemListener ( new java.awt.event.ItemListener ()
      {
        public void itemStateChanged (ItemEvent e)
        {
          mc.cambiaColorCirculo (color_circulo.getSelectedIndex ());
         
        }
      });
    botonCirculo.addActionListener ( new java.awt.event.ActionListener ()
      {
        public void actionPerformed (ActionEvent e)
        {
          mc.cambiaCantCirculo( Integer.parseInt(tf_nro_circulo.getText()));
          
        }
      });
    botonRadio.addActionListener ( new java.awt.event.ActionListener ()
      {
        public void actionPerformed (ActionEvent e)
        {
          mc.cambiaValorRadio( Integer.parseInt(tf_valor_radio.getText()));
          
        }
      }); 
  }
}

class miCanvas extends Canvas {
  

  int color_circulo = 0;   /*  Color del circulo inicial es negro  */
  int n=50;                /*  50 es la cantidad de circulos que se dibujara en primera instancia  */
  double radio=130;        /*  130 va a ser el tamanno inicial del radio de los circulos  */ 
  

 miCanvas ()
  {
    super ();
  }



public void paint(Graphics g){

   int i=0;
   double radio1;
   double dt=2.0*Math.PI/n;
   double h = radio*Math.cos(dt);
   double x=300;
   double y=300;

      
   double x1, y1, x2, y2; 
   double t,q;
  

/*  --- Defino el Color de los circulos ---  */

    switch (color_circulo) {
      case 0 : g.setColor (Color.black);
               break;
      case 1 : g.setColor (Color.red);
               break;
      case 2 : g.setColor (Color.blue);
               break;
      case 3 : g.setColor (Color.green);
               break;
      case 4 : g.setColor (Color.yellow);
               break;
      case 5 : g.setColor (Color.magenta);
               break;
      case 6 : g.setColor (Color.cyan);
               break;
      case 7 : g.setColor (Color.pink);
               break;
      case 8 : g.setColor (Color.orange);
               break;
    }



/*    --- Aqui dibuja el primer circulo central ---    */

    double ang =2.0*Math.PI/n;  /*  este 2*PI, es para poder recorrer toda la circunsferencia, y se divide por la cantidad de 
                                    circulos "n" que quiero representar en ella  */

    t=0;
     x1 = radio * Math.cos(t)+x;
     y1 = radio * Math.sin(t)+y;
     
     for(t=0; t<=6.2832; t+=0.04){
          
        x2=radio * Math.cos(t)+x;
        y2=radio * Math.sin(t)+y;

        g.drawLine((int) x1,(int) y1 ,(int) x2,(int) y2);
        x1=x2;
        y1=y2;
     }

/*   --- Aqui comienzo a dibujar los circulos de los lados ---     */

  int a = 0;
  for(i=1; i<=n; i++){
     q= ang*(double)i;                     /* Angulo de donde va a formar el circulo  */ 
     x=radio*Math.cos(q)+300;              /* Aqui se calcula los desplazamientos de x e y  */
     y=300-radio*Math.sin(q);              /*--- las sumas y las restas de 400 es para alinearlo al centro ----*/
     radio1=Math.abs(radio*Math.cos(q));   /* Aqui se calcula el radio de cada circulo que se va a graficar */
     
     t=0;
     x1 = radio1 * Math.cos(t)+x;    /* Calcula el primer punto de x1 e y1  */
     y1 = radio1 * Math.sin(t)+y;
 

     for(t=0; t<=6.2832; t+=0.04){
          
        x2=radio1 * Math.cos(t)+x;   /* Calcula el segunto punto de union, x2 e y2 */
        y2=radio1 * Math.sin(t)+y;

        g.drawLine((int) x1,(int) y1 ,(int) x2,(int) y2);   /* Diagramacion */

        x1=x2;
        y1=y2;
      }

    }
}

/*   --- para actualizar los valores ingresados ---- */ 

public void cambiaColorCirculo (int c)
  {
    color_circulo = c;
    repaint ();
}

void cambiaCantCirculo (int d)
{
    n = d;
    repaint ();
}

void cambiaValorRadio (int e)
{
    radio = e;
    repaint ();
}

}