import java.util.*;

class Elephant2 {

    static final double EP_DOT  = 0.015;
    static final double EP_LINE = 0.001;

    static double x(double xc, double yc, double r, double t, double phi){
        return xc + r*Math.cos(t+phi);
    }

    static double y(double xc, double yc, double r, double t, double phi){
        return yc + r*Math.sin(t+phi);
    }

    public static void main(String[] args) {
        //StdDraw.setCanvasSize(2*512,2*512);
        StdDraw.enableDoubleBuffering();
        final double XMIN = -200.0;
        final double XMAX = 200.0;
        final double YMIN = -200.0;
        final double YMAX = 200.0;


        int nSteps = 300;

        StdDraw.setXscale(XMIN, XMAX);
        StdDraw.setYscale(YMIN, YMAX);


        double xc1 = 0;
        double yc1 = 0;
        double xc2;
        double yc2;
        double rayon1 = 100;
        double rayon2 = 50;
        double vitesse1 = 1;
        double vitesse2 = 4;
        double phi1 = 0.75;
        double phi2 = 1.5;

        double[] tTraceX = new double[nSteps];
        double[] tTraceY = new double[nSteps];

        String fileName;

        for (int step=0; step<nSteps; step++){
            double t = 2*step*Math.PI/nSteps;
            StdDraw.clear();
            // calcul de xc2 et yc2
            xc2 = x(xc1, yc1, rayon1, vitesse1*t, phi1);
            yc2 = y(xc1, yc1, rayon1, vitesse1*t, phi1);

            // calcul de la position courante du point 'traçant' sur le dernier cercle
            tTraceX[step] = x(xc2, yc2, rayon2, vitesse2*t, phi2);
            tTraceY[step] = y(xc2, yc2, rayon2, vitesse2*t, phi2);

            // tracé des cercles et des points
            StdDraw.setPenRadius(EP_DOT);
            StdDraw.setPenColor(StdDraw.ORANGE);
            StdDraw.point(xc1, yc1);

            StdDraw.setPenRadius(EP_LINE);
            StdDraw.setPenColor(StdDraw.DARK_GRAY);
            StdDraw.circle(xc1, yc1, rayon1);

            StdDraw.setPenRadius(EP_DOT);
            StdDraw.setPenColor(StdDraw.ORANGE);
            StdDraw.point(xc2, yc2);

            StdDraw.setPenRadius(EP_LINE);
            StdDraw.setPenColor(StdDraw.DARK_GRAY);
            StdDraw.circle(xc2, yc2, rayon2);


            // tracé de la trajectoire du point traçant
            StdDraw.setPenRadius(EP_DOT);
            StdDraw.setPenColor(StdDraw.BLUE);
            for (int k=0; k<step; k++) {
                StdDraw.point(tTraceX[k], tTraceY[k]);
            }
            StdDraw.setPenRadius(EP_DOT);
            StdDraw.setPenColor(StdDraw.ORANGE);
            StdDraw.point(tTraceX[step], tTraceY[step]);
            StdDraw.show();
            StdDraw.pause(20);

            fileName = "Elephant" + "_" + step + ".jpg";
            StdDraw.save("vid/"+fileName);
        }

    }
}