Exemplo n.º 1
0
        private Tuple <double[][], double[]> GlobalBSplineMatrix(int degree, double[] knots, bool areKnotsService)
        {
            double[] serviceKnots;
            int      k;
            int      numberOfRowsAndColumns;
            int      numberOfRowsForLoop;

            if (areKnotsService)
            {
                serviceKnots           = knots;
                k                      = knots.Length - 2 * degree - 1;
                numberOfRowsAndColumns = k + 3;
                numberOfRowsForLoop    = k + 1;
            }
            else
            {
                serviceKnots           = BSpline.ServiceKnots(knots, degree, true);
                k                      = knots.Length - 1;
                numberOfRowsAndColumns = k + 3;
                numberOfRowsForLoop    = knots.Length;
            }



            bool isDegreeEven = degree % 2 == 0;
            var  iterations   = degree + 2;

            double[][] matrix = ArrayMyUtils.CreateMatrix <double>(numberOfRowsAndColumns, numberOfRowsAndColumns);

            //matrix[0][0] = Bell(knots[0], degree, serviceKnots, !isDegreeEven, 1, 0, iterations);
            //matrix[0][1] = Bell(knots[0], degree, serviceKnots, !isDegreeEven, 2, 1, iterations);
            //matrix[0][2] = Bell(knots[0], degree, serviceKnots, !isDegreeEven, 3, 2, iterations);
            for (int i = 0; i < numberOfRowsForLoop; i++)
            {
                matrix[i][i]     = Bell(serviceKnots[degree + i], degree, serviceKnots, !isDegreeEven, 1, i, degree + 2);
                matrix[i][i + 1] = Bell(serviceKnots[degree + i], degree, serviceKnots, !isDegreeEven, 2, i + 1, degree + 2);
                matrix[i][i + 2] = Bell(serviceKnots[degree + i], degree, serviceKnots, !isDegreeEven, 3, i + 2, degree + 2);
            }
            matrix[numberOfRowsAndColumns - 2][0] = BellDerivative(serviceKnots[degree], degree, serviceKnots, !isDegreeEven, 1, 0, iterations);
            matrix[numberOfRowsAndColumns - 2][1] = BellDerivative(serviceKnots[degree], degree, serviceKnots, !isDegreeEven, 2, 1, iterations);
            matrix[numberOfRowsAndColumns - 2][2] = BellDerivative(serviceKnots[degree], degree, serviceKnots, !isDegreeEven, 3, 2, iterations);

            matrix[numberOfRowsAndColumns - 1][numberOfRowsAndColumns - 3] = BellDerivative(serviceKnots[degree + numberOfRowsForLoop - 1], degree, serviceKnots, !isDegreeEven, 1, numberOfRowsAndColumns - 3, iterations);
            matrix[numberOfRowsAndColumns - 1][numberOfRowsAndColumns - 2] = BellDerivative(serviceKnots[degree + numberOfRowsForLoop - 1], degree, serviceKnots, !isDegreeEven, 2, numberOfRowsAndColumns - 2, iterations);
            matrix[numberOfRowsAndColumns - 1][numberOfRowsAndColumns - 1] = BellDerivative(serviceKnots[degree + numberOfRowsForLoop - 1], degree, serviceKnots, !isDegreeEven, 3, numberOfRowsAndColumns - 1, iterations);

            //System.Diagnostics.Debug.WriteLine("  ...BEG.......   ");
            //System.Diagnostics.Debug.WriteLine(matrix[numberOfRowsAndColumns - 2][0]);
            //System.Diagnostics.Debug.WriteLine(matrix[numberOfRowsAndColumns - 2][1]);
            //System.Diagnostics.Debug.WriteLine(matrix[numberOfRowsAndColumns - 2][2]);
            //System.Diagnostics.Debug.WriteLine("  ...MED.......   ");
            //System.Diagnostics.Debug.WriteLine(matrix[numberOfRowsAndColumns - 1][numberOfRowsAndColumns - 3]);
            //System.Diagnostics.Debug.WriteLine(matrix[numberOfRowsAndColumns - 1][numberOfRowsAndColumns - 2]);
            //System.Diagnostics.Debug.WriteLine(matrix[numberOfRowsAndColumns - 1][numberOfRowsAndColumns - 1]);
            //System.Diagnostics.Debug.WriteLine("  ...END.......   ");

            return(new Tuple <double[][], double[]>(matrix, serviceKnots));
        }
Exemplo n.º 2
0
        protected void BSplineDemoButtonClick(object sender, RoutedEventArgs e)
        {
            int degree = 3;

            double[] knots         = new double[] { -1, 0, 1, 2, 3, 4, 5 };
            double[] controlPoints = new double[] { 0, 2, -1, 1, -1, 1, -1, 0, 1 };
            double[] serviceKnots  = BSpline.ServiceKnots(knots, degree, true);
            var      spline        = _engine.InteractiveBSpline(degree, knots, controlPoints);

            _bSplineList.Add(spline);

            //OptimalWorldArea();
        }
Exemplo n.º 3
0
        private Tuple <double[][], double[]> FunctionApproximationMatrix(double[] X, double[] XKnots, int[] XKnotsIndexes, int degree)
        {
            int numberOfRows    = X.Length;
            int numberOfColumns = XKnots.Length - 1 + degree;

            double[] auxXKnots;
            bool     isDegreeEven = degree % 2 == 0;

            double[][] matrix = ArrayMyUtils.CreateMatrix <double>(numberOfRows, numberOfColumns);
            auxXKnots = BSpline.ServiceKnots(XKnots, degree, true);

            int k = 0;

            //for (int i = 0; i < numberOfRows; i++)
            //{
            //    int kk = Math.Max(0, numberOfEquations-1);

            //    for (int j = 0; j < numberOfColumns; j++)
            //    {

            //        if(j>=kk & j<=kk+degree)
            //        {
            //            //if (j - kk + 1==2)
            //            //{
            //            //    Console.WriteLine("zacina debug");
            //            //}
            //            leftSide[i][j]=Bell(knots, knots[i], degree,!isDegreeEven, j-kk+1, j, degree+2);
            //        }else{
            //            leftSide[i][j]=0;
            //        }
            //    }
            //    if(i==XKnotsIndexes[numberOfEquations]){
            //        numberOfEquations++;
            //    }
            //}

            for (int i = 0; i < numberOfRows; i++)
            {
                int kk = Math.Max(0, k - 1);

                for (int j = 0; j < numberOfColumns; j++)
                {
                    if (j >= kk & j <= kk + degree)
                    {
                        //if (j - kk + 1==2)
                        //{
                        //    Console.WriteLine("zacina debug");
                        //}
                        matrix[numberOfRows - i - 1][numberOfColumns - j - 1] = Bell(X[i], degree, auxXKnots, !isDegreeEven, j - kk + 1, j, degree + 2);
                    }
                    else
                    {
                        matrix[numberOfRows - i - 1][numberOfColumns - j - 1] = 0;
                    }
                }
                if (k < XKnotsIndexes.Length && i == XKnotsIndexes[k])
                {
                    k++;
                }
            }

            return(new Tuple <double[][], double[]>(matrix, auxXKnots));
        }