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


class Para {
  private double x,y;
  public Para(double x, double y) { this.x=x; this.y=y; }
  public double x() { return x; }
  public double y() { return y; }
}


class Wykr extends JComponent {
  private double t;
  private Funkcja fun;
  public Wykr(double t, Funkcja fun) { this.t = t;  this.fun = fun;}

  private int przeliczX(double x) {
    return (int)((x-fun.poczX)*fun.skala);
  }

  private int przeliczY(double y) {
    return (int)((fun.konY-y)*fun.skala+5);
  }

  public void paintComponent(Graphics g) {
    g.setColor(Color.GRAY);
    // os pozioma:
    g.drawLine(
      przeliczX(fun.poczX),przeliczY(0),
      przeliczX(fun.konX),przeliczY(0)
    );
    // os pionowa:
    g.drawLine(
      przeliczX(0),przeliczY(fun.poczY),
      przeliczX(0),przeliczY(fun.konY)
    );

    g.setColor(Color.RED);
    // wykres:
    Para p=fun.f(fun.poczT);
    for (double t1=fun.poczT+fun.krokT; t1<=t; t1+=fun.krokT) {
      Para nowaP = fun.f(t1);
      g.drawLine(
        przeliczX(p.x()), przeliczY(p.y()),
        przeliczX(nowaP.x()), przeliczY(nowaP.y())
      );
      p = nowaP;
    }
    g.fillOval(przeliczX(p.x())-3, przeliczY(p.y())-3, 6,6);
  }
}


class Wykres {
  public static void main(String[] args) throws InterruptedException {
    Funkcja fun = new Funkcja();
    double  zakresX = (fun.konX-fun.poczX)*fun.skala,
            zakresY = (fun.konY-fun.poczY)*fun.skala;

    JFrame okno = new JFrame(fun.nazwa);
    okno.setSize((int)zakresX+10,(int)zakresY+40);
    okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    okno.setVisible(true);

    for (double t=fun.poczT+fun.krokT; t<=fun.konT; t+=fun.krokT) {
      okno.add(new Wykr(t, fun));
      okno.validate(); Thread.sleep(fun.zwloka);
      okno.getContentPane().removeAll();
    }
  }
}
