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

Function TEST

tests/T_Polynomials.cpp:8–78  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6using namespace LNLib;
7
8TEST(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);

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected