| 6 | using namespace LNLib; |
| 7 | |
| 8 | TEST(Test_Polynomials, All) |
| 9 | { |
| 10 | int degree = 2; |
| 11 | int error_degree = -4; |
| 12 | int error_degree1 = 4; |
| 13 | std::vector<double> coefficients = { 1,2,3 }; |
| 14 | EXPECT_THROW(Polynomials::Horner(error_degree, coefficients, 0.5), std::invalid_argument); |
| 15 | EXPECT_TRUE(MathUtils::IsAlmostEqualTo(Polynomials::Horner(degree, coefficients, 0.5),2.75)); |
| 16 | EXPECT_THROW(Polynomials::Horner(error_degree1, coefficients, 0.5),std::invalid_argument); |
| 17 | |
| 18 | ASSERT_THROW(Polynomials::Bernstein(-1, degree, 0.5), std::invalid_argument); |
| 19 | ASSERT_THROW(Polynomials::Bernstein(degree + 1, degree, 0.5), std::invalid_argument); |
| 20 | EXPECT_THROW(Polynomials::Bernstein(1, degree, 1.5), std::out_of_range); |
| 21 | EXPECT_THROW(Polynomials::Bernstein(1, degree, -2), std::out_of_range); |
| 22 | EXPECT_TRUE(MathUtils::IsAlmostEqualTo(Polynomials::Bernstein(0, degree, 0.5), 0.25)); |
| 23 | EXPECT_TRUE(MathUtils::IsAlmostEqualTo(Polynomials::Bernstein(degree, degree, 0.5), 0.25)); |
| 24 | |
| 25 | EXPECT_THROW(Polynomials::AllBernstein(-1,0.5), std::invalid_argument); |
| 26 | EXPECT_THROW(Polynomials::AllBernstein(degree, 1.5), std::out_of_range); |
| 27 | EXPECT_TRUE(MathUtils::IsAlmostEqualTo(Polynomials::AllBernstein(degree, 0.5)[0], 0.25)); |
| 28 | EXPECT_TRUE(MathUtils::IsAlmostEqualTo(Polynomials::AllBernstein(degree, 0.5)[degree], 0.25)); |
| 29 | |
| 30 | std::vector<double> error_knotVector = { 0,0,1,2,1,0 }; |
| 31 | EXPECT_THROW(Polynomials::GetKnotMultiplicity(error_knotVector, 1.0),std::invalid_argument); |
| 32 | std::vector<double> knotVector = { 0,0,0,1,1,1 }; |
| 33 | EXPECT_TRUE(Polynomials::GetKnotMultiplicity(knotVector, 1.0) == 3); |
| 34 | EXPECT_TRUE(Polynomials::GetKnotSpanIndex(2, knotVector, 1) == 2); |
| 35 | |
| 36 | knotVector = { 0,0,0,1,2,3,4,4,5,5,5 }; |
| 37 | int spanIndex = Polynomials::GetKnotSpanIndex(degree, knotVector, 5.0 / 2); |
| 38 | double basis[Constants::NURBSMaxDegree + 1]; |
| 39 | Polynomials::BasisFunctions(spanIndex, degree, knotVector, 5.0 / 2, basis); |
| 40 | std::vector<double> check = {1.0/8, 6.0/8, 1.0/8}; |
| 41 | EXPECT_TRUE(MathUtils::IsAlmostEqualTo(basis[0], check[0]) && MathUtils::IsAlmostEqualTo(basis[1], check[1]) && MathUtils::IsAlmostEqualTo(basis[2], check[2])); |
| 42 | |
| 43 | auto ders = Polynomials::BasisFunctionsDerivatives(spanIndex, degree, 2, knotVector, 5.0 / 2); |
| 44 | std::vector<std::vector<double>> checkders = { {0.125,0.75,0.125},{-0.5,0.0,0.5},{1.0,-2.0,1.0} }; |
| 45 | EXPECT_TRUE(MathUtils::IsAlmostEqualTo(ders[0][0], checkders[0][0]) && MathUtils::IsAlmostEqualTo(ders[0][1], checkders[0][1]) && MathUtils::IsAlmostEqualTo(ders[0][2], checkders[0][2]) && |
| 46 | MathUtils::IsAlmostEqualTo(ders[1][0], checkders[1][0]) && MathUtils::IsAlmostEqualTo(ders[1][1], checkders[1][1]) && MathUtils::IsAlmostEqualTo(ders[1][2], checkders[1][2]) && |
| 47 | MathUtils::IsAlmostEqualTo(ders[2][0], checkders[2][0]) && MathUtils::IsAlmostEqualTo(ders[2][1], checkders[2][1]) && MathUtils::IsAlmostEqualTo(ders[2][2], checkders[2][2])); |
| 48 | |
| 49 | checkders = { {0.125,-0.5,1.0},{0.75,0.0,-2.0},{0.125,0.5,1.0} }; |
| 50 | for (int i = degree; i >= 0; i--) |
| 51 | { |
| 52 | double b = Polynomials::OneBasisFunction(spanIndex - i, degree, knotVector, 5.0 / 2); |
| 53 | EXPECT_TRUE(MathUtils::IsAlmostEqualTo(check[2 - i],b)); |
| 54 | |
| 55 | auto oneders = Polynomials::OneBasisFunctionDerivative(spanIndex - i, degree, 2, knotVector, 5.0 / 2); |
| 56 | EXPECT_TRUE(MathUtils::IsAlmostEqualTo(oneders[0], checkders[2 - i][0]) && |
| 57 | MathUtils::IsAlmostEqualTo(oneders[1], checkders[2 - i][1]) && |
| 58 | MathUtils::IsAlmostEqualTo(oneders[2], checkders[2 - i][2])); |
| 59 | } |
| 60 | |
| 61 | std::vector<double> u1 = { 0,0,0,1,2,2,4,4,4 }; |
| 62 | std::vector<double> u2 = { 0,0,0,1,2,3,4,4,4 }; |
| 63 | std::vector<double> insert1; |
| 64 | std::vector<double> insert2; |
| 65 | KnotVectorUtils::GetInsertedKnotElement(u1, u2, insert1, insert2); |
nothing calls this directly
no outgoing calls
no test coverage detected