Código fuente del Applet ** Applet source code



/*
 Difus.java     Diciembre 1.999   Copyright()  N. Betancort
 Applet que muestra la difusi¢n  browniania de part¡culas
*/

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;

 //clase  principal  -- Main class

 public class Difus extends Applet implements Runnable{

   static final Color CFONDO = new Color(200,100,120); //color fondo

   private int x = 400;                       //width
   private int y = 400;                       //height

   boolean btrace = true;                     // huella de trayectoria
   int tiempo_pausa = 200;                    //tiempo m ximo pausa thread
   Thread tgrafi = null;                      //Thread para dibujar gr fica
   Panel marco;
   Digraf grafi;                              //Pizarra gr fica
   ProceDifu calcular;                        //Proceso de calculo
   Pancontrol pantrol;                        //Panel de control
   Panbotones panbot;                         //Panel de botones
   Dif_info finfo;                            //Frame informativo

   private Panel ptitu = new Panel();          //Panel para titulo
   private Label ltitu= new Label("Particles Diffusion");  //Titulo

   public Dimension getPreferredSize() { return new Dimension(x,y);}


   public void  init(){
      setLayout(null);
      setSize(getPreferredSize());
      setBackground(CFONDO);

      //Captura de par metros--getting parameters
      try{
        String sx = getParameter("an");           //dimensiones
        String sy = getParameter("al");
        if (sx != null & sy != null){
           x = (Integer.valueOf(sx)).intValue();
           y = (Integer.valueOf(sy)).intValue();
        }
      }
      catch(Exception e) {   }

      marco = new Tapiz(x,y, CFONDO);
      marco.setBounds(0,0, x, y);
      add(marco);
      ptitu.setBounds(20,10,x-40,y/10);
      ptitu.setBackground(CFONDO);
      ltitu.setForeground(new Color(10,10,240));
      ltitu.setFont(new Font("Serif",Font.BOLD, 16));
      ptitu.add("Center",ltitu);
      marco.add(ptitu);

      grafi = new Digraf(this);
      marco.add(grafi);
      grafi.setBounds(16,y/10+10,x-32,7*y/10); //dimensiones funci¢n de x e y
      grafi.iniciar();

      calcular = new ProceDifu(50);
      calcular.setorigen(grafi.getBounds().width, grafi.getBounds().height);
      calcular.setrandom();

      pantrol = new Pancontrol(this, CFONDO, x-40,20);
      pantrol.setBounds(20, 8*y/10+20, x-40, 20);
      marco.add(pantrol);
      panbot = new Panbotones(this, CFONDO);
      panbot.setBounds( 20, 7*y/8+20, x-40, y/16);
      marco.add(panbot);

      finfo = new Dif_info();

   }

 //..................................................
     public void start(){
        grafi.iniciar();                   //posicion al origen
        calcular.setorigen(grafi.getBounds().width, grafi.getBounds().height);

         if (tgrafi==null){
             tgrafi = new Thread(this);
             tgrafi.start();
         }
         else { repaint(); }
     }
 //..........................................
     public void stop(){
         if (tgrafi!=null){
             tgrafi.stop();
             tgrafi = null;
         }
     }
 //..................................................
     public void continuar(){
         if (tgrafi==null){
             tgrafi = new Thread(this);
             tgrafi.start();
         }
     }
 //..........................................

     public void run(){

         while (tgrafi != null){
         calcular.getnewpos();

             try{
                  for(int r = 0; r < 5; r++){
                        grafi.dibusalto(r, btrace);
                        tgrafi.sleep(tiempo_pausa);
                  }
              }
              catch(InterruptedException e){  tgrafi.stop();  }
          }
      }
 //..........................................
    public void cambionumpart(int nsel){
          stop();
          this.calcular = new ProceDifu(nsel);
      calcular.setorigen(grafi.getBounds().width, grafi.getBounds().height);
          start();
    }
 //..........................................
     public static void main(String args[]) {      //iniciar como aplicaci¢n
         Difus Nidifu = new Difus();
         Nidifu.init();
         Nidifu.start();
     }
  //.............................................

 }  //Fin de clase Difus

 //--------------------------------------------------------------------
 //--------------------------------------------------------------------

 class Digraf extends Canvas implements MouseListener{

    Difus padre;
    Image clonima;
    Graphics clongraf;
    Rectangle rgraf = new Rectangle(0,0,0,0);
    boolean bcurva = false;
    int intervalx = 10;         //anchura de barras
    int acumulador = 0;         //contador de retardo para grafico de barras
    int bars1[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    int bars2[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    String destip = " ";

    public Digraf(Difus padre){        //Constructor
        super();
        this.padre = padre;
        this.addMouseListener(this);
        setBackground(Color.black);             //color negro
    }

  //.....................................................

    public void paint(Graphics g){
          g.drawImage(clonima, 0,0, this);
    }
  
    public void update(Graphics g){
           paint(g);
    }
  
   //............................................................

    public void fixpaint(Graphics g){

        g.setColor(Color.red);        //ejes coordenados
        g.drawLine(rgraf.width/2 , 2, rgraf.width/2, rgraf.height-2);
        g.drawLine(4, rgraf.height/2 , rgraf.width, rgraf.height/2);
        g.setColor(Color.yellow);       //leyenda
        g.drawString( "Mean free path= 16 pixels", 10,10);

        g.clearRect(2, rgraf.height -30, 60, 30);
        g.setColor(Color.yellow);       //Numero de iteraciones
        g.drawString("N = "+
           String.valueOf(padre.calcular.contador), 10,rgraf.height -10);
       
        g.clearRect(rgraf.width - 80, rgraf.height -30, 80, 30);
        g.setColor(Color.yellow);       //desviaci¢n t¡pica
        destip = destip.valueOf(padre.calcular.desv_tip);
        try{
             destip = destip.substring(0,5);
             g.drawString("st. dev.= "+ destip,
                           rgraf.width - 80,rgraf.height -10);
        }
        catch(StringIndexOutOfBoundsException e){  }

        if((bcurva == true) & (padre.btrace == false)){
             cal_bar();
             curvapaint(g, bars2);
        }
        
    }

   //............................................................

    private void cal_bar(){

           acumulador ++;
           //calculo
           for (int j = 0; j < 12; j++){
               int altura[] = padre.calcular.recuento(j*intervalx,
                         (j+1)*intervalx);
               bars1[2*j] =   bars1[2*j] + altura[0]/4;
               bars1[2*j+1] =  bars1[2*j+1] + altura[1]/4;
           }
           if (acumulador == 3) {
                acumulador = 0;
                for (int h = 0; h < 24; h++) {
                    bars2[h] = bars1[h];       // repone bars2  para pintar
                    bars1[h] = 0;
                }
           }
    }
   //............................................................

    public void curvapaint(Graphics g, int bar[]){

        g.setColor(Color.blue);

        for(int j = 0; j < 12; j++){
            g.drawRect( rgraf.width/2 + j*intervalx ,
            rgraf.height - bar[2*j], intervalx, bar[2*j]);

            g.drawRect( rgraf.width/2 - (j+1)*intervalx ,
            rgraf.height - bar[2*j+1], intervalx, bar[2*j+1]);
        }
    }

   //............................................................

   public void iniciar(){

        rgraf = this.getBounds();  //obtener las propias dimensiones
        intervalx = rgraf.width/24;
        clonima = createImage(rgraf.width,  rgraf.height);
        clongraf = clonima.getGraphics();
        repaint();           //borrar pantalla
    }

   //..............................................................

    public void dibusalto(int r, boolean huella){

        if( huella == false )  {
                clongraf.clearRect(0, 0, rgraf.width, rgraf.height);
        }
        fixpaint(clongraf);
        clongraf.setColor(Color.white);     

        for(int i = 0; i anchoalto[0] ){
                 fuera_lim[i] = true;
                 //partout = partout +1;
          }
          else{  fuera_lim[i] = false;  }

          if (cy[1][i] < 0 | cy[1][i] > anchoalto[1] ){
                 fuera_lim[i] = true;
                 //partout = partout +1;
          }
          else{  fuera_lim[i] = false;  }

          //nueva posici¢n de inicio
          cx[0][i] =  cx[1][i]  ;
          cy[0][i] =  cy[1][i]  ;

          cal_desvtip();                //calculo desviaci¢n t¡pica

      }
    }

   //..............................................................

    private void cal_desvtip(){

         double suma =  0;
         double dist2 = 0;
         for (int i = 0; i< num_partic; i++){
    dist2 = ((cx[0][i]-dOx)*(cx[0][i]-dOx)+(cy[0][i]-dOy)*(cy[0][i]-dOy));
           suma = suma + dist2;
           dist[i] = Math.sqrt(dist2);
         }
         desv_tip = Math.sqrt(suma/num_partic);
    }

   //..............................................................

    public int[] recuento(int mini, int maxi){

           int cuenta[] ={0,0};

           for(int i = 0; i< num_partic; i++){
                //dispersi¢n seg£n x
                int idist = new Double(cx[0][i] - dOx).intValue();
                if(idist >= mini & idist < maxi) { cuenta[0] ++;}
                if(idist <= -mini & idist > -maxi) { cuenta[1] ++;}
           }
           cuenta[0] = cuenta[0] *800/num_partic;   //dimensionar altura
           cuenta[1] = cuenta[1] *800/num_partic;

           return cuenta;
    }
  //....................................................................

  } //fin de clase
  //-------------------------------------------------------------------




   import java.awt.*;

   class Tapiz extends Panel {      //panel de fondo para el applet

      int an = 260; int al =200;
      static Color cuno = new Color(210,210,210);   //borde uno
      static Color cdos = new Color(100,100,100);   //borde dos
      static Color ctre = new Color(220,100,10);    //fondo tapiz

      public Tapiz(int ancho, int alto, Color fondo) {   //Constructor

          super();
          this.an = ancho ;
          this.al = alto ;
          this.ctre = fondo;
          setLayout(null);
          setBackground(cuno);   //cuadro grande
          repaint();
      }

      public void paint(Graphics g){
       
          g.setColor(ctre);
          g.fillRect(3,3, an-5, al-5);
          g.setColor(cdos);
          for(int i=0; i<3; i++){     //rebordes de 5 pixels de ancho
             g.drawLine(an-i, i, an-i, al-i);       //vert. dch.
             g.drawLine(i, al-i, an-i, al-i);       //hor. baja
          }
      }  

   }    //fin de clase







 //------------------------------------------------------------------------
                          //Fin c¢digo applet
 //.........................*************************.............................



Volver a la página principal************************* Back to Applet page