import sk.uniba.fmph.pocprak.simplegraphics.*;
import sk.uniba.fmph.pocprak.ioutils.*;
import java.io.FileNotFoundException;
import sk.uniba.fmph.pocprak.genutils.wait;

public class Tlak {

  public static GrGraphics g;
  public static biliard b;
  public static int npar=900;  //celkovy pocet castic v biliarde
  public static double deltat = 0.01; //toto nema vplyv na presnost iba na animaciu
                         //ked nastavime male delta t uvidime pomalu simulaciu
  public static particle[] par;
  public static double vsigma = 1.; //odmocinia zo stredneho kvadaratu rychlosti v smere jednej osi0
  public static double celkovyCas =20; //celkovy cas ma byt vacsi ako 10, lebo sa zapisuju
                                       //vysledky az po uplynuti casu 10



  public static void init() {
    g = SimpleGraphics.CreateGrEnvironment(); //otvorime graficke okno
    g.setBasePoint(g.CENTER);  //nastavime referencny bod do stredu okna
    g.setUserFrameSize(0., 0., 0.5, 0.5); //uzivatelske suradnice refer. bodu a praveho horneho rohu okna

    //teraz inicializujeme biliard
    b = new biliard(new point( -0.4, -0.4), new point( -0.4, 0.4),
                    new point(0.2, 0.4), new point(0.4, -0.4));//toto su styri vrcholy biliardu

    par = new particle[npar]; //inicializacia pola pre ulozenie castic
    for (int ipar = 0; ipar < npar; ipar++) {
      par[ipar] = new particle();

      //vsetky castice nechame startovat z toho isteho bodu (0.1,0.0) vnutri biliardu
      par[ipar].r.x =0.2;
      par[ipar].r.y = 0.;

      //kazdej castici pridelime nahonu gaussovsku rychlost
      //stredna kvadraticka rychlost v kazdom smere bude vsigma
      //pojem stredna kvadraticka rychlost je skratka pre odmocninu zo
      //ztredneho kvadratu rychlosti
      par[ipar].v.x = vsigma*W.rn.nextGaussian();
      par[ipar].v.y = vsigma*W.rn.nextGaussian();
    }
  }

  public static void main(String[] args) throws Exception{
    //najprv inicializujeme biliard a vsetky castice
    init();
    Killer.createKiller();
    W.outfile=OutTextFile.open("narazy.txt"); //sem sa budu zapisovat udaje o narazoch na stenu

    b.draw(g); //nakresli hranice biliardu
    g.repaint();

    W.t=0; //inicializacia globalneho casu
    wait.calibrate();	//calibrate the wait methods for the particular computer
    while(W.t<celkovyCas) {
       wait.milis(50);
      g.clearImage(); //vygumuje vsetky stare poly castic, ale zial aj biliardove steny
      b.draw(g); //znovu nakresli biliardove steny
      for (int ipar = 0; ipar < npar; ipar++) {
        par[ipar].move(deltat); //posunie kazdu casticu do buducnosti o deltat
        par[ipar].r.draw(g); //nakresli novu polohu kazdej castice
      }
      W.t=W.t+deltat; // posunie globalny cas do buducnosti o deltat
       
      //toto bude blikat a bude sa zdat, ze sa stratia nejake casi pohybu
      //dovod je skryty v paralelnom spracovani vypoctu a kreslenia po obrazovke
      //je to dost hlboko vnutri javy, a keby sme chceli zvysit kvalitu animacie
      //dost by sme sa napracovali
      g.repaint(); //zobrazi obrazok na obrazovku
    }
    System.out.println("Simulacia skoncila, mozete zatvorit graficke okno");
    W.outfile.close(); //sme poriadkumilovni, preto zatvorime vystupny subor
  }
}
