private void button_Click(object sender, RoutedEventArgs e) { var xyzDataSeries3D1 = new XyzDataSeries3D <double>(); var xyzDataSeries3D2 = new XyzDataSeries3D <double>(); _n1 = 0; _n2 = 0; var mu1X = 0.0; var mu1Y = 0.0; var mu2X = 0.0; var mu2Y = 0.0; var sigma1X = 0.0; var sigma1Y = 0.0; var sigma2X = 0.0; var sigma2Y = 0.0; var eps = 0.01; string inputBuffer; try { // ввод исходных данных inputBuffer = TextBox.Text; _n1 = Convert.ToInt32(inputBuffer); inputBuffer = TextBox1.Text; _n2 = Convert.ToInt32(inputBuffer); inputBuffer = TextBox2.Text; mu1X = Convert.ToDouble(inputBuffer); inputBuffer = TextBox3.Text; mu1Y = Convert.ToDouble(inputBuffer); inputBuffer = TextBox4.Text; mu2X = Convert.ToDouble(inputBuffer); inputBuffer = TextBox5.Text; mu2Y = Convert.ToDouble(inputBuffer); inputBuffer = TextBox6.Text; sigma1X = Convert.ToDouble(inputBuffer); inputBuffer = TextBox7.Text; sigma1Y = Convert.ToDouble(inputBuffer); inputBuffer = TextBox8.Text; sigma2X = Convert.ToDouble(inputBuffer); inputBuffer = TextBox9.Text; sigma2Y = Convert.ToDouble(inputBuffer); inputBuffer = TextBox24.Text; eps = Convert.ToDouble(inputBuffer); } catch (Exception ex) { MessageBox.Show(ex.Message); } List <Point> setP1; List <Point> setP2; var normRand = new NormalRandom(); var set1 = new SetPoint(mu1X, sigma1X, mu1Y, sigma1Y, _n1, normRand); var set2 = new SetPoint(mu2X, sigma2X, mu2Y, sigma2Y, _n2, normRand); setP1 = set1.get_list_point(); setP2 = set2.get_list_point(); var ro1 = MathTpr.CalculationOfCorrelationCoefficient(setP1, mu1X, mu1Y, sigma1X, sigma1X); var ro2 = MathTpr.CalculationOfCorrelationCoefficient(setP2, mu2X, mu2Y, sigma2X, sigma2X); // определение фактических значений мат. ожиданий и среднеквадратических отклонений _averageX1 = set1.calculate_Average_Value_x(); _averageY1 = set1.calculate_Average_Value_y(); _averageX2 = set2.calculate_Average_Value_x(); _averageY2 = set2.calculate_Average_Value_y(); _sigmaX1 = Math.Sqrt(MathTpr.DispersionX(setP1, _averageX1)); _sigmaY1 = Math.Sqrt(MathTpr.DispersionY(setP1, _averageY1)); _sigmaX2 = Math.Sqrt(MathTpr.DispersionX(setP2, _averageX2)); _sigmaY2 = Math.Sqrt(MathTpr.DispersionY(setP2, _averageY2)); // построение точек на плоскости XY foreach (var item in setP1) { var x = item.X; var z = item.Y; item.Z = MathTpr.func_Gauss_XY(item.X, item.Y, sigma1X, sigma1Y, mu1X, mu1Y, ro1); var y = 0; xyzDataSeries3D1.Append(x, y, z); } foreach (var item in setP2) { var x = item.X; var z = item.Y; item.Z = MathTpr.func_Gauss_XY(item.X, item.Y, sigma2X, sigma2Y, mu2X, mu2Y, ro2); var y = 0; xyzDataSeries3D2.Append(x, y, z); } xyzDataSeries3D1.SeriesName = "S1"; xyzDataSeries3D2.SeriesName = "S2"; PointGrid.DataContext = setP1; PointGridCopy.DataContext = setP2; if (_graph != null) { _graph = new _3DGraph { Visibility = Visibility.Visible }; } // создание формы с графиком _graph?.PaintGraph(set1, set2, sigma1X, sigma1Y, mu1X, mu1Y, mu2X, mu2Y, sigma2X, sigma2Y, _n1, _n2); }
public void PaintGraph(SetPoint set1, SetPoint set2, double sigma1X, double sigma1Y, double mu1X, double mu1Y, double mu2X, double mu2Y, double sigma2X, double sigma2Y, int n1, int n2) { var xCen = 0.0; var yCen = 0.0; var setP1 = set1.get_list_point(); var setP2 = set2.get_list_point(); var xyzDataSeries3D1 = new XyzDataSeries3D <double>(); var xyzDataSeries3D2 = new XyzDataSeries3D <double>(); var ro1 = MathTpr.CalculationOfCorrelationCoefficient(setP1, mu1X, mu1Y, sigma1X, sigma1X); var ro2 = MathTpr.CalculationOfCorrelationCoefficient(setP2, mu2X, mu2Y, sigma2X, sigma2X); foreach (var item in setP1) { var x = item.X; var z = item.Y; item.Z = MathTpr.func_Gauss_XY(item.X, item.Y, sigma1X, sigma1Y, mu1X, mu1Y, ro1); var y = 0; xyzDataSeries3D1.Append(x, y, z); } foreach (var item in setP2) { var x = item.X; var z = item.Y; item.Z = MathTpr.func_Gauss_XY(item.X, item.Y, sigma2X, sigma2Y, mu2X, mu2Y, ro2); var y = 0; xyzDataSeries3D2.Append(x, y, z); } xyzDataSeries3D1.SeriesName = "S1"; xyzDataSeries3D2.SeriesName = "S2"; // построение плотностей проекций множеств S1 и S2 // данные полученные из практически заданных СВ величин var averageX1 = set1.calculate_Average_Value_x(); var averageY1 = set1.calculate_Average_Value_y(); var averageX2 = set2.calculate_Average_Value_x(); var averageY2 = set2.calculate_Average_Value_y(); // построение плотности проекции f(x/S1) var dispersionX1 = MathTpr.DispersionX(setP1, averageX1); var sigmaX1 = Math.Sqrt(dispersionX1); var xyzDataSeries3D3 = MathTpr.f_x_Si(averageX1, sigmaX1, n1, MainWindow.fXS1); xyzDataSeries3D3.SeriesName = "f(x/S1)"; // построение плотности проекции f(x/S2) var dispersionX2 = MathTpr.DispersionX(setP2, averageX2); var sigmaX2 = Math.Sqrt(dispersionX2); var xyzDataSeries3D4 = MathTpr.f_x_Si(averageX2, sigmaX2, n2, MainWindow.fXS2); xyzDataSeries3D4.SeriesName = "f(x/S2)"; // построение плотности проекции f(y/S1) var dispersionY1 = MathTpr.DispersionY(setP1, averageY1); var sigmaY1 = Math.Sqrt(dispersionY1); var xyzDataSeries3D5 = MathTpr.f_y_Si(averageY1, sigmaY1, n1, MainWindow.fYS1); xyzDataSeries3D5.SeriesName = "f(y/S1)"; // построение плотности проекции f(y/S2) var dispersionY2 = MathTpr.DispersionY(setP2, averageY2); var sigmaY2 = Math.Sqrt(dispersionY2); var xyzDataSeries3D6 = MathTpr.f_y_Si(averageY2, sigmaY2, n2, MainWindow.fYS2); xyzDataSeries3D6.SeriesName = "f(y/S2)"; // нахождение центра между образами xCen = Math.Abs(mu1X - mu2X) / 2; yCen = Math.Abs(mu1Y - mu2Y) / 2; /* Вычисление расстояния до центра от одного из образов, т.к. это центр – следовательно * расстояние от первого и второго образа одинаково. Берем данные первого образа.*/ var distance = Math.Sqrt(Math.Pow(xCen - mu1X, 2) + Math.Pow(yCen - mu1Y, 2)); // определяем, что это расстояние больше чем среднеквадратическое отклонение любого образа // если меньше, то берем значение большего среднеквадратического отклонения if (sigma1X > distance) { distance = sigma1X; } if (sigma1Y > distance) { distance = sigma1Y; } if (sigma2X > distance) { distance = sigma2X; } if (sigma2Y > distance) { distance = sigma2Y; } // данное значение нам необходимо для построения поверхности определённого размера // чтобы её отображение на диаграмме было корректным и без смещения относительно других объектов // данное значение было определено эмпирическим путем var meshDataSeries1 = MathTpr.ConstructionSurfaceDistribution(xCen, yCen, distance, sigma1X, sigma1Y, mu1X, mu1Y, ro1); meshDataSeries1.SeriesName = "f(x,y/S1)"; var meshDataSeries2 = MathTpr.ConstructionSurfaceDistribution(xCen, yCen, distance, sigma2X, sigma2Y, mu2X, mu2Y, ro2); meshDataSeries2.SeriesName = "f(x,y/S2)"; ScatterSeries3D_1.DataSeries = xyzDataSeries3D1; ScatterSeries3D_2.DataSeries = xyzDataSeries3D2; PointLineSeries3D.DataSeries = xyzDataSeries3D3; PointLineSeries3D_1.DataSeries = xyzDataSeries3D4; PointLineSeries3D_2.DataSeries = xyzDataSeries3D5; PointLineSeries3D_3.DataSeries = xyzDataSeries3D6; surfaceMeshRenderableSeries.DataSeries = meshDataSeries1; surfaceMeshRenderableSeries_2.DataSeries = meshDataSeries2; }