/*
	line graph written by Fr. Chris Thiel, OFMCap
	29 May 2000 <cct@ktb.net>
*/

import java.awt.*;
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.event.*;
import java.lang.Math;

public class linegraph extends Applet 
{
	//Globals
	
		
	double dx = 0.0; // delta x
	double dy = 0.0; // delta y
	double m = 0.0; // computed slope
	double	b = 0.0; // y intercept
	
	String mouseLocation="";
	boolean s1Moving, s2Moving, s3Moving, s4Moving, s5Moving;
	
	public void init() {
		
		dy=0.0;
		b=0.0;
		
		repaint();
	}
	private int newX (double x) {
		return (int)(225+13.8*x);
	}
	private int newY (double y) {
		return (int)(25+138-13.8*y);
	}
	
	
	public void paint( Graphics g ) {
		
		g.setColor(Color.orange);
		g.fillRect ( 450, 20, 145, 275);
		g.setColor(new Color(0x108000)); //green background from (0,20) to (450,295)
		g.fillRect ( 0, 20, 450, 276);
		g.setColor(new Color(0x08602F)); //lines
		//for(int i = 0; i< 46; i++) g.drawLine( i*10,20,i*10 ,295);
		//for(int i = 0; i< 43; i++) g.drawLine( 0, i*10, 450,i*10 );
		for(int i = -16; i< 17; i++) g.drawLine( newX(i),20,newX(i) ,295); // horizontals
			
		for(int i = -10; i< 11; i++) g.drawLine( 0, newY(i), 450,newY(i) ); //virticals
		g.setColor(Color.black); 
		g.drawLine( 0, newY(0), 450,newY(0) ); // x-axis
		g.drawLine( newX(0),20,newX(0) ,295);  // y=axis
		for(int i = 2; i< 10; i+=2) g.drawString(i+" ", newX(i)-3, newY(0)+9); 
		for(int i = 10; i< 17; i+=2) g.drawString(i+" ", newX(i)-6, newY(0)+9);
		for(int i = -8; i< 0; i+=2) g.drawString(i+" ", newX(i)-8, newY(0)+9);  
		for(int i = -14; i< -9; i+=2) g.drawString(i+" ", newX(i)-12, newY(0)+9); 
		
		for(int i = 2; i< 10; i+=2) g.drawString(i+" ", newX(0)-9, newY(i)+4);
		for(int i = -8; i< 0; i+=2) g.drawString(i+" ", newX(0)-15, newY(i)+4);  
		g.setColor(Color.yellow); 
		if (dx == 0) {
			g.drawLine( newX(b), newY(-10), newX(b),newY(10)); // no slope
		} else {
			g.drawLine( newX(-16), newY(dy*-16/dx+b), newX(16),newY(dy*16/dx+b));
		}
		//g.drawString( "y = ("+dy+"/"+dx+")x + "+b, 30, 30 );
		g.setColor(Color.black); 
		
		
		if ((dx == 0)) {
			g.drawString( "x = "+b, 100, 18 );	
		} else {
		if ((dx != 0) && (dy == 0)) {
			 g.drawString( "y = "+b, 100, 18 );	
		}else{
			if (b > 0) g.drawString( "y = ("+m+")x + "+b, 100, 18 );
			if (b < 0) g.drawString( "y = ("+m+")x "+b, 100, 18 );
			if (b == 0) g.drawString( "y = ("+m+")x ", 100, 18 );
		}}
		g.drawString("Control Sliders", 479, 18);
		g.drawString(mouseLocation, 250, 18);
		g.drawString("Equation: ", 40, 18);
		//g.drawString("dots", 200+12, 18);
		g.drawString("run", 464, 30);
		g.drawString("Æx", 464, 40);
		g.drawString("rise", 498, 30);
		g.drawString("Æy", 498, 40);
		g.drawString("y intercept", 533, 30);
		g.drawString("b", 533, 40);
		//g.drawString("separation", 540, 30);
		
		// Rails for controling sliders
		g.drawLine ( 475, 50, 475, 270);
		g.drawLine ( 505, 50, 505, 270);
		g.drawLine ( 535, 50, 535, 270);
		/*
		g.drawLine ( 555, 50, 555, 270);
		g.drawLine ( 580, 50, 580, 270);
		*/
		// labels for the sliders
		g.drawString (" "+dx, 460, 290);
		g.drawString (" "+dy, 492, 290);
		g.drawString (" "+b, 525, 290);
		/*
		g.drawString (" "+df, 542, 290);
		g.drawString (" "+sep, 570, 290);
		*/
		g.setColor(Color.black);
		g.fillOval(472,50+(int)(11.0*(10-dx)), 7,5);
		g.setColor(Color.blue);
		g.fillOval(502,50+(int)(11.0*(10-dy)), 7,5);
		g.setColor(Color.red);
		g.fillOval(532,50+(int)(11.0*(10-b)), 7,5);
		
		/*
		g.fillOval(552,50+(int)(55.0*(2+df)), 7,5);
		g.setColor(Color.gray);
		g.fillOval(577,50+(sep), 7,5);
		*/
		
		
	}
	/*
     * Mouse methods
     */
	 public boolean mouseDown(java.awt.Event evt, int x, int y) {
      // Find out if user is manipulating a slider
     
        if ( s1Moving || s2Moving || s3Moving || s4Moving || s5Moving) {
        	s1Moving =false;
        	s2Moving =false;
        	s3Moving =false;
        	s4Moving =false;
        	s5Moving =false;
        } else {
      
        	if ( x > 470 && x < 480 ) { s1Moving =true; }
        	if ( x > 500 && x < 510 ) { s2Moving =true; }
        	if ( x > 530 && x < 540 ) { s3Moving =true; }
        	if ( x > 550 && x < 560 ) { s4Moving = true; }
        	if ( x > 575 && x < 585 ) { s5Moving = true; }
        	
       }
       /*
       if (boxbox.inside(x,y) ) box=!box;
       if (dotbox.inside(x,y) ) dot=!dot;
	 */
       repaint();
        return true;
    }
	
  	
  	
    public boolean mouseMove(java.awt.Event evt, int x, int y) {
    	double mx, my; // mouse location
    	mouseLocation="";
       	if (x < 470) {
       		 mx = Math.floor((x-225)/1.38)/10;
        	 my = Math.floor((163-y)/1.38)/10;
       		 mouseLocation="last mouse click: (" + mx + ", " + my + ")";
        }
        getAppletContext().showStatus(mouseLocation);
        // transform slider movement in terms of the varible it controls
        // y varies from 50 to 270, a range of 220
         if (s1Moving){
         	requestFocus();
        	dx = 10-(y-50)/11.0;
        	  
        	repaint();
         } else {
          if (s2Moving){
          	requestFocus();
          	dy = 10-(y-50)/11.0;
          	repaint();
          }else {
          if (s3Moving){
         	requestFocus();
        	b = 10-(y-50)/11.0;  
        	
        	repaint();
        	
         } else {
         if (s4Moving){
         	//requestFocus();
        	//df = -2+(y-50)/55.0;  
        	
			//yl = df;
			//yr = df;
        	//repaint();
         }else {
          if (s5Moving){
         	//requestFocus();
        	//sep = y - 50;  
        	//repaint();
      
         
        	
         }}}}}
         
         
         
         //check for limits
         if (dx > 10) dx=10;
         if (dx < -10) dx=-10;
         if (dy > 10) dy=10;
         if (dy < -10) dy=-10;
         if (b >  10) b = 10.0;
         if (b < -10) b =-10.0;
        /*
         if (df >  2) df =  2.0;
         if (df < -2) df = -2.0;
         if (sep > 220) sep=220;
         if (sep < 0) sep =0;
         */
         
         //smooth the reals
       
         dy = (int)(dy*10)/10.0;
         dx = (int)(dx*10)/10.0;
         b = (int)(b*10)/10.0;
     	 m = Math.round(dy*100/dx)/100.0;
        return true;
    }

    public void mouseEnter() {
        repaint();
    }

    public void mouseExit() {
       
        repaint();
    }

}