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