import sk.uniba.fmph.pocprak.simplegraphics.GrGraphics;
/**
 * reprezentuje lamavu opticku rovinu
 */
public class OptSfera
    implements OpticalSurface {
  /**
   * poloha vrcholu sfery na optickej osi
   */
  double x;
  /**
   * index lomu vlavo od sfery
   */
  double n1;
  /**
   * index lomu vpravo od sfery
   */
  double n2;
  /**
   * polomer krivosti sfery, ak je kladny, je stred  vpravo od vrcholu
   * ak zaporny stred je vlavo od vrcholu
   */
  double r;
  /**
   * bod v ktorom je stred krivosti plochy
   */
  point S;

  public OptSfera(double x, double r, double n1, double n2){
    this.x = x;
    this.r = r;
    this.n1 = n1;
    this.n2 = n2;
    S=new point(x+r,0); // toto je konzistentne so znamienkovou konvenciou o r
  }
  /**
   * vrati normalovy vektor na sferu v bode p leziacom na sfere smerujuci zlava doprava
   * @param b Beam v bode tohto Beamu sa rata normalovy vektor
   * @return vector normalovy vektor v bode b.p
   */
  private vector normal(point p){
    vector dist= new vector(S,p);// vektor z bodu p do bodu S
    if(r<0) dist=vector.times(-1.,dist);//pre r<0 treba otocit smer
    return dist.unit();

  }
  public boolean movesTowards(Beam b) {
    double dist= (new vector(b.p,S)).abs(); //vzdialenost bodu beamu od stredu krivosti plochy
    
      if(r>0){
        if(dist>r) return true;
        else return false;
      }
      else{
        if(dist<Math.abs(r)) return true;
        else return false;
      }
    
  }

  public void SurfaceEffect(Beam b) {
      // na tomto mieste doplne kod aby vypocital novy smer b.dir
      // ispirujte sa podobnou procedureou v OptRovina.java   
    
      //index novej plochy
      b.OptSurfId++;
    
    

  }

  public void draw(GrGraphics gr, Tubus t) {
    double dy=2.*t.r/1000;
    double y = -t.r;
    double xx;
    for(int i=0;i<1000;i++){
      y=y+dy;
      if(r>0)xx=S.x-Math.sqrt(r*r-y*y);
      else xx=S.x+Math.sqrt(r*r-y*y);
      gr.drawPoint(xx,y);
    }
  }
}
