/* 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; ianchoalto[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 //.........................*************************.............................