/*-

   Este es un ejercicio que permite dibujar un arbol con distintos parametros introducidos por la persona que lo maneje.
   Puede elegir la cantidad de ramas que quiere colocar al tronco principal y el tama?o del mismo.
   Tambien puede definir el nivel.

-*/


import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class m0104089 extends Applet {


   miCanvas mc;
   Panel panel1;
   Panel panel2 = new Panel ();
   Panel panel3 = new Panel ();
   Panel panel4 = new Panel ();
   Panel panel5 = new Panel ();
   Panel panel6 = new Panel ();
   Panel panel7 = new Panel ();
   Panel panel8 = new Panel ();
   Panel panel9 = new Panel ();
   Panel panel10 = new Panel ();

   Label label1 = new Label ("Level");
   Label label2 = new Label ("");
   Label label3 = new Label ("Cant. de ramas");

  // Label label4 = new Label ("   x1");
  // Label label5 = new Label ("   y1");
   Label label6 = new Label ("     x");
   Label label7 = new Label ("     y");

   Label label8 = new Label ("}P");
   Label label9 = new Label ("}Q");
   Label label10 = new Label ("}R");


   //TextField x11 = new TextField ("0.0");
   //TextField y11 = new TextField ("1.0");
   TextField x21 = new TextField ("-0.3");
   TextField y21 = new TextField ("1.2");

   //TextField x12 = new TextField ("0.0");
   //TextField y12 = new TextField ("1.0");
   TextField x22 = new TextField ("0.1");
   TextField y22 = new TextField ("1.7");

   //TextField x13 = new TextField ("0.0");
   //TextField y13 = new TextField ("1.0");
   TextField x23 = new TextField ("0.3");
   TextField y23 = new TextField ("1.2");


   Button boton1 = new Button ("Construir");   // Boton de construccion

   TextField tf_nivel = new TextField ("8");
   TextField tf_tamanio = new TextField ("100");
   TextField tf_cantidad = new TextField ("3");

   int nivel = Integer.parseInt(tf_nivel.getText());
   int nb = Integer.parseInt(tf_cantidad.getText());    //* Cantidad de ramas *//
   int tam = Integer.parseInt(tf_tamanio.getText());


 public void init (){


   setBackground (Color.white);

   setLayout (new BorderLayout());
   add ("Center", mc = new miCanvas());
   add ("North",panel1 = new Panel());
   add ("South",panel9 = new Panel());
   panel1.setBackground (Color.pink);
   panel1.setLayout (new GridLayout(1,2));
   panel9.setBackground (Color.pink);
   panel9.setLayout (new GridLayout(5,1));

   panel2.add(label1);
   panel2.add(tf_nivel);
   panel1.add(panel2);
   panel3.add(label2);
   panel3.add(tf_tamanio);
   panel1.add(panel3);

   //panel5.add(label4);
   //panel5.add(label5);
   panel5.add(label6);
   panel5.add(label7);
   panel9.add(panel5);

   panel6.add(label8);
  // panel6.add(x11);
  // panel6.add(y11);
   panel6.add(x21);
   panel6.add(y21);
   panel9.add(panel6);

   panel7.add(label9);
   //panel7.add(x12);
   //panel7.add(y12);
   panel7.add(x22);
   panel7.add(y22);
   panel9.add(panel7);

   panel8.add(label10);
   //panel8.add(x13);
   //panel8.add(y13);
   panel8.add(x23);
   panel8.add(y23);
   panel9.add(panel8);

   panel10.add(boton1);
   panel9.add(panel10);


 boton1.addActionListener ( new java.awt.event.ActionListener ()
      {
        public void actionPerformed (ActionEvent e)
        {
          mc.dibujar( Integer.parseInt(tf_nivel.getText()), Integer.parseInt(tf_tamanio.getText()), Double.valueOf("0.0").doubleValue(),
                      Double.valueOf("1.0").doubleValue(), Double.valueOf(x21.getText()).doubleValue(), Double.valueOf(y21.getText()).doubleValue(),
                      Double.valueOf("0.0").doubleValue(), Double.valueOf("1.0").doubleValue(), Double.valueOf(x22.getText()).doubleValue(),
                      Double.valueOf(y22.getText()).doubleValue(), Double.valueOf("0.0").doubleValue(), Double.valueOf("1.0").doubleValue(),
                      Double.valueOf(x23.getText()).doubleValue(), Double.valueOf(y23.getText()).doubleValue() );

        }
      });

 }

}

 class miCanvas extends Canvas {

   int l=1;
   int indice =1;
   int nb = 3;
   int nivel= 10;
   int tam = 100;


   double x1[]= new double [nb+1];         //  {0.0, 0.0, 0.0, 0.0};
   double y1[]= new double [nb+1];         //  {1.0, 1.0, 0.7, 1.0};
   double x2[]= new double [nb+1];         //  {-0.5, 0.4, -0.3, 0.2};
   double y2[]= new double [nb+1];         //  {1.5, 1.3, 0.9, 1.7};

   int num = (int) Math.pow(nb, nivel-1);

   double xa [][] = new double [nivel][num];
   double xb [][] = new double [nivel][num];
   double ya [][] = new double [nivel][num];
   double yb [][] = new double [nivel][num];


  miCanvas ()
  {
    super ();
  }


 public void paint (Graphics g){

   double yy, xx;
   double ys, xs, xe, ye;

   int sum=0;
   g.setColor(Color.blue);
   g.drawLine ((int)xa[0][1]+350, (int)-ya[0][1]+400, (int)-xb[0][1]+350, (int)-yb[0][1]+400);

   for (int l=1; l<=nivel; l++){
      int j = 0;

      for (int k=1; k<= Math.pow(nb, l-1); k++){

          yy =  -(xb [l-1][k] - xa [l-1][k]);
          xx =  (yb [l-1][k] - ya [l-1][k]);

          for (int i =1; i<=nb; i++){

              xs = (double)((x1[i]*xx-y1[i]*yy+xa[l-1][k]));
              ys = (double)((x1[i]*yy+y1[i]*xx+ya[l-1][k]));
              xe = (double)((x2[i]*xx-y2[i]*yy+xa[l-1][k]));
              ye = (double)((x2[i]*yy+y2[i]*xx+ya[l-1][k]));

              g.setColor(Color.blue);
              g.drawLine ( (int)(xs+350), (int)(-ys+400), (int)(xe+350), (int)(-ye+400));

              sum = sum +10;
              if (l < nivel){
                  j = j+1;
                  xa[l][j]=xs;
                  xb[l][j]=xe;
                  ya[l][j]=ys;
                  yb[l][j]=ye;

               }

          }
      }
   }

 }


  public void dibujar (int n, int t, double x11, double y11, double x21, double y21,
                       double x12, double y12, double x22, double y22,
                       double x13, double y13, double x23, double y23 ){

     nivel = n;    // nivel
     tam = t;      // tamanio

     xa[0][1] = 0;
     xb[0][1] = 0;
     ya[0][1] = 0;
     yb[0][1] = tam;     // 100; aqui puedo manejar el zoom del arbol

        x1[1] = x11;
        y1[1] = y11;
        x2[1] = x21;
        y2[1] = y21;

        x1[2] = x12;
        y1[2] = y12;
        x2[2] = x22;
        y2[2] = y22;

        x1[3] = x13;
        y1[3] = y13;
        x2[3] = x23;
        y2[3] = y23;

        repaint();
  }

}

