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)); }
/// <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)); }