import sk.uniba.fmph.pocprak.simplegraphics.GrGraphics;
/**
 * reprezentuje lamavu opticku rovinu
 */
public class OptRovina
    implements OpticalSurface {
  /**
   * poloha roviny na optickej osi
   */
  double x;
  /**
   * index lomu vlavo od roviny
   */
  double n1;
  /**
   * index lomu vpravo od roviny
   */
  double n2;
  public OptRovina(double x, double n1, double n2){
    this.x = x;
    this.n1 = n1;
    this.n2 = n2;
  }
  public boolean movesTowards(Beam b) {
    if (b.dir.x == 0) {
      return true;
    }
    if ( (b.p.x - x) * b.dir.x < 0) {
      return true;
    }
    return false;
  }

  public void SurfaceEffect(Beam b) {
    vector n = new vector(1., 0.); //normalovy vektor
    vector tau = new vector(0., 1.); //tangencialny vektor
    if (b.dir.x==0)return; //ak sa luc uz nesiri, jednoducho vratime bez efektu
      //predpokladame sirenie sa zlava doprava
      //najprv vypocitame novy priemet na tang. vektor
      double priemettau = n1 / n2 * vector.scalarproduct(b.dir, tau);
      if(Math.abs(priemettau)>0.99999){
        b.dir.x=0;
        b.dir.y=0;
        return;
      }
      //teraz velkost priemetu na normal. vektor
      double priemetn = Math.sqrt(1 - priemettau * priemettau);
      //skonstruujeme novy vektor dir
      b.dir = vector.plus(vector.times(priemettau, tau),
                          vector.times(priemetn, n));
      //nastavime index dalsej plochy
      b.OptSurfId++;

    
  }

  public void draw(GrGraphics gr, Tubus t) {
    gr.drawLine2D(x,-t.r,x,t.r);
  }
}
