import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Vector;

public class kon_yasai 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 ("80");
   TextField tf_valor_radio = new TextField ("300");

   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);

    setLayout (new BorderLayout ());
    add ("Center", mc = new miCanvas ());
    add ("North", pnl_1 = new Panel ());
    pnl_1.setBackground (Color.pink);
    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 ("水色");
    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);

    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;  	/*　描画色の選択： 1=だいこん　*/
  int n=80;                	/*　描画する円の数*/
  double radio=300;        	/*　長さ  */


 miCanvas ()
  {
    super ();
  }

public void paint(Graphics g){

   int i=0;
   double radio1, radio2;				//	円の大きさ保存
   double dt=2.0*Math.PI/n;			//	一回辺りの角度変化量
   double d1, d2;
   double x=150 + Math.random() * 650;	//バナナの始点
   double y=150 + Math.random() * 400;	//バナナの始点
   double t0 = Math.random() * Math.PI;	//バナナの生えはじめ向き
   double x_now, y_now;				//	現在の円の中心
   double dMuki = Math.random() * 2 - 1;//	バナナの向き
   //dMukiの0を防止
	if(dMuki >= 0){
		dMuki = 1;
	}else{
		dMuki = -1;
	}

   double x1, y1, x2, y2;
   double t;


/*  --- Defino el Color de los circulos ---  */

    switch (color_circulo) {
      case 0 : g.setColor (new Color(100,255,0));
               break;
      case 1 : g.setColor (Color.green);
               break;
      case 2 : g.setColor (Color.black);
               break;
      case 3 : g.setColor (Color.red);
               break;
      case 4 : g.setColor (Color.blue);
               break;
      case 5 : g.setColor (Color.green);
               break;
      case 6 : g.setColor (Color.yellow);
               break;
      case 7 : g.setColor (Color.magenta);
               break;
      case 8 : g.setColor (Color.cyan);
               break;
      case 9 : g.setColor (Color.pink);
               break;
      case 10 : g.setColor (Color.orange);
               break;
    }

/*    --- Aqui dibuja el primer circulo central ---    */

	radio1 = radio / 25;
	radio2 = radio1 + Math.abs(radio/7 - radio1) / radio;
	d1 = dt;
	d2 = dt;

	for(i = 0; i < n; i++){

		x_now = x + i * radio/n * Math.cos(t0 + dt * dMuki);
		y_now = y + i * radio/n * Math.sin(t0 + dt * dMuki);
		t=0;
		x1 = radio1 * Math.cos(t)+x_now;
		y1 = radio1 * Math.sin(t)+y_now;


		for(t=0; t<=6.2832; t+=0.04){

			x2=radio1 * Math.cos(t)+x_now;
			y2=radio1 * Math.sin(t)+y_now;

			g.drawLine((int) x1,(int) y1 ,(int) x2,(int) y2);

			x1=x2;
			y1=y2;
		}

		if(i < n/12){
			radio2 -= (radio/7 - radio1)  /n;
		}else if(i < n/8){
			radio2 += (radio/7 - radio1) * 3/n;
		}else if(i < n/6){
			if(color_circulo ==  0){
				g.setColor(new Color(220,230,220));
			}else if(color_circulo == 1){
				g.setColor (Color.orange);
			}
			radio2 += (radio/7 - radio1) * 10/n;
		}else if(i < n/5){
			radio2 += (radio/7 - radio1) * 20/n;
		}else if(i < n/2){
			radio2 += (radio/7 - radio1) * 15/n;
		}else if(i  <  n * 4/5){
			radio2 -= radio2/i;
		}else{
			radio2 -= radio2 / (n-i);
		}
		radio1 = radio2;
		dt += (d1 + d2)/n;
		d1 = d2;
		d2 = dt;
    }
}


/*   --- 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 ();
}

}
