/// <summary> /// Drawing plot of a given regression /// </summary> /// <param name="container"></param> private void DrawPlot(RegressionContainer container) { AbstractRegression regression = container.Regression; Brush brush = colorValuePairs[container.BrushKeyValue]; int predictDays = container.PredictDays; double min = regression.yVals.Min(); double max = regression.yVals.Max(); TopYLabel.Content = $"{max:f2}"; BottomYLabel.Content = $"{min:f2}"; double height = max - min; MiddleYLabel.Content = $"{(min + max) / 2.0:f2}"; double predictCoefficient = 1 + (double)predictDays / regression.xVals.Length; double width = regression.xVals.Length; double heightCoefficient = PlotCanvas.ActualHeight / (height * predictCoefficient); double widthCoefficient = PlotCanvas.ActualWidth / (width * predictCoefficient); Line line = new Line { Y2 = Math.Min(PlotCanvas.ActualHeight, PlotCanvas.ActualHeight - heightCoefficient * (regression.PredictY(0.1) - min)), X2 = 0.1 * widthCoefficient, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Center, StrokeThickness = 1.25, Stroke = brush }; for (double i = 0.1; i < regression.xVals.Length * predictCoefficient; i += 0.5) { double lastY = line.Y2; double lastX = line.X2; line = new Line { Y1 = lastY, X1 = lastX, Y2 = Math.Min(PlotCanvas.ActualHeight, PlotCanvas.ActualHeight - heightCoefficient * (regression.PredictY(i) - min)), X2 = i * widthCoefficient, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Center, StrokeThickness = 1.25, Stroke = brush }; PlotCanvas.Children.Add(line); } }
/// <summary> /// Drawing source values /// </summary> /// <param name="container"></param> private void DrawPoints(RegressionContainer container) { AbstractRegression regression = container.Regression; int predictDays = container.PredictDays; double min = regression.yVals.Min(); double max = regression.yVals.Max(); TopYLabel.Content = $"{max:f2}"; BottomYLabel.Content = $"{min:f2}"; double height = max - min; MiddleYLabel.Content = $"{(min + max) / 2.0:f2}"; double predictCoefficient = 1 + (double)predictDays / regression.xVals.Length; double width = regression.xVals.Length; double heightCoefficient = PlotCanvas.ActualHeight / (height * predictCoefficient); double widthCoefficient = PlotCanvas.ActualWidth / (width * predictCoefficient); for (int i = 0; i < regression.xVals.Length; i++) { Rectangle point = new Rectangle { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Center, Stroke = Brushes.Red, Width = 2, Height = 2, Margin = new Thickness(regression.xVals[i] * widthCoefficient, PlotCanvas.ActualHeight - heightCoefficient * (regression.yVals[i] - min), regression.xVals[i] * widthCoefficient, PlotCanvas.ActualHeight - heightCoefficient * (regression.yVals[i] - min)) }; PlotCanvas.Children.Add(point); } companyChanged = false; }
/// <summary> /// Opening a *.rgrs file /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OpenButton_Click(object sender, RoutedEventArgs e) { OpenFileDialog fileDialog = new OpenFileDialog { Filter = "Regression file (*.rgrs)|*.rgrs" }; if (fileDialog.ShowDialog() == true) { try { using (FileStream fs = new FileStream(fileDialog.FileName, FileMode.Open)) { BinaryFormatter bf = new BinaryFormatter(); regressions = (List <RegressionContainer>)bf.Deserialize(fs); } } catch (SerializationException) { MessageBox.Show("Сериалиазция не удалась"); ClearButton_Click(this, new RoutedEventArgs()); return; } PlotCanvas.Children.Clear(); if (regressions.Count == 0) { MessageBox.Show("Выходной файл пуст"); return; } foreach (RegressionContainer item in regressions) { DrawPlot(item); } RegressionContainer rc = regressions[0]; DrawPoints(rc); int baseDays = rc.Regression.yVals.Length; TopXLabel.Content = rc.Dates[0]; BottomXLabel.Content = rc.Dates[baseDays - 1]; MiddleXLabel.Content = rc.Dates[baseDays / 2]; BaseTextBox.Text = rc.Regression.xVals.Length.ToString(); PredictTextBox.Text = rc.PredictDays.ToString(); CompanyListBox.SelectedItem = CompanyListBox.Items[CompanyListBox.Items.IndexOf(rc.CompanyName)]; UncheckAll(); for (int i = 0; i < regressions.Count; i++) { if (regressions[i].Regression is ExponentialRegression) { ExponentialCheck.IsChecked = true; continue; } if (regressions[i].Regression is LogarifmicRegression) { LogarifmicCheck.IsChecked = true; continue; } if (regressions[i].Regression is HyperbolicRegression) { HyperbolicCheck.IsChecked = true; continue; } if (regressions[i].Regression is SquareRegression) { SquareCheck.IsChecked = true; continue; } if (regressions[i].Regression is CubicRegression) { CubicCheck.IsChecked = true; continue; } } } }