| 576 | } |
| 577 | |
| 578 | std::vector<std::vector<double>> LNLib::Polynomials::BezierToPowerMatrix(int degree) |
| 579 | { |
| 580 | std::vector<std::vector<double>> matrix(degree+1, std::vector<double>(degree + 1)); |
| 581 | for (int i = 0; i < degree; i++) |
| 582 | { |
| 583 | for (int j = i + 1; j <= degree; j++) |
| 584 | { |
| 585 | matrix[i][j] = 0.0; |
| 586 | } |
| 587 | } |
| 588 | |
| 589 | matrix[0][0] = matrix[degree][degree] = 1.0; |
| 590 | if (degree % 2) |
| 591 | { |
| 592 | matrix[degree][0] = -1.0; |
| 593 | } |
| 594 | else |
| 595 | { |
| 596 | matrix[degree][0] = 1.0; |
| 597 | } |
| 598 | |
| 599 | double sign = -1.0; |
| 600 | for (int i = 1; i < degree; i++) |
| 601 | { |
| 602 | matrix[i][i] = MathUtils::Binomial(degree,i); |
| 603 | matrix[i][0] = matrix[degree][degree - i] = sign * matrix[i][i]; |
| 604 | sign = -sign; |
| 605 | } |
| 606 | |
| 607 | int k1 = (degree + 1) / 2; |
| 608 | int pk = degree - 1; |
| 609 | for (int k = 1; k < k1; k++) |
| 610 | { |
| 611 | sign = -1.0; |
| 612 | for (int j = k + 1; j <= pk; j++) |
| 613 | { |
| 614 | matrix[j][k] = matrix[pk][degree - j] = sign * MathUtils::Binomial(degree, k) * MathUtils::Binomial(degree - k, j - k); |
| 615 | sign = -sign; |
| 616 | } |
| 617 | pk = pk - 1; |
| 618 | } |
| 619 | return matrix; |
| 620 | } |
| 621 | |
| 622 | std::vector<std::vector<double>> LNLib::Polynomials::PowerToBezierMatrix(int degree, const std::vector<std::vector<double>>& matrix) |
| 623 | { |
nothing calls this directly
no outgoing calls
no test coverage detected