using System;


namespace ProgettoParabola
{
    struct Punto
    {
        public double Ascissa;
        public double Ordinata;

        public string ToString()
        {
            return "( " + Ascissa + " ; " + Ordinata + " )";             // (x ; y)
        }
    }
    
    class Parabola
    {
        private double a;
        private double b;
        private double c;

        // costruisce la parabola y=x^2
        public Parabola()
        {
            this.a = 1;
        }

        // costruisce la parabola con b e c nulli
        public Parabola(double a)
        {
            this.a = a;
        }

        // costruisce la parabola con c nullo
        public Parabola(double a, double b):this(a)
        {
            this.b = b;
        }

        // costruisce la parabola y=ax^2+bx+c
        public Parabola(double a, double b, double c):this(a,b)
        {
            this.c = c;
        }

        public void setA(double datoA)
        {
            this.a = datoA;
        }

        public double getA()
        {
            return this.a;
        }

        public void setB(double datoB)
        {
            this.b = datoB;
        }

        public double getB()
        {
            return this.b;
        }

        public void setC(double datoC)
        {
            this.c = datoC;
        }

        public double getC()
        {
            return this.c;
        }

        // restituisce true se e solo se la parabola è uguale alla parabola p passata come parametro
        public bool UgualeA(Parabola p)
        {
            if ((this.a == p.a) && (this.b == p.b) && (this.c == p.c))
            {
                return true;
            }
            else
            {
                return false;
            }

            // Avremmo potuto scrivere anche:

            // return ((this.a == p.a) && (this.b == p.b) && (this.c == p.c));

        }

        // restituisce il vertice
        public Punto getVertice()
        {
            Punto vertice;

            vertice.Ascissa = -(this.b) / (2 * this.a);
            vertice.Ordinata = -this.Delta() / (4 * this.a);

            return vertice;
        }

        private double Delta()
        {
            double Delta = Math.Pow(this.b, 2) - (4 * this.a * this.c);
            return Delta;
        }


        // restituisce il fuoco
        public Punto getFuoco()
        {
            Punto fuoco;

            fuoco.Ascissa = -(this.b) / (2 * this.a);
            fuoco.Ordinata = (4 * this.a - this.Delta()) / (4 * this.a);

            return fuoco;
        }

        // restituisce il valore ordinataPunto per cui (ascissaPunto, ordinataPunto) appartiene alla parabola
        public double OrdinataPunto(double ascissaPunto)
        {
            return this.a * Math.Pow(ascissaPunto, 2) + this.b * ascissaPunto + this.c;
        }

        // restituisce true se e solo se la parabola passa per p
        // Utilizzo il metodo OrdinataPunto, che mi restituisce il valore dell'ordinata del punto
        // di cui è nota l'ascissa, in modo tale che esso appartenga alla parabola
        public bool PassaPer(Punto p)
        {
            bool passaggio;

            if (p.Ordinata == this.OrdinataPunto(p.Ascissa))
            {
                passaggio = true;
            }
            else
            {
                passaggio = false;
            }

            return passaggio;
        }


        // restituisce true se e solo se la parabola ha la concavità rivolta verso l’alto
        public bool IsConcavaVersoAlto()
        {
            bool concava;

            //if (this.a > 0)
            //{
            //    concava = true;
            //}
            //else
            //{
            //    concava = false;
            //}


            concava = (this.a > 0) ? true : false;      // OPERATORE TRIATICO

            return concava;
        }


        // provvede a stampare la parabola, nella forma: y=ax^2+bx+c
        public string ToString()
        {
            return "Y = " + this.a + "X^2 + " + this.b + "X + " + this.c;
        }

    }
}
