MCPcopy Create free account
hub / github.com/BIMCoderLiang/LNLib / AllBasisFunctions

Method AllBasisFunctions

src/LNLib/Algorithm/Polynomials.cpp:546–576  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

544}
545
546std::vector<std::vector<double>> LNLib::Polynomials::AllBasisFunctions(int spanIndex, int degree, const std::vector<double>& knotVector, double knot)
547{
548 VALIDATE_ARGUMENT(spanIndex >= 0, "spanIndex", "SpanIndex must be greater than or equal zero.");
549 VALIDATE_ARGUMENT(degree >= 0 && degree <= Constants::NURBSMaxDegree, "degree", "Degree must be greater than or equal zero and not exceed the maximun degree.");
550 VALIDATE_ARGUMENT(knotVector.size() > 0, "knotVector", "KnotVector size must be greater than zero.");
551 VALIDATE_ARGUMENT(ValidationUtils::IsValidKnotVector(knotVector), "knotVector", "KnotVector must be a nondecreasing sequence of real numbers.");
552 VALIDATE_ARGUMENT_RANGE(knot, knotVector[0], knotVector[knotVector.size() - 1]);
553
554 std::vector<std::vector<double>> bases(degree + 1, std::vector<double>(degree + 1));
555 bases[0][0] = 1.0;
556
557 std::vector<double> left(degree + 1, 0.0);
558 std::vector<double> right(degree + 1, 0.0);
559
560 for (int j = 1; j <= degree; j++)
561 {
562 left[j] = knot - knotVector[spanIndex + 1 - j];
563 right[j] = knotVector[spanIndex + j] - knot;
564 double saved = 0.0;
565 for (int r = 0; r < j; r++)
566 {
567 bases[j][r] = right[r + 1] + left[j - r];
568 double temp = bases[r][j - 1] / bases[j][r];
569
570 bases[r][j] = saved + right[r + 1] * temp;
571 saved = left[j - r] * temp;
572 }
573 bases[j][j] = saved;
574 }
575 return bases;
576}
577
578std::vector<std::vector<double>> LNLib::Polynomials::BezierToPowerMatrix(int degree)
579{

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected