/** Regression **/ import java.awt.*; import java.applet.*; public class Regress extends Applet { static Point A = new Point(0,0), B = new Point(0,0); static Point O = new Point(0,0); static Point U = new Point(20,20); static int Height, Width; static int N = 0; final int maxN = 100; static double dataPoints[][] = new double[100][2]; static double meanX = 0.0, meanY = 0.0; static double varX = 0.0, varY = 0.0, covXY = 0.0; static double slope, intercept; static double x, y; static boolean clrflg = false; public void aw2px(Point t, double x, double v){ t.x = (int)( x * (double)U.x + (double)O.x ); t.y = (int)( - v * (double)U.y + (double)O.y ); } public void init() { setBackground(Color.white); setForeground(Color.black); setLayout(new BorderLayout()); add("South", new Button("Clear")); } public void paint(Graphics g) { Height = size().height; Width = size().width; O.x = Height / 2; O.y = Width / 2; draw_coordinate(g); draw_data(g); } public void draw_data(Graphics g) { int i = 0; double x, y; Point A = new Point(0,0); while ( i < N && i < maxN ) { g.setColor(Color.blue); x = dataPoints[i][0]; y = dataPoints[i][1]; aw2px(A, x, y); g.drawString("("+x+","+y+")", A.x, (int)A.y); g.setColor(Color.red); g.fillOval(A.x-4, A.y-4, 8, 8); i++; } if ( N > 2 ){ g.setColor(Color.black); aw2px(A, -10.0, -10.0 * slope + intercept); aw2px(B, 10.0, 10.0 * slope + intercept); g.drawLine(A.x, A.y, B.x, B.y); g.drawString("Y="+slope+"X+"+intercept,10,28); g.drawString("mean(X)="+meanX+", mean(Y)="+meanY,10,14); } } public void draw_coordinate(Graphics g) { g.setColor(Color.blue); for (int i = -10; i <= 10; i++) { aw2px(A, -10,i); aw2px(B, 10,i); g.drawLine(A.x, A.y, B.x, B.y); } for (int i = -10; i <= 10; i++) { aw2px(A, i,-10); aw2px(B, i, 10); g.drawLine(A.x, A.y, B.x, B.y); } g.setColor(Color.black); aw2px(A,0,-10); aw2px(B,0, 10); g.drawLine(A.x, A.y, B.x, B.y); aw2px(A,-10,0); aw2px(B,10,0); g.drawLine(A.x, A.y, B.x, B.y); } public void setdata(int x, int y){ double dx = 0.0, dy = 0.0, dn = 0.0; dx = ((double)x - (double)O.x) / (double)U.x; dy = - ((double)y - (double)O.y) / (double)U.y; dn = (double)N; if ( N < maxN ) { dataPoints[N][0] = dx; dataPoints[N][1] = dy; meanX = (meanX * dn + dx)/(dn+1.0); meanY = (meanY * dn + dy)/(dn+1.0); varX = (varX * dn + (dx - meanX) * (dx - meanX))/(dn+1.0); varY = (varY * dn + (dy - meanY) * (dx - meanY))/(dn+1.0); covXY = (covXY * dn + (dx - meanX) * (dy - meanY))/(dn+1.0); slope = (varX != 0.0) ? (covXY/varX) : 0.0; intercept = meanY - slope * meanX; this.x = x; this.y = y; repaint(); N++; } } public void cleardata(){ int i=0; while ( i <= N ){ dataPoints[i][0] = 0.0; dataPoints[i][1] = 0.0; meanX = 0.0; meanY = 0.0; varX = 0.0; varY = 0.0; covXY = 0.0; i++; } N = 0; } public boolean action(Event ev, Object arg) { if (ev.target instanceof Button){ String l = ((Button)ev.target).getLabel(); if ( "Clear".equals(l) ){ cleardata(); repaint(); } } return true; } public boolean mouseDown( Event evt, int x, int y ) { switch( evt.clickCount ) { case 1: setdata(x, y); break; } return true; } public boolean handleEvent(Event e) { if (e.id == Event.WINDOW_DESTROY) { stop(); destroy(); System.exit(0); return true; } else { return super.handleEvent(e); } } public static void main(String args[]) { PFrame f = new PFrame("Regression"); Regress regression = new Regress(); regression.init(); regression.start(); f.add("Center", regression); f.resize(450, 500); f.show(); } } class PFrame extends Frame { PFrame(String title) { super(title); } public boolean handleEvent(Event e) { if (e.id == Event.WINDOW_DESTROY) { dispose(); System.exit(0); } return false; } }