import java.util.Random;
public class Oscilator {
  // premenne rovnake pre vsetky oscilatory su deklarovane ako static
  public static boolean zrazky = false;
  public static boolean linear = true;

  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

  //inicializujeme Rusku Ruletu vyuzijuc jeden spolocny globalny
  //nahodny generagtor W.r
  public static RuskaRuleta rr=new RuskaRuleta(W.r);
  
  
  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;
  }
  
  //Epot vrati hodnotu potencialnej energie
  //Konstanta pre nelinearny model je volena tak, aby
  //potencialne energia pre vychylku x=0.3 bola rovanaka ako pre
  //linearny oscilator
  public static double Epot(double x){
    if(linear) return 0.5*K*x*x;
    else return 0.5*K/(0.3*0.3)*x*x*x*x;
  }
  
  // Toto musi byt (a aj je) konzistentne so vzorcami pre potencialnu energiu
  public double f(double x){
    if(linear)return -K*x;
    else return -K*x*x*x*(2/(0.3*0.3));
  }

  public void zrazka(){
    //simuluje efekt zrazky s casticou o hmote M a hybnosti P
    double M = Projektil.M;
    double P = Projektil.getP();  // tu sa nahodne vygenerovala hybnost narazajuceho projektilu
    
    x=x;     // suradnica v zrazke sa nemeni, zbytocny prikaz, zvysuje citatelnost

    // sem naprogramujte okamzitu smenu hybnosti oscilatora, ktory
    // sa prave zrazil s projektilom s hybnstou P a hmotnostou M
    ???????????????????
    
  }
  public void makeStep(double deltat){
    double xnew = x+getv()*deltat;
    double pnew = p+f(x)*deltat;
    x=xnew;
    p=pnew;
    if (!zrazky)return;
    if(rr.isHit(deltat)){
      zrazka();
    }
  }
}
