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);
        }
Exemple #2
0
        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;
        }