public class Oscilator {

// v tomto kode je niekde chyba, skomiluje sa to, ale nebude to dobre fungovat. Opravte ju.

  public static boolean linear = true; //vsetky oscilatory su rovnake, preto static
  public double x;
  public double p;
  public static double m=0.1;
  public static double K=m*4.*Math.PI*Math.PI;//default je perioda 1 sekunda
  public static double gamma=0; //default je nulove trenie
  public Oscilator() {
    this(0.1,0);
  }
  public Oscilator(double x, double p){
    this.x=x; this.p=p;
  }
  
  // stav oscilatora mame urceny dvojicou (x,p), preto v podla potreby
  // vzdy dopocitavame
  public double getv(){
    return p/m;
  }

  public double f(double x){
    if(linear)return -K*x-gamma*getv();
    else return -K*Math.sin(x)-gamma*getv();
  }

  public void makeStep(double deltat){
    double xnew = x+getv()*deltat;
    double pnew = x+f(x)*deltat;
    x=xnew;
    p=pnew;
  }
}
