//****************************************************************************** // diffusion.java: Applet // //****************************************************************************** import java.applet.*; import java.awt.*; import java.util.Random; import graph.*; //============================================================================== // Main Class for applet diffusion // //============================================================================== public class Frap5a extends Applet { ThreeDBorder tdb = null; Frap5aCanvasN dc = null; BarChart theChartRed=null; //BarChart theChartBlue=null; Button StartStop=new Button("Start"); Button b_Reset=new Button("Reset"); Button b_Matrix=new Button("Show Matrix"); Button b_Fit=new Button("Fit Curve"); boolean running=false, prun=false, nevr=true, yesdr=true; Panel P_Button, le, panel; Graph2D graph1; GraphFrapCanvas5a Gr; PThread5a t; int i, min, max, PLOT_REAL=0, ERR=0, PLT=0, PLT2=0, is=0, it=0, lines[][]=new int[7][5], xs[]=new int[3000], ys[]= new int[3000], zs[]=new int[3000]; float X1, Y1, SX, SY, SX2, SX2Y, SXY, SX12, SXX2, SX22, a, b, c, d=(float)0.01, us[]=new float[3000]; public void init(){ dc = new Frap5aCanvasN(this); tdb = new ThreeDBorder(dc,5); theChartRed=new BarChart(Color.red,"Number Red Within Circle",150.0,0.0); //theChartBlue=new BarChart(Color.blue,"Number Blue within Circle",50.0,0.0); tdb.inset(); P_Button=new Panel(); P_Button.setLayout(new GridLayout(0,4,0,0)); P_Button.add(StartStop); P_Button.add(b_Matrix); P_Button.add(b_Reset); P_Button.add(b_Fit); le=new Panel(); le.setLayout(new BorderLayout()); le.add("Center",tdb); le.add("South",theChartRed); le.add("North",P_Button); graph1 = new Graph2D(); graph1.drawzero = false; graph1.drawgrid = false; graph1.setDataBackground(new Color(255,230,200)); panel = new Panel(); panel.setLayout( new GridLayout(0,2,0,0) ); panel.add(graph1); setLayout(new BorderLayout()); Gr=new GraphFrapCanvas5a(this); Gr.resize(300,350); add("Center",le); add("East",Gr); Gr.repaint(); t= new PThread5a(this); } public Insets insets(){ return new Insets(5,5,5,5); } public void start(){ dc.init(); //dc.start(); } public void stop(){ dc.stop(); } public boolean action(Event event, Object what){ if(event.target==StartStop){ if (running){ dc.stop(); running=false; StartStop.setLabel("Start"); if(prun){ t.suspend(); } }else{ dc.start(); running=true; StartStop.setLabel("Stop"); if(prun){ t.resume(); } } }else if (event.target==b_Reset){ dc.ResetLocation=true; if (prun) { t.suspend(); t.c=0; prun=false; } t.c=0; Gr.data1 = new DataSet(); Gr.Str0=" "; is=0; Gr.repaint(); }else if (event.target==b_Matrix){ dc.Matrix = ! dc.Matrix; }else if (event.target==b_Fit){ SX=0; SY=0; SX2=0; SXY=0; SX12=0; SX2Y=0; SXX2=0; SX22=0; min=100000; max=-10000; if(is<3){ ERR=1; }else{ for (i=0;i<is;i++){ if(xs[i]>max) max=xs[i]; if(xs[i]<min) min=xs[i]; SX=(float)(SX+xs[i]); SY=(float)(SY+ys[i]); SXY=(float)(SXY+xs[i]*ys[i]); SX2=(float)(SX2+xs[i]*xs[i]); SX2Y=(float)(SX2Y+xs[i]*xs[i]*ys[i]); SXX2=(float)(SXX2+xs[i]*xs[i]*xs[i]); SX22=(float)(SX22+xs[i]*xs[i]*xs[i]*xs[i]); } SX12=SX2; // is=10; // SX=(float)33.0; // SY=(float)29.0; // SX2=(float)5500.0; // SXY=(float)97.74; // SX12=(float)111.70; // SX2Y=(float)16258.0; // SXX2=(float)18272.0; // SX22=(float)3128400.0; c=(-is*SXX2*SXY/(-SXX2*SX+SX12*SX2)+is*SX*SX2Y*SXX2/((-SXX2*SX+SX12*SX2)*SX2)+is*SX2Y/SX2+SXY*SX2*SX/(-SXX2*SX+SX12*SX2)-SX*SX2Y*SX/(-SXX2*SX+SX12*SX2)-SY)/(is*SX22*SX*SXX2/((-SXX2*SX+SX2*SX12)*SX2)-is*SXX2*SXX2/(-SXX2*SX+SX12*SX2)+is*SX22/SX2-SX22*SX*SX/(-SXX2*SX+SX2*SX12)+SXX2*SX2*SX/(-SXX2*SX+SX12*SX2)-SX2); b=SXY*SX2/(-SXX2*SX+SX12*SX2)+c*SX22*SX/(-SXX2*SX+SX2*SX12)-SX*SX2Y/(-SXX2*SX+SX12*SX2)-c*SXX2*SX2/(-SXX2*SX+SX12*SX2); a=(b*SXX2+c*SX22-SX2Y)/(-SX2); PLT=1; } Gr.repaint(); } return true; } } class Frap5aCanvasN extends Canvas implements Runnable //, StopwatchClient { // THREAD SUPPORT: // m_diffusion is the Thread object for the applet //-------------------------------------------------------------------------- Thread m_diffusion = null; Thread m_watch = null; private Applet applet; private final int NUM_PARTICLE=300; private final int CIRC_DIAM=80; private final double Fast=5.0, Slow=2.0; private Particle p[]; private Graphics m_g,m_r; private Image m_image,m_ready,m_bg; private Dimension m_dimImage; private int Tick=0; private Color BG=new Color(153,204,204); private Point Start,UL,LR; public boolean ResetLocation=true,Matrix=false; private boolean ImageReady=false; public int first=0, density=10, NumberIn1=0, NumberIn2; private int FrapCount=0; public Membrane m_Membrane; Circle m_circ; // diffusion Class Constructor //-------------------------------------------------------------------------- public Frap5aCanvasN(Applet applet) { this.applet=applet; } // APPLET INFO SUPPORT: // The getAppletInfo() method returns a string describing the applet's // author, copyright date, or miscellaneous information. //-------------------------------------------------------------------------- public String getAppletInfo() { return "Name: Frap diffusion\r\n" + "Author: Joe Patlak\r\n" + "Created with Microsoft Visual J++ Version 1.0"; } // The init() method is called by the AWT when an applet is first loaded or // reloaded. Override this method to perform whatever initialization your // applet needs, such as initializing data structures, loading images or // fonts, creating frame windows, setting the layout manager, or adding UI // components. //-------------------------------------------------------------------------- public void init() { Dimension dim=size(); int nWidth=dim.width; int nHeight=dim.height; Start= new Point(15,15); UL=new Point(0,0); LR=new Point(nWidth-5,nHeight-5); m_circ=new Circle(dim.width/2, dim.height/2,CIRC_DIAM); int charge=1; p = new Particle[NUM_PARTICLE]; for (int i=0; i<NUM_PARTICLE; i++){ Start.x=(int)(Math.random()*LR.x); Start.y=(int)(Math.random()*LR.y); if (i>249) charge=-1; p[i]= new Particle(applet,charge,Start,UL,LR); p[i].a_string="images/anion2.gif"; p[i].m_StdDev=Fast; p[i].BG=getBackground(); p[i].m_Barrier=nWidth*2; p[i].m_Membrane=m_Membrane; p[i].bouncing=false; if (i>249) p[i].m_StdDev=Slow; if (i>274) p[i].Tether=true; // p[i].m_MembraneIndex=0; if (i<250) p[i].m_MembraneIndex=0; else p[i].m_MembraneIndex=0; } ResizeImage(); m_bg=applet.getImage(applet.getCodeBase(),"images/graphBkgnd.gif"); } // Place additional applet clean up code here. destroy() is called when // when you applet is terminating and being unloaded. //------------------------------------------------------------------------- public void destroy(){ } // diffusion Paint Handler //-------------------------------------------------------------------------- public void paint(Graphics g) { if (m_ready != null){ g.drawImage(m_ready,0,0,null); } } //-------------------------------------------------------------------------- public void update(Graphics g) { ResizeImage(); paint(g); ImageReady=false; } //-------------------------------------------------------------------------- private void ResizeImage(){ Dimension dim = size(); int nWidth = dim.width; int nHeight = dim.height; if (m_dimImage != null && m_dimImage.width == nWidth && m_dimImage.height == nHeight){ return; } m_dimImage = new Dimension(nWidth, nHeight); m_image = createImage(nWidth, nHeight); m_ready = createImage(nWidth, nHeight); m_g = m_image.getGraphics(); m_r = m_ready.getGraphics(); LR=new Point(nWidth-5,nHeight-5); for (int i=0; i<NUM_PARTICLE; i++){ p[i].NewLimits(UL,LR); } m_circ=new Circle(dim.width/2, dim.height/2,CIRC_DIAM); } public Point NewEntry(){ double t=Math.random(); int y=m_dimImage.height, x=m_dimImage.width; int c=2*x+2*y; double side=(double)y/c, top=(double)x/c; if (t<side){ //left side y=(int)(Math.random()*y); x=17; }else if (t<side+top){ //top y=17; x=(int)(Math.random()*x); }else if (t<2*side+top){ //right side y=(int)(Math.random()*y); x=x-15; }else { //bottom x=(int)(Math.random()*x); y=y-15; } return new Point(x,y); } //-------------------------------------------------------------------------- public void start() { if (m_diffusion == null) { m_diffusion = new Thread(this); ((Frap5a)applet).theChartRed.start(); //((Frap5a)applet).theChartBlue.start(); //m_watch = new Stopwatch(this); m_diffusion.start(); //m_watch.start(); } } //-------------------------------------------------------------------------- public void stop() { if (m_diffusion != null) { m_diffusion.stop(); ((Frap5a)applet).theChartRed.stop(); //((Frap5a)applet).theChartBlue.stop(); //m_watch.stop(); m_diffusion = null; //m_watch = null; } } //-------------------------------------------------------------------------- //public void tick(){ // Tick = ++Tick % 4; // if ( Tick==0 && ImageReady) repaint(); //} //-------------------------------------------------------------------------- public void run() { while (true) { // try { if (m_g != null){ if (ResetLocation){ int charge=1; for (int i=0; i<NUM_PARTICLE; i++){ Start.x=(int)(Math.random()*LR.x); Start.y=(int)(Math.random()*LR.y); if (i>249) charge=-1; p[i].Init(charge,Start,UL,LR); //if (i>NUM_PARTICLE/2) p[i].Active=false; if (i>249){ p[i].m_StdDev=Slow; if (i>274) p[i].Tether=true; }else p[i].m_StdDev=Fast; p[i].bleached=false; p[i].m_MembraneIndex=0; } ResetLocation=false; } if (!Matrix){ m_g.setColor(BG); m_g.fillRect(0,0,m_dimImage.width,m_dimImage.height); }else Util.wallPaper(this, m_g, m_bg); first=0; NumberIn1=0; // NumberIn2=0; for (int i=0; i<NUM_PARTICLE; i++){ if (!p[i].Active && (first<density) ){ first++; p[i].NewLocation(NewEntry()); //if (Math.random()<0.2){ // p[i].m_StdDev=Slow; // p[i].m_Charge=-1; // p[i].Tether=true; //}else{ p[i].m_StdDev=Fast; p[i].m_Charge=1; p[i].Tether=false; //} } else p[i].NewMove(); if (( p[i].Location().x < 4) || (p[i].Location().x > (m_dimImage.width - 4)) || (p[i].Location().y < 4) || (p[i].Location().y > (m_dimImage.height-4))){ p[i].bleached = false; p[i].NewLocation(NewEntry()); } if (p[i].Active && !p[i].bleached && m_circ.Inside(p[i].Location())){ if (p[i].m_Charge==1) NumberIn1++; //else NumberIn2++; if (FrapCount>0) p[i].bleached=true; } p[i].DrawParticle(m_g); } if (FrapCount>0){ FrapCount = ++FrapCount%6; m_circ.DrawFilled(m_g,Color.yellow); }else m_circ.Draw(m_g); //m_g.setColor(Color.black); //m_g.drawLine(m_dimImage.width/2,0,m_dimImage.width/2,m_dimImage.height); m_r.drawImage(m_image,0,0,null); ((Frap5a)applet).theChartRed.setFillValue(NumberIn1); //((Frap5a)applet).theChartBlue.setFillValue(NumberIn2); NumberIn2=NumberIn1; if(!((Frap5a)applet).yesdr){ ((Frap5a)applet).yesdr=true; } ImageReady=true; //Thread.sleep(1000); repaint(); } } // catch (InterruptedException e) // { // TODO: Place exception-handling code here in case an // InterruptedException is thrown by Thread.sleep(), // meaning that another thread has interrupted this one // stop(); // } } } // MOUSE SUPPORT: // The mouseDown() method is called if the mouse button is pressed // while the mouse cursor is over the applet's portion of the screen. //-------------------------------------------------------------------------- public boolean mouseDown(Event evt, int x, int y) { ((Frap5a)applet).yesdr=false; //Start=new Point(x,y); //ResetLocation=true; ((Frap5a)applet).dc.NumberIn2=0; if (((Frap5a)applet).nevr){ ((Frap5a)applet).t.start(); ((Frap5a)applet).nevr=false; ((Frap5a)applet).prun=true; }else if (!((Frap5a)applet).prun) { ((Frap5a)applet).t.resume(); ((Frap5a)applet).prun=true; } ((Frap5a)applet).prun=true; ((Frap5a)applet).t.c=0; ((Frap5a)applet).is=0; ((Frap5a)applet).Gr.Str0=" "; ((Frap5a)applet).Gr.data1 = new DataSet(); FrapCount=1; ((Frap5a)applet).xs[((Frap5a)applet).is]=0; ((Frap5a)applet).ys[((Frap5a)applet).is]=((Frap5a)applet).t.c; ((Frap5a)applet).is++; return true; } // MOUSE SUPPORT: // The mouseUp() method is called if the mouse button is released // while the mouse cursor is over the applet's portion of the screen. //-------------------------------------------------------------------------- public boolean mouseUp(Event evt, int x, int y) { return true; } // MOUSE SUPPORT: // The mouseDrag() method is called if the mouse cursor moves over the // applet's portion of the screen while the mouse button is being held down. //-------------------------------------------------------------------------- public boolean mouseDrag(Event evt, int x, int y) { return true; } // MOUSE SUPPORT: // The mouseMove() method is called if the mouse cursor moves over the // applet's portion of the screen and the mouse button isn't being held down. //-------------------------------------------------------------------------- public boolean mouseMove(Event evt, int x, int y) { return true; } // MOUSE SUPPORT: // The mouseEnter() method is called if the mouse cursor enters the // applet's portion of the screen. //-------------------------------------------------------------------------- public boolean mouseEnter(Event evt, int x, int y) { //start(); return true; } // MOUSE SUPPORT: // The mouseExit() method is called if the mouse cursor leaves the // applet's portion of the screen. //-------------------------------------------------------------------------- public boolean mouseExit(Event evt, int x, int y) { //stop(); return true; } } class GraphFrapCanvas5a extends G2Dint { Frap5a app1; static final int POSX = 150; static final int NEGX = 8; static final int POSY = 150; static final int NEGY = 8; int a,b,N,x1,x2,y1,y2,ind,i,j; int np=300; double data[] = new double[2*np]; DataSet data1 = new DataSet(); String Str0=" "; String Str1=" "; String Str2=" "; Color C0,C; Color C1 = Color.black; Color C2 = Color.black; double maxe=0.0; Axis xaxis; Axis yaxis; double xstep; double ystep; public GraphFrapCanvas5a (Applet a){ app1=(Frap5a)a; } public synchronized void paint (Graphics g) { Dimension dm=size(); frame=false; drawzero = false; drawgrid = false; borderRight = 0; borderLeft = 0; borderTop = 0; borderBottom = 0; int x,y,i,j; // ForceSquare(g, new Rectangle(150,150)); square=true; paintAll=true; // attachDataSet(data1); // super.paint(g); // double data[] = new double[2*np]; xstep=(double)dm.width/(double)(POSX+NEGX); ystep=(double)dm.height/(double)(POSY+NEGY); int xax=(int)Math.round(ystep*POSY); int yax=(int)Math.round(xstep*NEGX); g.setColor(Color.blue); g.drawLine(yax,0,yax,dm.height); g.drawLine(0,xax,dm.width,xax); for(i=5;i<(NEGX+POSX+1);i+=10){ x=(int)Math.round(i*xstep); g.drawLine(x,xax-2,x,xax+2); } for(i=0;i<(NEGY+POSY+1);i+=10){ y=(int)Math.round(xax+i*ystep); g.drawLine(yax-2,y,yax+2,y); } for(i=0;i<(POSY+1);i+=10){ y=(int)Math.round(xax-i*ystep); g.drawLine(yax-2,y,yax+2,y); } g.setColor(Color.black); Font f = new Font("TimesRoman",Font.PLAIN,11); g.setFont(f); for(i=10;i<160;i+=20){ g.drawString(" "+i,yax+(int)Math.round(i*xstep)-16,xax+12); } f = new Font("TimesRoman",Font.PLAIN+Font.BOLD,13); g.setFont(f); g.setColor(Color.blue); g.drawString("t",dm.width-13,xax-6); g.drawString("F",yax-12,12); f = new Font("TimesRoman",Font.PLAIN,11); g.setFont(f); g.setColor(Color.black); for(i=150;i>0;i-=10){ g.drawString(" "+i,yax+4,(int)Math.round((POSY-i)*ystep)+5); } /* if(app1.PLOT_AV == 1){ a=10-app1.Particles[app1.Num_Particles.getSelectedIndex()]; b=(int)Math.round(app1.CDiff.total_sum/app1.CDiff.n_runs); app1.xs[app1.is]=a; app1.ys[app1.is]=b; app1.zs[app1.is]=1; app1.is++; app1.PLOT_AV=0; } */ if((app1.PLOT_REAL == 1) && app1.yesdr){ a=app1.t.c; b=app1.dc.NumberIn2; app1.xs[app1.is]=a; app1.ys[app1.is]=b; // app1.zs[app1.is]=app1.Num_Particles.getSelectedIndex(); app1.is++; // g.drawString("x= "+a+" y= "+b,dm.width-95,30); // g.drawString("Calc",2,30); app1.PLOT_REAL=0; } if(app1.PLT == 1){ if(app1.c>=0) { Str0="F(t)= "+(float)((float)Math.round(app1.a*100)/(float)100.0)+" - "+(float)((float)Math.round(app1.b*100)/(float)100.0)+" /(1 + "+(float)((float)Math.round(app1.d*100)/(float)100.0)+"t) + "+(float)((float)Math.round(app1.c*100)/(float)100.0)+" / (1 + "+(float)((float)Math.round(app1.d*100)/(float)100.0)+"t)^2"; }else{ Str0="F(t)= "+(float)((float)Math.round(app1.a*100)/(float)100.0)+" - "+(float)((float)Math.round(app1.b*100)/(float)100.0)+" /(1 + "+(float)((float)Math.round(app1.d*100)/(float)100.0)+"t) "+(float)((float)Math.round(app1.c*100)/(float)100.0)+" / (1 + "+(float)((float)Math.round(app1.d*100)/(float)100.0)+"t)^2"; } // np=300; // maxe=-10; xaxis = createXAxis(); yaxis = createYAxis(); yaxis.setManualRange(true); //new yaxis.maximum=20; //new yaxis.data_window=new Dimension(20,20); //new data1 = new DataSet(); attachAxis(xaxis); //new attachAxis(yaxis); //new xaxis.attachDataSet(data1); yaxis.attachDataSet(data1); // attachDataSet(data1); // data1.deleteData(); maxe=0; for(i=j=0; i<np; i++,j+=2) { data[j] = i*xstep; data[j+1] = (app1.a-app1.b/(1+app1.d*data[j])+app1.c/((1+app1.d*data[j])*(1+app1.d*data[j])))*ystep; // if(data[j+1] > maxe){ // maxe=(int)data[j+1]; // } } for(i=app1.is-app1.is/5; i<app1.is; i++) { maxe+=app1.ys[i]; } maxe=maxe/(app1.is/5); // maxe=(app1.a-app1.b/(1+app1.d*10000)+app1.c/((1+app1.d*10000)*(1+app1.d*10000)))*ystep; data1.deleteData(); // detachDataSets(); try{ data1.append(data,150); } catch (Exception e){ System.out.println("Error appending Data!"); } data1.linecolor = Color.green; data1.linestyle = 1; // data1.yaxis.maximum=150; // attachDataSet(data1); // graph.G2Dint.repaint(); app1.PLT=0; } if(app1.ERR != 1){ // for(i=0;i<(app1.is);i++){ // b=app1.ys[i]; // if((int)Math.round(b*ystep)>maxe){ // maxe=(int)Math.round(b*ystep); // } // } // maxe = (int)Math.round((app1.a-app1.b/(1+app1.d*500)+app1.c/((1+app1.d*500)*(1+app1.d*500)))*ystep); g.drawString(Str0,dm.width-265,15); // g.drawString(""+maxe,dm.width-265,15); // data1.draw_data(g, new Rectangle(15,350-maxe-30,300,maxe-30+30)); // data1.draw_data(g, new Rectangle(15,150,300,175)); // this.repaint(); for(i=0;i<(app1.is);i++){ a=app1.xs[i]; b=app1.ys[i]; N=4; int hit=0; for(j=i;j>=0;j--){ if (a == app1.xs[j]){ if(b == app1.ys[j]){ if(j != i){ hit++; if(hit == 3){ N++; hit=0; } } } } } g.setColor(Color.black); // g.drawString(Str0,dm.width-265,15); g.setColor(Color.red); g.fillOval((int)Math.round((NEGX+a)*xstep),(int)Math.round((POSY-b)*ystep),N,N); } g.drawString("ymax= "+maxe,dm.width-95,30); data1.draw_data(g, new Rectangle(15,(int)Math.round(xax-maxe*ystep),(int)Math.round((NEGX+app1.t.c-5)*xstep),(int)Math.round(maxe*ystep))); }else{ g.setColor(Color.black); g.drawString("Not enough data",dm.width-95,12); app1.ERR=0; } } } class PThread5a extends Thread{ Frap5a a; public int c=0, d=0; public PThread5a(Applet a){ this.a=(Frap5a)a; } public void run(){ while(true){ try{ sleep(2500); } catch(InterruptedException e) {}; if(a.running){ a.prun=true; if(c<151){ a.PLOT_REAL=1; a.Gr.repaint(); c+=5; } // else{ // a.prun=false; // } } try{ sleep(2500); } catch(InterruptedException e) {}; } } }