Ejemplo n.º 1
0
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            // vado a catturare le variabili
            SetVariabili();
            // aggiungo il controllo per il grafico
            var plotView = new PlotView(this);

            // aggiungo il grafico al controllo
            plotView.Model = Calcoli.CreatePlotModel(a, b, mu, sigma);
            // inizializzo la view
            SetContentView(Resource.Layout.GraphLayout);
            // aggiungo il grafico nella view
            this.AddContentView(plotView,
                                new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Crea tutti gli elementi necessari a disegnare il grafico della funzione
        /// di distribuzione e le linee che colorano l'area indicata.
        /// </summary>
        /// <param name="a">L'estremo sinistro dell'intervallo.</param>
        /// <param name="b">L'estremo destro dell'intervallo.</param>
        /// <param name="mu">la media.</param>
        /// <param name="sigma">Lo scarto quadratico medio.</param>
        /// <returns>Un PlotModel che conterrà il grafico della funzione di distribuzione e l'area</returns>
        public static PlotModel CreatePlotModel(double a, double b, double mu, double sigma)
        {
            var model     = new PlotModel {
            };
            var fnDensita = Calcoli.funzioneDensita(mu, sigma);

            // aggiungo al model la funzione di distribuzione
            model.Series.Add(new FunctionSeries(fnDensita, (mu - 5 * sigma), (mu + 5 * sigma), 0.1)
            {
                Color = OxyColors.Red, Background = OxyColor.FromRgb(220, 220, 220)
            });
            // aggiungo un titolo e visualizzo la legenda
            model.Series[0].Title = "Fn Densità, µ = " + mu + ", σ = " + sigma;
            model.IsLegendVisible = true;
            // aggiungo gli assi X e Y
            model.Axes.Add(new LinearAxis {
                Position = AxisPosition.Bottom, MaximumPadding = 0.1, MinimumPadding = 0.1, IsZoomEnabled = false, IsPanEnabled = false
            });
            model.Axes.Add(new LinearAxis {
                Position = AxisPosition.Left, MaximumPadding = 0.1, MinimumPadding = 0.1, AbsoluteMinimum = 0, IsZoomEnabled = false, IsPanEnabled = false
            });

            // linea per colorare la porzione di funzione delimitata da a e b
            double aVero, bVero;

            // se a è meno infinito setto un limite per l'integrale,
            // dato che comunque la funzione viene disegnata solo fino a
            // mu - 5* sigma
            if (a.Equals(double.NegativeInfinity))
            {
                aVero = mu - 5 * sigma;
            }
            else
            {
                aVero = a;
            }
            // se b è più infinito setto un limite per l'integrale,
            // dato che comunque la funzione viene disegnata solo fino a
            // mu + 5* sigma
            if (b.Equals(double.PositiveInfinity))
            {
                bVero = mu + 5 * sigma;
            }
            else
            {
                bVero = b;
            }

            // porzione di curva della funzione da colorare per l'area
            var area = new FunctionSeries(fnDensita, aVero, bVero, 0.0001);
            // linea verticale per il punto a
            var lineaA = new LineSeries();

            lineaA.Points.Add(new DataPoint(aVero, 0));
            lineaA.Points.Add(new DataPoint(aVero, fnDensita(a)));
            // linea verticale per il punto b
            var lineaB = new LineSeries();

            lineaB.Points.Add(new DataPoint(bVero, 0));
            lineaB.Points.Add(new DataPoint(bVero, fnDensita(b)));
            //linea orizzontale da a a b, sovrapposta all'asse X
            var lineaAsse = new LineSeries();

            lineaAsse.Points.Add(new DataPoint(aVero, 0));
            lineaAsse.Points.Add(new DataPoint(bVero, 0));
            // setto i colori per l'area
            area.Color      = OxyColors.Black;
            lineaA.Color    = OxyColors.Black;
            lineaB.Color    = OxyColors.Black;
            lineaAsse.Color = OxyColors.Black;
            // aggiungo tutte le linee
            model.Series.Add(area);
            model.Series.Add(lineaA);
            model.Series.Add(lineaB);
            model.Series.Add(lineaAsse);
            // aggiungo la legenda per l'area
            double risultatoArea = CalcolaIntegrale(a, b, sigma, mu);
            string legendaArea   = "Area = " + ((risultatoArea.Equals(1) || risultatoArea.ToString().Length < 7)
                ? risultatoArea.ToString()
                : risultatoArea.ToString().Substring(0, 7));

            model.Series[1].Title = legendaArea;
            // forzo il grafico a ridisegnarsi
            model.InvalidatePlot(true);
            // ritorno il grafico
            return(model);
        }
        /// <summary>
        /// Metodo privato per convertire tutti i testi in valori double
        /// </summary>
        /// <returns>Il valore dell'area dell'integrale, o NaN se non è possibile calcolarla</returns>
        private double EseguiParsing()
        {
            EditText A     = FindViewById <EditText>(Resource.Id.txtA);
            EditText B     = FindViewById <EditText>(Resource.Id.txtB);
            EditText Mu    = FindViewById <EditText>(Resource.Id.txtMu);
            EditText Sigma = FindViewById <EditText>(Resource.Id.txtSigma);

            if (A.Text.Equals(""))
            {
                a = double.NegativeInfinity;
            }
            else
            if (A.Text.Equals("-") || A.Text.Equals(".") || A.Text.Equals("-."))
            {
                FindViewById <EditText>(Resource.Id.txtA).Text = "";
                MessaggioDiErrore("Estremo sinistro non valido");
                return(Double.NaN);
            }
            else
            {
                double.TryParse(A.Text, NumberStyles.Number, CultureInfo.InvariantCulture, out a);
            }
            if (B.Text.Equals(""))
            {
                b = double.PositiveInfinity;
            }
            else
            if (B.Text.Equals("-") || B.Text.Equals(".") || B.Text.Equals("-."))
            {
                FindViewById <EditText>(Resource.Id.txtB).Text = "";
                MessaggioDiErrore("Estremo destro non valido");
                return(Double.NaN);
            }
            else
            {
                double.TryParse(B.Text, NumberStyles.Number, CultureInfo.InvariantCulture, out b);
            }

            if (a > b && (a != double.NegativeInfinity && b != double.NegativeInfinity))
            {
                FindViewById <EditText>(Resource.Id.txtA).Text = "";
                FindViewById <EditText>(Resource.Id.txtB).Text = "";
                MessaggioDiErrore("Estremo sinistro maggiore dell'estremo destro");
                return(Double.NaN);
            }

            double.TryParse(Mu.Text, NumberStyles.Number, CultureInfo.InvariantCulture, out mu);
            if (Mu.Text.Equals(""))
            {
                mu = 0;
            }

            double.TryParse(Sigma.Text, NumberStyles.Number, CultureInfo.InvariantCulture, out sigma);
            if (Sigma.Text.Equals(""))
            {
                sigma = 1;
            }
            if (sigma == 0)
            {
                FindViewById <EditText>(Resource.Id.txtSigma).Text = "";
                MessaggioDiErrore("σ non può essere uguale a 0");
                return(Double.NaN);
            }
            return(Calcoli.CalcolaIntegrale(a, b, sigma, mu));
        }