All pastes #800702 Raw Edit

Someone

public text v1 · immutable
#800702 ·published 2007-11-28 17:59 UTC
rendered paste body
package applet;
import java.awt.*;
import java.awt.event.*;
 
public class PolyApplet extends java.applet.Applet     
implements ActionListener, ItemListener, MouseListener//, Runnable 
{
 //COLORS
 Color colGlob      = new Color(200,170,150);
 Color colGloblight = new Color(240,220,200);
 Color colButton    = new Color(176,176,176);
 Color colMaroon    = new Color(128,0,0);
 Color colNavy      = new Color(0,0,128);
 Color colPale      = new Color(255,255,220);
 Color colPanel     = new Color(230,195,172);
 
 //FONTS
 Font fontS11  = new Font("System", Font.PLAIN, 11);
 Font fontSB11 = new Font("System", Font.BOLD, 11);
 Font fontS12  = new Font("System", Font.PLAIN, 12);
 Font fontSB12 = new Font("System", Font.BOLD, 12);
 Font fontA11  = new Font("Arial", Font.PLAIN, 11);
 Font fontA10  = new Font("Arial", Font.PLAIN, 10);
 
 List list1 = new List(11, false);
 TextField edit1 = new TextField("1", 2); 
 TextField edit2 = new TextField("", 4);
 TextField edit3 = new TextField("", 4);
 
 Button butDec = new Button("Decr");
 Button butInc = new Button("Incr");
 Button butClear = new Button("CLEAR");
 
 //VARIABLES
 final int X0=23, Y0=38, DX0=290, DY0=290, Nmax=200, Dmax=12;
 int Np=0, Dm=1;
 int Fun=1;
 double Ccoef, SumSq;
 double [] XVa = new double[Nmax+1];
 double [] YVa = new double[Nmax+1];
 double [] A   = new double[Nmax+1];
 boolean Frun=true, Fplot;
 
//===================================================================
 public void paint(Graphics g) 
 {
 PseudoPanels();
 ClearPlot();
  DrawGrid();
 }
//===================================================================
 public void init() 
 {
  addMouseListener(this);
  setLayout(null);
  setBackground(colGlob);
 
  // ....... title+copyright ........
  Label LabTitle = new Label("Least-Squares Polynomial Appoximation");
  Label LabCopyR = new Label("          Designed by C. E. Efstathiou, Department of Chemistry, University of Athens, GREECE");
  add(LabTitle,0,0,480,20,fontSB12,colNavy);
  LabTitle.setForeground(Color.white);
  add(LabCopyR,0,350,480,20,fontS11,colGlob);
  LabCopyR.setForeground(colGloblight);
  
  int Y=26;
  Label LabelSel = new Label("Polynomial degree",Label.CENTER);
  add(LabelSel,330,Y,143,16,fontSB11,colPanel);
  LabelSel.setForeground(colMaroon);
  
  add(butDec,338,Y+17,34,21,fontS12,colButton);
  butDec.addActionListener(this);
  add(butInc,431,Y+17,34,21,fontS12,colButton);
  butInc.addActionListener(this);
 
  add(edit1,382,Y+17,39,21,fontS11,colGloblight);
  edit1.setEditable(false);
 
  Y=70;
  Label Lab2a = new Label("Coefficient of",Label.CENTER);
  Label Lab2b = new Label("determination",Label.CENTER);
  add(Lab2a,333,Y-1,78,12,fontS11,colPanel);
  add(Lab2b,333,Y+10,78,12,fontS11,colPanel);
  Lab2a.setForeground(colMaroon);
  Lab2b.setForeground(colMaroon);
  add(edit2,412,Y,53,21,fontS11,colGloblight);
  edit2.setEditable(false);
 
  Y=95;
  Label Lab3a = new Label("Sum of squared",Label.CENTER);
  Label Lab3b = new Label("residuals",Label.CENTER);
  add(Lab3a,333,Y-1,78,12,fontS11,colPanel);
  add(Lab3b,333,Y+10,78,12,fontS11,colPanel);
  Lab3a.setForeground(colMaroon);
  Lab3b.setForeground(colMaroon);
  add(edit3,412,Y,53,21,fontS11,colGloblight);
  edit3.setEditable(false);
 
  add(butClear,366,330,72,19,fontS12,colButton);
  butClear.addActionListener(this);
  add(list1,337,131,128,190,new Font("Courier",Font.PLAIN,11),colPanel);
  list1.setBackground(colPale);
  }
//===================================================================
 void add(Component c, int x, int y, int w, int h, Font f, Color b) 
     { // helper method to add components
  c.setBounds(x, y, w, h); 
  c.setFont(f); 
  c.setBackground(b); 
  c.setForeground(Color.black);
  add(c);
 }
//===================================================================
 void PseudoPanels()
 {
 Graphics g = getGraphics();
 g.setColor(colPanel);
 g.fillRect(6,26,DX0+30,DY0+31);
 g.fillRect(330,26,143,96);
 g.fillRect(330,126,143,200);
 }
//===================================================================
 void ClearPlot()
 {
 Graphics g = getGraphics();
 g.setColor(new Color(225,255,255));
 g.fillRect(X0,Y0+1,DX0+1,DY0-1);
 }
//===================================================================
 void DrawGrid()
 {
 Graphics g = getGraphics();
 g.setFont(fontA11);
 FontMetrics FM0 = g.getFontMetrics();
 int I,X,Y;
 
 g.drawRect(X0-1,Y0,DX0+2,DY0);
 int ofsX,ofsY,e;  String stX="", stY="";
 for (I=0; I<=10; I++)
     {
     stX=""+I; stY=""+(10-I);
     ofsX=FM0.stringWidth(stX); ofsY=FM0.stringWidth(stY);
     X=X0+I*29; Y=Y0+I*29;
     g.setColor(Color.black);
     if ((I>0)&&(I<10))g.drawLine(X,Y0+DY0,X,Y0+DY0-5);    
     if ((I>0)&&(I<10)) g.drawLine(X0,Y,X0+4,Y);
     if (I==10) e=6; else e=0;
     g.setColor(colNavy);
     if (I>0) g.drawString(stX,X-ofsX/2+1,Y0+DY0+12);   
     g.drawString(stY,X0-3-ofsY,Y+4+e);
     }
 }
   //===================================================================
 void DrawPoint(int x, int y, Color col) 
 {
 Graphics g = getGraphics();
 g.setColor(col);
 g.fillRect(x-2,y-2,4,4);
 }
//===================================================================
 double GetValueX(int Xp) 
 { 
 return (Xp-X0)*10.0/(double)DX0 + 0.10*Math.random()- 0.05;
 }
//===================================================================
 double GetValueY(int Yp)
 { 
 return (Y0+DY0-Yp)*10.0 /(double)DY0 + 0.10*Math.random()- 0.05;
 }
//===================================================================
 Point GetPhysPos(double Xv, double Yv) 
 {
 return new Point(X0+(int)Math.round(Xv*DX0/10), Y0+DY0-(int)Math.round(Yv*DY0/10));
 }
//===================================================================
 double CalcY(double X) 
 {
 double Pr,Sum; int I,J;
 Sum=A[0];
 for (I=1; I<=Dm; I++) 
     {
     Pr=1;
     for (J=1; J<=I; J++) Pr*=X;
     Sum+=A[I]*Pr;
     }
 return Sum;
 }
//===================================================================
 void DrawCurve() 
 {
 double Xr,Yr; int I,Xp,Yp, oldX=0, oldY=0;
 Graphics g = getGraphics();
 g.setColor(Color.black);
 for (I=0; I<=DX0; I++) 
     {
     Xr=10.0*I/(double)DX0;
     Yr=CalcY(Xr);
     Point p=GetPhysPos(Xr,Yr);
     Xp=p.x; Yp=p.y;
     if (Yp<Y0) Yp=Y0;
     if (Yp>Y0+DY0) Yp=Y0+DY0;
     if (I!=0) g.drawLine(oldX,oldY,Xp,Yp);
     oldX=Xp; oldY = Yp;
     }
  
 for (I=1; I<=Np; I++) 
     {
     Point p=GetPhysPos(XVa[I],YVa[I]);
     Xp=p.x; Yp=p.y;
     DrawPoint(Xp,Yp,Color.red);
     }
     Fplot = true;
 }
//===================================================================
 void CorCoefficient() 
 {
 double Ymean=0, SUMn, SUMd, Yth; int I;
 for (I=1; I<=Np; I++) Ymean+=YVa[I];
 Ymean/=Np;
 SUMn=0; SUMd=0;
 for (I=1; I<=Np; I++) 
     {
     Yth=CalcY(XVa[I]);
     SUMn += (YVa[I]-Yth)*(YVa[I]-Yth);
     SUMd += (YVa[I]-Ymean)*(YVa[I]-Ymean);
     }
 if (Math.abs(SUMd)<1e-7) return;
 Ccoef= 1-SUMn/SUMd;
 SumSq=SUMn;
 }
//===================================================================
 void CalculateCoef() 
 {
 boolean jump = false; int I,J,K=0; double LOC,S,Z;
 double [] AA  = new double[2*Dmax+2];
 double [][] R = new double[Dmax+2][Dmax+3];
 double [] T   = new double[Dmax+3];
  
 for (I=1; I<=2*Dmax+1; I++) AA[I]=0;
 for (I=1; I<=Dmax+1; I++) for (J=1; J<=Dmax+2; J++) R[I][J]=0;
 for (I=1; I<=Dmax+2; I++) T[I]=0;
 
 AA[1]=Np;
 for (I=1; I<=Np; I++) 
     {
     for (J=2; J<=2*Dm+1; J++) AA[J]+=Math.pow(XVa[I],J-1);
     for (K=1; K<=Dm+1; K++) 
     {
     LOC=Math.pow(XVa[I],K-1);
     R[K][Dm+2]=T[K]+YVa[I]*LOC;
     T[K]+=YVa[I]*LOC;
     }
     T[Dm+2] += YVa[I]*YVa[I];
     }
 
 for (J=1; J<=Dm+1; J++) for (K=1; K<=Dm+1; K++) R[J][K]=AA[J+K-1];
 for (J = 1; J <= Dm + 1; J++) 
     {
     for (K=J; K<=Dm+1; K++) if (Math.abs(R[K][J])>1e-30) 
     {
     jump=true; break;
     }
  if (!jump) return;
  jump = false;
  for (I=1; I<=Dm+2; I++) 
      {
      S=R[J][I]; R[J][I] = R[K][I]; R[K][I]=S;
      }
  Z=1/R[J][J];
  for (I=1; I<=Dm+2; I++) R[J][I]*=Z;
  for (K=1; K<=Dm+1; K++) 
      {
      if (K==J) jump = true;
      if (!jump) 
         {
     Z=-R[K][J];
     for (I=1; I<=Dm+2; I++) R[K][I]+=Z*R[J][I];
     }
   jump=false;
   }
  }
  for (J=0; J<=Dm; J++) A[J]=R[J+1][Dm+2];
 }
//===================================================================
 void DoAll() 
 {
 int I;
 if (Np>Dm) 
  {
  CalculateCoef();
  CorCoefficient();
  ClearPlot(); DrawGrid();
  DrawCurve();
  edit2.setText(""+(Math.round(10000*Ccoef)/10000.0));
  edit3.setText(""+(Math.round(100*SumSq)/100.0));
  list1.removeAll();
  String st;
  for (I=0; I<=Dm; I++) 
      {
      int m=5 - (int)(Math.log(A[I])/2.302585093);
      if (m<0) m=0;
      st=" = "; if (I>9) st="= ";
      if (A[I]>=0) st=st+"+";
      list1.add("a"+I+st+((double)Math.round(Math.pow(10,m)*A[I])/Math.pow(10,m)));
      }
  }
 }
//===================================================================
 public void actionPerformed(ActionEvent e) 
 {
 if (e.getSource()==butClear)
 {
 Np=0; Dm=1;
 edit1.setText("1");
 edit2.setText(""); edit3.setText("");
 list1.removeAll();
 ClearPlot(); DrawGrid();
 }
 if (e.getSource()==butDec) 
 {
 if (Dm>1) Dm--; else return;
 edit1.setText(""+Dm);
 DoAll();
 }
 
 if (e.getSource()==butInc) 
 {
 if (Dm<Dmax) Dm++; else return;
 edit1.setText(""+Dm);
 DoAll();
 }
 }
//===================================================================
 public void itemStateChanged(ItemEvent e) 
 {
 Checkbox c = (Checkbox) e.getSource();
 }
//===================================================================
 public void mousePressed(MouseEvent e) 
 {
 double Xv, Yv;
 int x = e.getX(); int y = e.getY();
 if ((!((x>X0)&&(x<X0+DX0)&&(y>Y0)&&(y<Y0+DY0)))||(Np==Nmax)) return;
 Xv=GetValueX(x); Yv=GetValueY(y);
 DrawPoint(x,y,Color.red);
 Np++;
 XVa[Np]=Xv; YVa[Np]=Yv;
 DoAll();
 }
//===================================================================
 public void mouseClicked(MouseEvent e) {}
 public void mouseReleased(MouseEvent e) {}
 public void mouseEntered(MouseEvent e) {}
 public void mouseExited(MouseEvent e) {}
}

 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////