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

public class EulerFormula extends JPanel {
    double xs;
    public EulerFormula(double x) {
	super();
	xs = x;
    }
	
    public void paintComponent(Graphics gfx) {
	super.paintComponent(gfx);         // standard setup
	Graphics2D g = (Graphics2D) gfx;
	g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
			   RenderingHints.VALUE_ANTIALIAS_ON);
	
	g.translate(200, 200);
	g.scale(100, -100);
	g.setStroke(new BasicStroke(0.01f));

	GeneralPath grid = new GeneralPath();
	for (float x = -2;  x <= 2; x += 0.5f) {
	    grid.moveTo(x, -2);
	    grid.lineTo(x, 2);
	}
	for (float y = -2;  y <= 2; y += 0.5f) {
	    grid.moveTo(-2, y);
	    grid.lineTo(2, y);
	}
	g.setPaint(Color.lightGray);
	g.draw(grid);

	GeneralPath axes = new GeneralPath();
	axes.moveTo(-2, 0);
	axes.lineTo(2, 0);
	axes.moveTo(0, -2);
	axes.lineTo(0, 2);
	g.setPaint(Color.black);
	g.draw(axes);

	g.setStroke(new BasicStroke(0.015f));
	g.setPaint(new Color(1f, 0.5f, 0.5f));
	g.draw(new Ellipse2D.Float(-1, -1, 2, 2));

	AffineTransform transform = new AffineTransform();
	double term = 1;
	GeneralPath path = new GeneralPath();
	path.moveTo(0, 0);
	int k = 1;
	while(term > 0.001) {
	    Point2D.Double point = new Point2D.Double(term, 0);
	    transform.transform(point, point);
	    path.lineTo((float) point.x, (float) point.y);
	    transform.translate(term, 0);
	    transform.rotate(Math.PI/2);
	    term *= xs/k;
	    k++;
	}
	g.setColor(new Color(0.5f, 0.5f, 1f));
	g.draw(path);
    }

    public static void main(String[] args) {
	EulerFormula euler = new EulerFormula(1.7);
	euler.setBackground(Color.white);
	euler.setPreferredSize(new Dimension(401, 401));
	JFrame frame = new JFrame("EulerFormula");
	frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	frame.getContentPane().add(euler);
	frame.pack();
	frame.setVisible(true);
    }
}

	
