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

Method BezierToPowerMatrix

src/LNLib/Algorithm/Polynomials.cpp:578–620  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

576}
577
578std::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
622std::vector<std::vector<double>> LNLib::Polynomials::PowerToBezierMatrix(int degree, const std::vector<std::vector<double>>& matrix)
623{

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected