import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class CubicGraphApplet extends JApplet {
    public void init() {
	CubicPanel panel = new CubicPanel();
	getContentPane().add(panel, BorderLayout.CENTER);
    }
}

class CubicPanel extends JPanel  {
    public void paintComponent(Graphics gfx) {
        super.paintComponent(gfx);
        setBackground(Color.white);
        Graphics2D g = (Graphics2D) gfx;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                           RenderingHints.VALUE_ANTIALIAS_ON);
        AffineTransform transform = new AffineTransform();
        transform.translate(150, 150);
        transform.scale(1, -1);
        transform.scale(75, 50);

        g.setPaint(Color.lightGray);
        GeneralPath path = new GeneralPath();
        for (int i = -2; i <= 2; i++) {
            path.moveTo(i, -3);
            path.lineTo(i, 3);
        }
        for (int i = -3; i <= 3; i++) {
            path.moveTo(-2, i);
            path.lineTo(2, i);
        }

        g.draw(transform.createTransformedShape(path));
        int steps = 100;
        float dx = 4.0f/steps;
        g.setPaint(Color.black);
        path = new GeneralPath();
        path.moveTo(-2, valueAt(-2));
        for (float x = -2+dx;  x <= 2; x += dx)
            path.lineTo(x, valueAt(x));
        g.draw(transform.createTransformedShape(path));
    }

    public float valueAt(float x) {
        return x*x*x-x;
    }
    
}
