import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.URL;
import java.util.*;
import graph.*;
/*************************************************************************
**
**    Applet linear1a
**                                              Version 1.0   January 1996
**
**************************************************************************
**    Copyright (C) 1996 Leigh Brookshaw
**
**    This program is free software; you can redistribute it and/or modify
**    it under the terms of the GNU General Public License as published by
**    the Free Software Foundation; either version 2 of the License, or
**    (at your option) any later version.
**
**    This program is distributed in the hope that it will be useful,
**    but WITHOUT ANY WARRANTY; without even the implied warranty of
**    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**    GNU General Public License for more details.
**
**    You should have received a copy of the GNU General Public License
**    along with this program; if not, write to the Free Software
**    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**************************************************************************
**
**    This is a simple applet that demonstrates how to use the basic features
**    of the Plotting Class library. The data is calculated locally by
**    the applet
**
*************************************************************************/

public class pulsewt5a extends Applet implements AdjustmentListener{
	LoadData dynamic;
      	Graph2D graph1; 
	Image osi=null;

	Graphics osg=null;
	int iwidth = 0;
	int iheight=0; int yvalue=0;
     	DataSet data1;
	DataSet data3;
	DataSet data4;
      	Axis    xaxis1;
      	Axis    yaxis1;
      	double data[];double errorsum;
	double spots[];
      	int np =70;
	int p=6;
      	URL markersURL;
      	Markers markers;
      	Panel      panel;
     	 Label title;
	
	Scrollbar power, intercept;
	TextField equation, errortext;
	int i,j; double m1,m2,m3,m4,a0; 
	int lx =100; int ly = 100; double az=200; double bz=85;
	int mx=10; int my=10;
	
      public void init() {
        

       		double data[] = new double[2*(np+3)];
	        	setLayout( new BorderLayout() );		
		
		
		equation=new TextField("best fit curve: ", 30);
		add("South", equation);
		equation.reshape(310,5,365,30);
		errortext =new TextField("sum of squares: ",40);
		add("South", errortext);
		errortext.reshape (335,35,300,30);
		intercept = new Scrollbar(Scrollbar.HORIZONTAL,2200,1,1500,2500);
		add("South", intercept);intercept.reshape(395,380,300,10);
		intercept.addAdjustmentListener(this);
		power = new Scrollbar(Scrollbar.HORIZONTAL, -150,1,-250,-150);
		add("South",power);power.reshape(50,380,150,10);
		power.addAdjustmentListener(this);
		Label interceptlabel=new Label("Ao");

		add("South", interceptlabel); interceptlabel.reshape(350,380,50,20);

		Label powerlabel=new Label("power"); 

		add("South",powerlabel); 

	
/*	
**      Get the passed parameters
*/
       		 String st = getParameter("TITLE");
       		 String mfile    = getParameter("MARKERS");
		String points =getParameter("POINTS");
/*
**      Create the Graph instance and modify the default behaviour
*/
       		 graph1 = new Graph2D();
		dynamic = new LoadData();
       		 graph1.drawzero = false;
       		 graph1.drawgrid = true;
       		 graph1.borderRight = 0;
        		graph1.setDataBackground(new Color(126,241,158));
	

        
/*
**      Build the title
*/
       		 title = new Label(st, Label.CENTER);
       		 title.setFont(new Font("TimesRoman",Font.PLAIN,20));



/*
**      Load a file containing Marker definitions
*/
       		 try {
           			markersURL = new URL(getDocumentBase(),mfile);
          			 markers = new Markers(markersURL);
			 } 
	  	 catch(Exception e) 
			{
          			 System.out.println("Failed to create Marker URL!");
       			 }
        
 
       		graph1.setMarkers(markers);
        		add("Center", graph1);

/*

**      Calculate the first data Set.

*/

           		 data[0]=-100; data[1]=0.0; data[2]=600; data[3]=600;

       		 data1 = graph1.loadDataSet(data,2);

        		data1.linecolor   =  Color.red;

        		data1.linestyle = 0;

        		data1.marker    = 0;

        		data1.markerscale = 1.0;


/*
**      Start a new thread and load the data
*/
        		try {
        			data3 = dynamic.loadDataSet(new URL(getDocumentBase(),points), graph1);
       		 } catch (Exception e) {
          			System.out.println("Failed to load data file!");
       				 }
/*
**      Specify the data line color
*/

		data3.linecolor   = Color.red;
		data3.linestyle=0;
        		data3.marker      = 2;
		data3.markerscale = 2.0;
       		 data3.markercolor =Color.black;
       


/*
**	data set 4
*/
		lx=2200; m2=((double) lx)/10;
		 ly=0; m3=((double) ly)/1000; 
       		 for(i=j=0; i<np+3; i++,j+=2) 
			{
           			data[j] = ( ((double) i)/10)*  ((double) i);
           		 	data[j+1] = m2*(Math.pow(data[j], m3));
        			}

        		data4 = graph1.loadDataSet(data,np);
        		data4.linecolor   =  Color.blue;
        		data4.linestyle = 1;
        		data4.marker    = 0;
        		
        		data4.markercolor = new Color(0,0,255);
        
        
/*	
**      Attach data sets to the Xaxes
*/
       		 xaxis1 = graph1.createAxis(Axis.BOTTOM);
  		xaxis1.attachDataSet(data1); 
		xaxis1.attachDataSet(data3);
		xaxis1.attachDataSet(data4);
        		xaxis1.setTitleText("weight in kg");
       		 xaxis1.setTitleFont(new Font("TimesRoman",Font.PLAIN,20));
       		 xaxis1.setLabelFont(new Font("Helvetica",Font.PLAIN,15));
		xaxis1.setTitleColor( new Color(0,0,255) );
        
/*
**      Attach the first data set to the Left Axis
*/
        yaxis1 = graph1.createAxis(Axis.LEFT);
        yaxis1.attachDataSet(data1);
	yaxis1.attachDataSet(data3);
		yaxis1.attachDataSet(data4);
        yaxis1.setTitleText("pulse");
        yaxis1.setTitleFont(new Font("TimesRoman",Font.PLAIN,20));
        yaxis1.setLabelFont(new Font("Helvetica",Font.PLAIN,15));
        yaxis1.setTitleColor( new Color(0,0,255) );
        yaxis1.setTitleRotation(90);
	
	
	}

	
public void adjustmentValueChanged(AdjustmentEvent ade)
	{ lx = intercept.getValue();
		intercept.setValue(lx);
		ly = power.getValue();
		power.setValue(ly);
		
		m1=(double) ly; m2=((double) lx)/10 ; m3=m1/1000;
	
		double other[]= new double[2*(np+3)];


	 	for(i=j=0; i<np+3; i++,j+=2) 
		{
           		other[j] = ( ((double) i)/10)*((double) i);
           
            		other[j+1] = m2*(Math.pow(other[j], m3));
        		}
        
	data4.delete(0,np+3);
		try{    data4.append(other,np+3);}
		     
                   catch (Exception e) {
                        System.out.println("Error appending Data!");
                   }
        
       	xaxis1.setManualRange(true);
		data4.xaxis.minimum=-100.0; data4.xaxis.maximum=600.0;
		yaxis1.setManualRange(true);
		        data4.yaxis.minimum=0.0; data4.yaxis.maximum=600.0;  
		   equation.setText(" Best Fit curve: P= "+m2+"W ^ "+m3);
               equation.setFont(new Font("TimesRoman",Font.PLAIN,24));    
    
	Graphics g;			
	g = graph1.getGraphics();
                   if( osi == null || iwidth != graph1.size().width
                                   || iheight != graph1.size().height  ) 
		{
                      	 iwidth = graph1.size().width;
                      	 iheight = graph1.size().height;
                       	osi = graph1.createImage(iwidth,iheight);
                       	osg = osi.getGraphics();
	                   }
                   osg.setColor(this.getBackground());
                   osg.fillRect(0,0,iwidth,iheight);
                   osg.setColor(g.getColor());
                   osg.clipRect(0,0,iwidth,iheight);

	osg.setColor(Color.black);
	osg.fillRect(0,0, iwidth,iheight);
                   graph1.update(osg);
	osg.setColor(Color.black);
	double spots[] = new double[2];
	int places[] =new int[2*p]; errorsum=0.0;

	for(i=j=0; i<p; i++,j+=2) 
		{
		spots=data3.getPoint(i);

          		 places[j] = xaxis1.getInteger(spots[0]);
          		 places[j+1] = yaxis1.getInteger(spots[1]);
		yvalue = yaxis1.getInteger(m2*(Math.pow(spots[0], m3)));
	errorsum=errorsum+(m2*(Math.pow(spots[0], m3))-spots[1])*(m2*(Math.pow(spots[0], m3))-spots[1]);

		osg.drawLine(places[j],places[j+1],places[j],yvalue);
      		 }

	errortext.setText("sum of sq.=  " +( (int) (errorsum))); 
	errortext.setFont(new Font("TimesRoman",Font.PLAIN,24));

                   g.drawImage(osi,0,0,graph1);
			
	}
public void destroy(){
	osg.dispose();
	}
public void update(Graphics screen){
	paint(screen);
	}
		
	
 

}

        
		




