package funzioni;

/**
 * Classe base per una generica funzione. Ogni funzione concreta deve ereditare
 * da questa classe e implementare il metodo f(..) opportunamente, in modo
 * da fornire i valori puntuali della funzione corrispondente.
 * @author Luca Ferrari ferrari.luca@unimore.it
 * @version 2.0
 */
public abstract class Funzione{

  /**
   * Intervalli di definizione della funzione.
   */
  private int xMin;
  private int xMax;
  private int yMin;
  private int yMax;


    /**
     * Costruttore base. Inizializza i valori estremi della funzione.
     *@param xMin minimo asse x
     *@param xMax massimo asse x
     *@param yMin minimo asse y
     *@param yMax massimo ase y
     */
    public Funzione(int xMin,int xMax,int yMin,int yMax)
    {
        this.xMin = xMin;
        this.xMax = xMax;
        this.yMin = yMin;
        this.yMax = yMax;
    }


    /**
     * Metodo che implementa la funzione stessa. Questo metodo deve implementare
     * la relazione y(x) = f(x), eventualmente tagliando la funzione per gli estremi di y
     * non compresi in [ymin,ymax], in modo che la definizione della funzione sia:
     * y(x) = f(x)   con  ymin <= y(x) <= ymax
     * y(x) = ymax   se f(x) > ymax
     * y(x) = ymin   se f(x) < ymin
     *@param x il valore di ingresso della funzione
     *@return y(x), ossia il valore di uscita della funzione
     *@throws IllegalArgumentException se il valore x fornito non e' nel range della funzione
     */
    public abstract float f(float x) throws IllegalArgumentException;


    /*+
     * Restituisce il minimo valore x in cui la funzione è definita.
     *@return minimo valore x
     */
    public int getXMin() {
        return xMin;
    }

    /**
     * Massimo valore dell'intervallo di definizione.
     *@return massima x possibile
     */
    public int getXMax(){
        return xMax;
    }

    /**
     * Minimo valore asse y possibile.
     *@return valore minimo asse y
     */
    public int getYMin(){
        return yMin;
    }

    /**
     * Massimo valore asse y.
     *@return massimo valore asse y
     */
    public int getYMax(){
        return yMax;
    }


    /**
     * Metodo per ottenere una descrizione simbolica di questa funzione.
     * @return la stringa che descrive simbolicamente la funzione.
     */
    public abstract String description();
    }
