/****
 * PlotFunction draws a function f(x) in a graphics window.
 *
 * See exercise 9 on page 296 of King's book "Java Programming."
 *
 * @author JimMahoney
 * @version Nov 5, 2002
 *
 ***/

import java.awt.*;
import jpb.*;

class PlotFunction {

    // The various dimensions and what-not.
    private final static int WINDOW_SIZE	= 400;
    private final static double X_MAX		= 6.0;
    private final static double X_MIN		= -2.0;
    private final static double Y_MAX		= 1.5;
    private final static double Y_MIN		= -1.5;
    private final static double DX		= 0.05;
    private final static double X_TICKS		= 1.0;
    private final static double Y_TICKS		= 0.5;
    private final static Color AXES_COLOR	= Color.darkGray;
    private final static Color PLOT_COLOR	= Color.red;
    private final static String WINDOW_TITLE	= "Plot Function";

    // These two variables are used by all the various subroutines.
    // Make sure they're initialized (in main()) before doing anything else.
    private static DrawableFrame df;
    private static Graphics g;

    //  f(x) is the function to be plotted.
    private static double f(double x){
	return Math.sin( 5.0*x ) * Math.cos( x/5.0 );
    }

    // The same function as a string, for the graph label.
    private static String fAsString(){
	String s = "f(x) = sin(5x) cos(x/5)";
	return s;
    }

    // Convert from (x,y) coordinates to pixels in the horizontal direction.
    private static int xToPix(double x){
	return (int)( ( x - X_MIN ) / ( X_MAX - X_MIN ) * WINDOW_SIZE);
    }

    // Convert from (x,y) coordinates to pixels in the vertical direction.
    private static int yToPix(double y){
	return (int)( ( Y_MAX - y ) / ( Y_MAX - Y_MIN ) * WINDOW_SIZE);
    }

    private static void plot(){
	g.setColor(PLOT_COLOR);
	double x1 = X_MIN;
	double y1 = f(x1);
	double x2;
	double y2;
	while ( x1 < X_MAX ){
	    x2 = x1+DX;
	    y2 = f(x2);
	    g.drawLine( xToPix(x1), yToPix(y1), xToPix(x2), yToPix(y2) );
	    x1 = x2;
	    y1 = y2;
	}
    }

    private static void drawAxes(){
	g.setColor(AXES_COLOR);
	g.drawLine( xToPix(X_MIN), yToPix(0.0), xToPix(X_MAX), yToPix(0.0) ); // X axis
	g.drawLine( xToPix(0.0), yToPix(Y_MIN), xToPix(0.0), yToPix(Y_MAX) ); // Y axis

	int fontSize = WINDOW_SIZE/30;  // as specified in the assigment on pg 296.
	g.setFont(new Font("SansSerif", Font.PLAIN, (int)(WINDOW_SIZE/30) ));

	// This method assumes that (0,0) is in the graph.
	for (double x=X_TICKS; x<X_MAX; x+=X_TICKS){
	    g.drawLine( xToPix(x), yToPix(0.0)-5, xToPix(x), yToPix(0.0)+5);
	    g.drawString(""+x, xToPix(x)-10, yToPix(0.0)+20);
	}
	for (double x=-X_TICKS; x>X_MIN; x-=X_TICKS){
	    g.drawLine( xToPix(x), yToPix(0.0)-5, xToPix(x), yToPix(0.0)+5);
	    g.drawString(""+x, xToPix(x)-10, yToPix(0.0)+20);
	}
	for (double y=Y_TICKS; y<Y_MAX; y+=Y_TICKS){
	    g.drawLine( xToPix(0.0)-5, yToPix(y), xToPix(0.0)+5, yToPix(y));
	    g.drawString(""+y, xToPix(0.0)-30, yToPix(y)+4);
	}
	for (double y=-Y_TICKS; y>Y_MIN; y-=Y_TICKS){
	    g.drawLine( xToPix(0.0)-5, yToPix(y), xToPix(0.0)+5, yToPix(y));
	    g.drawString(""+y, xToPix(0.0)-30, yToPix(y)+4);
	}
    }


    public static void main(String[] args){

	// Create window "df", set its size, and make it white.
	df = new DrawableFrame(WINDOW_TITLE);
	df.show();
	df.setSize(WINDOW_SIZE, WINDOW_SIZE);

	// Create the graphics object "g", and fill it with white.
	g = df.getGraphicsContext();
	g.setColor(Color.white);
	g.fillRect(0,0,WINDOW_SIZE,WINDOW_SIZE);

	// Plot the function.
	drawAxes();
	plot();

	// Label the graph
	g.setColor(Color.blue);
	g.drawString( fAsString(), WINDOW_SIZE/2, 40 );

	// Make sure that all the changes to the window are now visible.
	df.repaint();

    }


}


syntax highlighted by Code2HTML, v. 0.9.1