bool BSplineBasis1D::refineKnots(SparseMatrix &A) { // Build refine knot vector std::vector<double> refinedKnots = knots; unsigned int targetNumKnots = targetNumBasisfunctions + degree + 1; while(refinedKnots.size() < targetNumKnots) { int index = indexLongestInterval(refinedKnots); double newKnot = (refinedKnots.at(index) + refinedKnots.at(index+1))/2.0; refinedKnots.insert(lower_bound(refinedKnots.begin(), refinedKnots.end(), newKnot), newKnot); } assert(isKnotVectorRegular(refinedKnots) && isRefinement(refinedKnots)); // Return knot insertion matrix if(!buildKnotInsertionMatrix(A, refinedKnots)) { return false; } // Update knots knots = refinedKnots; return true; }
SparseMatrix BSplineBasis1D::refineKnots() { // Build refine knot vector std::vector<double> refinedKnots = knots; unsigned int targetNumKnots = targetNumBasisfunctions + degree + 1; while (refinedKnots.size() < targetNumKnots) { int index = indexLongestInterval(refinedKnots); double newKnot = (refinedKnots.at(index) + refinedKnots.at(index+1))/2.0; refinedKnots.insert(std::lower_bound(refinedKnots.begin(), refinedKnots.end(), newKnot), newKnot); } if (!isKnotVectorRegular(refinedKnots) || !isRefinement(refinedKnots)) throw Exception("BSplineBasis1D::refineKnots: New knot vector is not a proper refinement!"); // Return knot insertion matrix SparseMatrix A = buildKnotInsertionMatrix(refinedKnots); // Update knots knots = refinedKnots; return A; }
unsigned int BSplineBasis1D::indexLongestInterval() const { return indexLongestInterval(knots); }