
package morgan;


import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;


public class MorganClass extends JComponent implements ChangeListener
{
protected Vector xValues1 = new Vector();
protected Vector yValues1 = new Vector();
protected Vector xValues2 = new Vector();
protected Vector yValues2 = new Vector();
protected double xPos = 0.0;
protected double yPos = 0.0;
protected int size = 10;
protected double factor = 1.0;

public MorganClass( )
	{
	setDoubleBuffered( true );
	}

public void paint( Graphics g )
	{
	drawGraph( g );
	}


protected void drawGraph(Graphics g)
	{
	Graphics2D g2d = (Graphics2D)g;
	int i;
	int j;
	AffineTransform at = new AffineTransform();
	g2d.translate(xPos, yPos);
	at.setToScale(factor, factor);
	g2d.transform(at);
	g2d.translate(-xPos, -yPos);

	// Draw Grid
	g2d.setColor(Color.red);
	for(i=0; i<20; ++i)
		{
		j = i*size;
		g2d.drawLine(i*size,0,i*size,(19 * size));
		}

	for(i=0; i<20; ++i)
		{
		j =  i*size;
		g2d.drawLine(0,i*size,(19 * size),i*size);
		}

	g2d.setColor(Color.blue);

	// Draw Line
	drawLineToPoints(g2d, xValues1, yValues1, xValues2, yValues2);
	}


// Function to draw the line
protected void drawLineToPoints(Graphics2D g2d, Vector xValues1, Vector 
	yValues1, Vector
	xValues2, Vector yValues2)
	{
        for(int a=0; a<xValues1.size(); ++a)
        	{
                g2d.drawLine(getInt(xValues1, (a)),((19 * size + 1) -
			getInt(yValues1, (a))),getInt(xValues2, (a)),((19 * size + 1) - 
			getInt(yValues2, (a))));
        	}
	}


protected int getInt( Vector vect , int index )
	{
	double dbl = ( (Double)( vect.elementAt( index ) ) ).doubleValue();
	return( (int) dbl );
	}


public void stateChanged( ChangeEvent e )
	{
	JSlider slide = (JSlider)( e.getSource() );
	int val = slide.getValue();
	factor = val / 10.0;
	repaint();
	}


public void initVals( )
	{
	int count;
	xValues1.setSize( 2000 );
	yValues1.setSize( 2000 );
	xValues2.setSize( 2000 );
	yValues2.setSize( 2000 );
	
	for( count = 0 ; count < 1000 ; count++ )
		{
		int index = count;
		double xval1 = ( count ) / 10.0;
		double yval1 = 100.0 * ( Math.cos( ( count ) / 100.0 ) + 1.0 );
		double xval2 = ( count + 1 ) / 10.0;
		double yval2 = 100.0 * ( Math.cos( ( count+ 1 ) / 100.0 ) + 1.0 );
		xValues1.setElementAt( new Double( xval1 ) , index );
		yValues1.setElementAt( new Double( yval1 ) , index );
		xValues2.setElementAt( new Double( xval2 ) , index );
		yValues2.setElementAt( new Double( yval2 ) , index );
		}

	for( count = 0 ; count < 1000 ; count++ )
		{
		int index = count + 1000;
		double xval1 = ( count ) / 10.0;
		double yval1 = 100.0 * ( Math.sin( ( count ) / 100.0 ) + 1.0 );
		double xval2 = ( count + 1 ) / 10.0;
		double yval2 = 100.0 * ( Math.sin( ( count + 1 ) / 100.0 ) + 1.0 );
		xValues1.setElementAt( new Double( xval1 ) , index );
		yValues1.setElementAt( new Double( yval1 ) , index );
		xValues2.setElementAt( new Double( xval2 ) , index );
		yValues2.setElementAt( new Double( yval2 ) , index );
		}

	}


public static void main( String[] in )
	{
	JFrame fr = new JFrame();
	MorganClass morg = new MorganClass();
	morg.initVals();
	morg.setMinimumSize( new Dimension( 400 , 400 ) );
	morg.setPreferredSize( new Dimension( 400 , 400 ) );
	JSlider slide = new JSlider( 10 , 100 , 10 );
	slide.addChangeListener( morg );
	Container pane = fr.getContentPane();
	pane.setLayout( new BorderLayout( 0 , 0 ) );
	pane.add( "Center" , morg );
	pane.add( "South" , slide );
	fr.pack();
	fr.show();
	}


} /* MorganClass*/



