// Linear Regression by Exner Enterprises, C.1997-99 // November 4, 1999 // Author: Nicholas Exner // http://www.uiuc.edu/ph/www/exner // Free to redistribute/publish/modify pending that // the above comments are retained. import java.applet.*; import java.awt.*; import java.awt.event.*; import java.net.URL; import java.util.*; public class Line2 extends Applet { Image offscreenImage; Graphics h; int appSizeX, appSizeY; Vector objVect; Spread window; public void init(){ appSizeX=this.size().width; appSizeY=this.size().height; setBackground(Color.white); LinePoint.loadImages(this); offscreenImage = createImage(appSizeX, appSizeY); h = offscreenImage.getGraphics(); window = new Spread(h); window.resize(136,285); Point d = location(); window.move((d.x+400),d.y); window.hide(); objVect = new Vector(); objVect.addElement(new LinePoint(window)); objVect.addElement(new ExnerSlideBar(364,123)); repaint(); } public void paint(Graphics g) { Enumeration e = objVect.elements(); while(e.hasMoreElements()) { ShowableObject c = (ShowableObject)e.nextElement(); c.show(h); } g.drawImage(offscreenImage,0,0,this); } public boolean mouseDown(Event evt, int x, int y) { System.out.println("x: "+(x)+"y: "+(y)); // Debug position Enumeration e = objVect.elements(); while(e.hasMoreElements()) { ShowableObject c = (ShowableObject)e.nextElement(); c.setMousePoint(x,y); } if (x > 589&& x < 617) if (y> 185 && y <206) window.show(); if (x > 319&& x < 472) if (y> 143 && y <169) ShowableObject.drawBlue= true; if (x>=355 && x <=434) if (y>=173 && y < 198) { window.hide(); for (int i=0; i < 12; i++) { CellMatrix.cellArray[0][i].putValue(""); CellMatrix.cellArray[1][i].putValue(""); } } window.repaint(); repaint(); return true; } public boolean mouseUp(Event evt, int x, int y) { return true; } public boolean mouseDrag(Event evt, int x, int y) { Enumeration e = objVect.elements(); while(e.hasMoreElements()) { ShowableObject c = (ShowableObject)e.nextElement(); c.mouseDrag(x,y); } repaint(); return true; } public void update(Graphics g) { paint(g); } } // End class Line2 /////////////////// ShowableObject Class //////////////////////////// class ShowableObject extends Applet { static boolean drawBlue=false; public void show (Graphics g) { return; } public void keyPress(Event evt, int key) { return; } public void mouseDrag(int x, int y) { return; } public void setMousePoint(int x ,int y) { return; } } ///////////// New Line Stuff Class ////////// class LinePoint extends ShowableObject { int maxPoints=50, xspots[], yspots[]; int currspots = 0, spotX=0, spotY=0, prevX=0, prevY=0; double m=0, b=0, m2=0, averagex=0, averagey=0; int lastx=0, lasty=0; static Image backImg,barImg; boolean notMoveMode=true; Spread window; boolean paintLine; public LinePoint(Spread window2) { // Constructor for class xspots = new int[maxPoints]; yspots = new int[maxPoints]; window=window2; resetGraph(); } public static void loadImages(Applet parent) { backImg = parent.getImage(parent.getCodeBase(),"back.jpg"); barImg = parent.getImage(parent.getCodeBase(),"bar.jpg"); } public void setMousePoint(int x, int y) { if (x>=25 && x <=175){ if (y>=20 && y<=170) addspot(x-25,y-20); if (notMoveMode) m2=0; } else { if (x>=355 && x <=434) if (y>=173 && y < 198) resetGraph(); } } public void addspot(int x, int y) { if (notMoveMode) { if (!paintLine && currspots= 12) { window.resize(136,10+(currspots*25)); } currspots++; } prevX=x; prevY=y; } } public void resetGraph() { paintLine = false; for (int i=0; i< maxPoints; i++) { xspots[i]=0; yspots[i]=0; } window.resize(136,285); currspots=0; averagex=0; averagey=0; ShowableObject.drawBlue= false; notMoveMode=true; } private boolean calculateRegression() { // Verify that at least two points have been clicked. int n = currspots; if (n < 2) return false; // Method of least squares... double sumx = 0.0; double sumxx = 0.0; double sumy = 0.0; double sumxy = 0.0; for(int i=0; i < currspots; i++){ sumx+=(xspots[i]+0.0); sumy+=(yspots[i]+0.0); sumxx+=((xspots[i]+0.0)*(xspots[i])); sumxy+=((xspots[i]+0.0)*(yspots[i])); } double den = sumxx - sumx * sumx / n; if (den != 0) m = (sumxy - sumx * sumy / n ) / den; else m = 3.14/2.0; b = (sumy - m * sumx) /n; averagex=(sumx/n); averagey=(sumy/n); return true; } public int figureFit() { int fit; if (Math.abs(m) < 1){ double y2 = -m2*(averagex-150)+averagey; double y1 = -m*(averagex-150)+averagey; fit = (int)Math.abs(y2-y1); } else { double x2 = (averagey+20)/m2+averagex; double x1 = (averagey+20)/m+averagex; fit = (int)Math.abs(x2-x1); } if (fit > 125) fit=125; return fit; } public void show( Graphics g) { g.drawImage(backImg,0,0,this); showLine(g); if (currspots > 1) g.drawImage(barImg,198,167-figureFit(),this); drawStripImage(g, backImg,20,172,165,30); // Top Numbers drawStripImage(g, backImg,20,0,165,20); // Bottom Numbers drawStripImage(g, backImg,192,168,42,45); // Bulb // Show Spots g.setColor(Color.blue); for (int i=0; i < currspots; i++) { g.fillOval(xspots[i]-2+25,yspots[i]+20-2,4,4); } } // End Show public void showLine( Graphics g) { g.setColor(Color.blue); // Plot a straight line through the points. if (calculateRegression()) { int xright = 150; if (ShowableObject.drawBlue) g.drawLine(25, (int)b+20, xright+25, 20+(int)(m * xright + (b))); g.setColor(Color.red); //Midpoint to side g.drawLine((int)averagex+25, (int)averagey+20, xright+25, 20+(int)averagey+(int)(-m2*(averagex-xright))); // left to midpoint g.drawLine((int)averagex+25, (int)averagey+20, 25, 20+(int)averagey+(int)(- m2*(averagex))); g.drawString("y = "+cutDouble(-m2)+"x + "+ cutDouble2(averagey+(m2*averagex)),510,80); if (ShowableObject.drawBlue) { g.setColor(Color.blue); g.drawString("y = "+cutDouble(-m)+"x + "+ cutDouble2(averagey+(m*averagex)),510,180); } } } // End showLine public double cutDouble(double value) { int dog; dog = (int)(value*1000); return dog/1000.0; } public double cutDouble2(double value) { int dog; value= (value*2.0)/30.0; dog = (int)(value*10); return dog/10.0; } public void mouseDrag(int x, int y) { if (notMoveMode) { if (x > lastx) { m2+=incrementUp(); if (m2 > 15 || m2 < -15) { System.out.println("Change signs."); m2 = -m2+2; } } if (x < lastx) { m2-=incrementUp(); if (m2 > 15 || m2 < -15) { System.out.println("Change signs."); m2 = -m2-2; } } } System.out.println("Slope m: "+m+" Slope m2:" + m2); lastx = x; lasty = y; } public double incrementUp() { double increment=.1; if (m2 < 1 && m2 > -1) increment=.1; if (m2 > 3 || m2 < -3) increment=1; return increment; } public void drawStripImage(Graphics g, Image imagePtr,int drawX, int drawY,int width, int length) { Graphics subArea = g.create(drawX, drawY, width, length); int stripX = drawX; //(imageNum-1)*imageWidth; int stripY = drawY; //0; subArea.drawImage(imagePtr, -stripX, -stripY, this); subArea.dispose(); } } // End Class /////////////////// ExnerSlideBar Class /////////////////////////////// class ExnerSlideBar extends ShowableObject { private int xPos=0,yPos=0,width=50,valuePos=0; private boolean selected=false; public ExnerSlideBar() { valuePos = width/2; } public ExnerSlideBar(int x, int y){ xPos=x; yPos=y; valuePos = width/2; } public void show(Graphics g){ g.setColor(Color.white); g.fillRect(xPos,yPos+1,width,2); // x line g.setColor(Color.black); g.drawRect(xPos,yPos+1,width,2); // x line g.setColor(Color.white); g.fill3DRect(xPos+valuePos,yPos-4,6,12,true); // value line } public int getValue() { return (valuePos*2); //System.out.println("ValuePos= "+valuePos+"."); } public void reset() { valuePos = width/2; } public void setMousePoint(int x, int y) { if (x>=(xPos+valuePos) && x <=(xPos+valuePos+6)) { if (y>=(yPos-4) && y<=(yPos+8)) { selected=true; } } return; } public void unsetMousePoint(int x, int y) { selected=false; } public void mouseDrag(int x, int y) { if (selected) { if (y >= (yPos-5) && y <= (yPos+9)) { if (x >= (xPos+width)) valuePos=width; if (x <= xPos) valuePos= 0; if (x < (xPos+width) && x > xPos) valuePos=Math.abs(xPos-x); } } } } // End Class ExnerSlideBar