/*
    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 kadai2 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 radioA=100;        /* 130 va a ser el tamanno inicial del radio de los circulos  */
  double radioB=radioA/2;        /* 130 va a ser el tamanno inicial del radio de los circulos  */


 miCanvas ()
  {
    super ();
  }



public void paint(Graphics g){

   int i=0;
   double radio1, radio2;
   double dt=2.0*Math.PI/n;
   double h = radioA*Math.cos(dt);
   double Ax=300;
   double Ay=300;
   double Bx=300;
   double By=300;



   double x1, y1, x2, y2, x3 ,y3, x4 ,y4;

   double t1, t2 ,q1, q2;


/*  --- 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  */



    t1=0;
    //最初の座標(大)
     x1 = radioA * Math.cos(t1)+Ax;
     y1 = radioA * Math.sin(t1)+Ay;

	//大きい円を書く
     for(t1=0; t1<=6.2832; t1+=0.04){

        x2=radioA * Math.cos(t1)+Ax;
        y2=radioA * Math.sin(t1)+Ay;

        g.drawLine((int) x1,(int) y1 ,(int) x2,(int) y2);
        x1=x2;
        y1=y2;
     }

     t2=0;
     //最初の座標(小)
     x3 = radioB * Math.cos(t2)+Bx;
     y3 = radioB * Math.sin(t2)+By;

     //小さい円を書く
     for(t2=0; t2<=6.2832; t2+=0.04){

        x4=radioB * Math.cos(t2)+Bx;
        y4=radioB * Math.sin(t2)+By;

        g.drawLine((int) x3,(int) y3,(int) x4,(int) y4);
        x3=x4;
        y3=y4;

     }



/*   --- Aqui comienzo a dibujar los circulos de los lados ---     */

  int a = 0;
  for(i=1; i<=n; i++){
	 //
     q1= ang*(double)i;                     /* Angulo de donde va a formar el circulo  */
     //
     Ax=radioA*Math.cos(q1)+200;              /* Aqui se calcula los desplazamientos de x e y  */
     //
     Ay=300+radioA*Math.cos(q1);              /*--- las sumas y las restas de 400 es para alinearlo al centro ----*/
     //
     radio1=50;   /* Aqui se calcula el radio de cada circulo que se va a graficar */

	 //
     q2= ang*(double)i;                     /* Angulo de donde va a formar el circulo  */
     //
     Bx=radioB*Math.sin(q2)+200;              /* Aqui se calcula los desplazamientos de x e y  */
     //
     By=300-radioB*Math.sin(q2);              /*--- las sumas y las restas de 400 es para alinearlo al centro ----*/
	 //
	 radio2=radio1/2;

     t1=0;
     x1 = radio1 * Math.cos(t1)+Ax;    /* Calcula el primer punto de x1 e y1  */
     y1 = radio1 * Math.tan(t1)+Ay;

     for(t1=0; t1<=6.2832; t1+=0.04){

        x2=radio1 * Math.cos(t1)+Ax;   /* Calcula el segunto punto de union, x2 e y2 */
        y2=radio1 * Math.tan(t1)+Ay;

        g.drawLine((int) x1,(int) y1 ,(int) x2,(int) y2);   /* Diagramacion */

        x1=x2;
        y1=y2;
      }


      t2=0;
      x3 = radio2 * Math.cos(t2)+Bx;    /* Calcula el primer punto de x1 e y1  */
      y3 = radio2 * Math.sin(t2)+By;

      for(t2=0; t2<=6.2832; t2+=0.04){

         x4=radio2 * Math.cos(t2)+Bx;   /* Calcula el segunto punto de union, x2 e y2 */
         y4=radio2 * Math.sin(t2)+By;

         g.drawLine((int) x3,(int) y3 ,(int) x4,(int) y4);   /* Diagramacion */

         x3=x4;
         y3=y4;

      }



    }
}

/*   --- 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)
{
    radioA = e;
    radioB = e/2;
    repaint ();
}

}

