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