/* RegressionApplet.java */

package regress;

import java.applet.*;
import java.awt.*;
import java.util.Vector;
import java.util.Enumeration;

/**
* RegressionApplet.java
* @author Charles Stanton					
* @version April 10 1997					
* 
*/
public class RegressionApplet extends Applet {
	int numberPlotPoints =0;
	int sumxx=0;
	int sumyy=0;
	int sumxy=0;
	int sumx = 0;
	int sumy =0 ;
	double Sxx, Sxy, Syy;
	double a, b;    	//regression coefficients
	RegressionCanvas rc;
	RegressionControlPanel rcp;
	Vector v = new Vector();  	//vector of points
	ResidualCanvas resc;
	Vector residuals = new Vector();   //vector of residuals
	Panel upperPanel = new Panel();		//for canvases
	FlowLayout fl = new FlowLayout();


/**
* initialization method for applet
*/
	public void init(){
		rc= new RegressionCanvas(this);
	 	rcp = new RegressionControlPanel(this);
		resc = new ResidualCanvas(this,residuals);
		setLayout(new BorderLayout());
		add("Center",upperPanel);
		upperPanel.setLayout(fl);
		upperPanel.add(rc);
		upperPanel.add(resc);
		add("South",rcp);
		rc.setBackground(Color.white);
	}

/**  
*  add a point to the vector of points
* @param p the point to be added
*/

	public void addPlotPoint(PlotPoint p){
		v.addElement(p);
		numberPlotPoints++;
		sumx += p.x;
		sumy += p.y;
		sumxx += p.x*p.x;
		sumyy += p.y*p.y;
		sumxy += p.x*p.y;
		}


/** 
* clear
*/
	public void clear(){
		v = new Vector();
		numberPlotPoints=0;
		sumxx=0;
		sumyy=0;
		sumxy=0;
		sumx = 0;
		sumy =0 ;
		rc.clear();
		rcp.clear();
		}

	public Vector regress() {
		Vector resid = new Vector();
		PlotPoint p,q;
		double currentResidual;
		double n = (double)numberPlotPoints;
		Sxx = sumxx-sumx*sumx/n;
		yy = sumyy-sumy*sumy/n;
		Sxy = sumxy-sumx*sumy/n;
		b =Sxy/Sxx;
		a = (sumy-b*sumx)/n;
		for (Enumeration e= v.elements();
			e.hasMoreElements(); ) {
			p = (PlotPoint)e.nextElement();
			currentResidual = p.y-(a+b*p.x);
			q = new PlotPoint(p.x, (int)currentResidual);
			resid.addElement(q);	
			}
		return resid;

		}
		
	public void calculate() {
		if (numberPlotPoints >1) {
			residuals=regress();
			rcp.update(a,b);
			resc.update(residuals);
			}
		}

}

	
