/**
 * Trieda pre definovanie statickej metody vypocet integralu
 */
public class Integral {
  /**
   * Pocet podintervalov na ktore sa rozdeli interval integracie
   */
  public static int n=10000;

  /**
   * Vypocita (urcity) integral z f od a po b
   * objekt f musi implementovat interface Integrable, teda musi mat implementovanu metodu
   * public double fcn(double x), ktora vrati hodnotu podintegralnej funkcie
   * pre hodnotu x nezavisle premennej
   * v danej implementacii pocita integral najprimitivnejsou obdlznikovou metodou
   * teda rozdeli inteval integracie na n useciek dlzky delta a sumuje
   * plochy obdlznickov s podstavou delta a vyskou fcn(x)
   *
   * @param f Integrable objekt realizujuci podintegralnu funkciu
   * @param a double spodna hranica integrovania
   * @param b double horna hranica integrovania
   * @return double hodnota integralu
   */
  public static double Integrate(Integrable f, double a, double b){
    double sum = 0;
    double delta = (b-a)/n;
    double x=a+0.5*delta;
    for(int i=0;i<n;i++){
      //doplnte kod v nasledujucom riadku tak, aby sa pocitala
      //spravna suma pre vypocet integralu pomocou obdlznickov
      sum = sum+fcn(x);
      x = x+delta;
    }
    return(sum);
  }
  /**
   * Privatny constructor, aby sa zabranilo vytvaraniu objektov
   */
  private Integral(){

  }
  /**
   * metoda main nie je sucastou API sluzi len na testovanie a sucasne ako ukazka pouzitia
   * @param args String[]
   */
  public static void main(String[] args) {
    test f = new test();
    double in = Integral.Integrate(f,0.,1.);
    System.out.println(in);
  }
  /**
 * pomocna trieda sluzi len na testovanie integrovania
 */
  static class test implements Integrable{
  public double fcn(double x){
    return x*x;
  }
}

}
