public class particle {
  /**
   * poloha castice
   */
  public point r;

  /**
   * rychlost castice
   */
  public vector v;
  /**
   * hmotnost castice
   */
  public static double m = 0.001; //vsetky castice maju rovnaku hmotnost, preto static

  public particle(){
    this(new point(0,0),new vector(0,0));
  }

  public particle(point r, vector v){
    this.r=r;
    this.v=v;
  }

  /**
   * posunie casticu do novej polohy, do ktorej sa dostane svojou rychlostou
   * za cas t. Rychlost dastice sa nezmeni
   */
  public void move(double t){
    hit h=Tlak.b.nexthit(this); //spyta sa biliardu kedy a do coho je nasledujuci naraz tejto castice this

    if(h.hittime<=t+1.e-5){//istime sa malym pridavkom casu, aby nepreskocila von
      //ak sme sa dostali sem, znamena to, ze castica narazi na stenu skor ako v case t

      makehit(h);//tu poziadame casticu aby narazila na stenu v prislusnom case
                 //informacia o tom case a o narazovej stene je schovana v premennej h

      //teraz vypocitame o aku dobu sa este treba posunut dalej do buducnosti po naraze
      double newt =t-h.hittime;
      if (newt <0) return; //toto by nemalo nastat, je to tu ako poistka kvoli zaokruhlovacim chybam

      //teraz poziadame o novy popsun o zbytok povodne ziadaneho casu
      //je to rekurzia, metoda move vola samu seba, ale to je povolene !!!
      move(newt);
    }
    else{
     //ak sme sa dostali sem, znamena to ze castica v priebehu
     //casu t nenarazi, treda sa len posunie do buducnosti bez narazu
     r.x = r.x + v.x * t;
     r.y = r.y + v.y * t;
    }
  }

  /**
   * Vykona odraz, teda posunie casticu do bodu odrazu a zmeni prislusne rychlsot
   */
  public void makehit(hit h){
    //V metode je niekde chyba, sa nevypocita dobre. Najdite ju a opravte
  
    //v objekte hit h je schovana informacia o naraze
    //h.hittime je doba narazu od globalneho casu W.t
    //h.hitsegment.direction je objekt typu vector
    //je to jednotkovy vektor v smere hrany biliardu na kotrej nastane naraz

    //napred posunieme casticu do bodu odrazu
    r.x=r.x+v.x*(h.hittime-1.e-4);//istime sa aby nevyletela von, odrazi sa kusok pred stenou
    r.y=r.y+v.y*(h.hittime-1.e-4);//istime sa, aby nevyletela von, odrazi sa kusok pred stenou


    //teraz vypocitame priemet vektora rychlosti castice do smeru narazovej hrany biliardu
    double priemet = vector.scalarproduct(v,h.hitsegment.direction());

    //vypocitame vektor - tangencialnu zlozku dopdadovej rychlsoti
    vector vtangent =   vector.times(priemet,h.hitsegment.direction());

    //vypocitame vektro - normalovu zlozku dopdadovej rychlsoti
    vector vnormal = vector.plus(v,vector.times(-1.,vtangent)); // toto je normalova zlozka rychlosti

    //teraz vypocitame rychlost po odraze tak, ze zmenime znamienko normalovej zlozky a ponechame tangencialnu
    //teda vektor odrazovej rychlosti je sucet tangencialnej zlozky a obratenej normalovej zlozky
    v = vector.plus(vtangent,vector.times(1.,vnormal));

    //Narazy do steny s identifikatorom 0 sledujeme a zapisujeme do suboru
    //Zapisujema ale len narazy, ktore nastanu po uplynuti prvych 10 sekund, aby uz
    //castice boli rovnomerne rozlozene v objeme
    if (h.hitsegmentid==0){
      //zmena rychlosti ma velkost dvojnasobku absolutnej hodnoty normalovej zlozky
      double deltav = 2*vnormal.abs();
      double casnarazu = W.t+h.hittime;
      if(casnarazu>10)W.outfile.println(casnarazu+" "+ deltav);
    }
  }
}
