| 544 | } |
| 545 | |
| 546 | std::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 | |
| 578 | std::vector<std::vector<double>> LNLib::Polynomials::BezierToPowerMatrix(int degree) |
| 579 | { |
nothing calls this directly
no outgoing calls
no test coverage detected