From c499f1ded7e2015b78885fd27e82bf1a5f3594b4 Mon Sep 17 00:00:00 2001 From: JasonChmn <jason.chemin@hotmail.fr> Date: Fri, 24 May 2019 16:34:11 +0200 Subject: [PATCH] Finish test for conversion curves, binding python added, all test (conversion and piecewise) ok --- include/curves/bezier_curve.h | 1 - include/curves/curve_conversion.h | 14 +--- include/curves/piecewise_polynomial_curve.h | 2 +- include/curves/polynomial.h | 2 +- python/curves_python.cpp | 1 + python/python_variables.h | 2 +- python/test/test.py | 22 +++++- tests/Main.cpp | 84 +++++++++++++++------ 8 files changed, 87 insertions(+), 41 deletions(-) diff --git a/include/curves/bezier_curve.h b/include/curves/bezier_curve.h index 600a225..9ecb0a0 100644 --- a/include/curves/bezier_curve.h +++ b/include/curves/bezier_curve.h @@ -359,7 +359,6 @@ struct bezier_curve : public curve_abc<Time, Numeric, Dim, Safe, Point> } t_point_t wps_first(size_),wps_second(size_); const Numeric u = (t-T_min_)/(T_max_-T_min_); - std::cout<<T_min_<<" and "<<T_max_<<" t="<<t<<" u="<<u<<std::endl; wps_first[0] = pts_.front(); wps_second[degree_] = pts_.back(); t_point_t casteljau_pts = waypoints(); diff --git a/include/curves/curve_conversion.h b/include/curves/curve_conversion.h index d828458..12ec68c 100644 --- a/include/curves/curve_conversion.h +++ b/include/curves/curve_conversion.h @@ -23,17 +23,15 @@ Polynomial polynom_from_bezier(const Bezier& curve) { typedef typename Polynomial::t_point_t t_point_t; typedef typename Polynomial::num_t num_t; - assert (curve.min() == 0.); - assert (curve.max() == 1.); t_point_t coefficients; Bezier current (curve); - coefficients.push_back(curve(0.)); + coefficients.push_back(curve(curve.min())); num_t fact = 1; for(std::size_t i = 1; i<= curve.degree_; ++i) { current = current.compute_derivate(1); fact *= (num_t)i; - coefficients.push_back(current(0.)/fact); + coefficients.push_back(current(current.min())/fact); } return Polynomial(coefficients,curve.min(),curve.max()); } @@ -43,16 +41,14 @@ Polynomial polynom_from_hermite(const Hermite& curve) { typedef typename Polynomial::t_point_t t_point_t; typedef typename Polynomial::num_t num_t; - assert (curve.min() == 0.); - assert (curve.max() == 1.); t_point_t coefficients; Hermite current (curve); - coefficients.push_back(curve(0.)); + coefficients.push_back(curve(curve.min())); num_t fact = 1; for(std::size_t i = 1; i<= 3; ++i) { fact *= (num_t)i; - coefficients.push_back(current.derivate(0.,i)/fact); + coefficients.push_back(current.derivate(current.min(),i)/fact); } return Polynomial(coefficients,curve.min(),curve.max()); } @@ -67,8 +63,6 @@ Bezier bezier_from_hermite(const Hermite& curve) typedef typename Bezier::point_t point_t; typedef typename Bezier::t_point_t t_point_t; typedef typename Bezier::num_t num_t; - assert (curve.min() == 0.); - assert (curve.max() == 1.); Hermite current (curve); assert(current.control_points_.size() >= 2); diff --git a/include/curves/piecewise_polynomial_curve.h b/include/curves/piecewise_polynomial_curve.h index 44d694c..4b01b33 100644 --- a/include/curves/piecewise_polynomial_curve.h +++ b/include/curves/piecewise_polynomial_curve.h @@ -99,7 +99,7 @@ struct piecewise_polynomial_curve : public curve_abc<Time, Numeric, Dim, Safe, P else { value_end = current.derivate(current.max(),order); - value_start = next.derivate(current.min(),order); + value_start = next.derivate(next.min(),order); } if ((value_end-value_start).norm() > margin) diff --git a/include/curves/polynomial.h b/include/curves/polynomial.h index 257fb20..b6ef4c3 100644 --- a/include/curves/polynomial.h +++ b/include/curves/polynomial.h @@ -162,7 +162,7 @@ struct polynomial : public curve_abc<Time, Numeric, Dim, Safe, Point> { if((t < t_min_ || t > t_max_) && Safe) { - throw std::out_of_range("TODO"); + throw std::out_of_range("error in polynomial : time t to evaluate derivative should be in range [Tmin, Tmax] of the curve"); } time_t const dt (t-t_min_); time_t cdt(1); diff --git a/python/curves_python.cpp b/python/curves_python.cpp index 7144186..959a01a 100644 --- a/python/curves_python.cpp +++ b/python/curves_python.cpp @@ -374,6 +374,7 @@ BOOST_PYTHON_MODULE(curves) /** BEGIN curves conversion**/ def("polynom_from_bezier", polynom_from_bezier<bezier3_t,polynomial_t>); def("bezier_from_hermite", bezier_from_hermite<cubic_hermite_spline_t,bezier3_t>); + def("polynom_from_hermite", polynom_from_hermite<cubic_hermite_spline_t,polynomial_t>); /** END curves conversion**/ diff --git a/python/python_variables.h b/python/python_variables.h index 3932842..d369c20 100644 --- a/python/python_variables.h +++ b/python/python_variables.h @@ -21,7 +21,7 @@ typedef curves::bezier_curve <real, real, dim, true, variables_3_t> bezier_line bezier_linear_variable_t* wrapBezierLinearConstructor(const point_list_t& matrices, const point_list_t& vectors); bezier_linear_variable_t* wrapBezierLinearConstructorBounds - (const point_list_t& matrices, const point_list_t& vectors, const real ub); + (const point_list_t& matrices, const point_list_t& vectors, const real T_min, const real T_max); typedef std::pair<Eigen::Matrix<real, Eigen::Dynamic, Eigen::Dynamic>, Eigen::Matrix<real, Eigen::Dynamic, Eigen::Dynamic> > linear_points_t; diff --git a/python/test/test.py b/python/test/test.py index fffafd4..50cd361 100644 --- a/python/test/test.py +++ b/python/test/test.py @@ -9,7 +9,9 @@ from numpy.linalg import norm import unittest -from curves import bezier3, bezier6, curve_constraints, exact_cubic, cubic_hermite_spline, polynom_from_bezier, bezier_from_hermite, polynomial +from curves import bezier3 +from curves import bezier6 +from curves import curve_constraints, polynomial, exact_cubic, cubic_hermite_spline, polynom_from_bezier, bezier_from_hermite, polynom_from_hermite class TestCurves(unittest.TestCase): @@ -23,7 +25,7 @@ class TestCurves(unittest.TestCase): # - Variables : degree, nbWayPoints __EPS = 1e-6 waypoints = matrix([[1., 2., 3.]]).T - a = bezier3(waypoints,2.) + a = bezier3(waypoints,0.,2.) t = 0. while t < 2.: self.assertTrue (norm(a(t) - matrix([1., 2., 3.]).T) < __EPS) @@ -33,7 +35,7 @@ class TestCurves(unittest.TestCase): time_waypoints = matrix([0., 1.]).transpose() # Create bezier6 and bezier3 a = bezier6(waypoints6) - a = bezier3(waypoints, 3.) + a = bezier3(waypoints, 0., 3.) # Test : Degree, min, max, derivate #self.print_str(("test 1") self.assertEqual (a.degree, a.nbWaypoints - 1) @@ -58,7 +60,7 @@ class TestCurves(unittest.TestCase): # Create new bezier3 curve waypoints = matrix([[1., 2., 3.], [4., 5., 6.], [4., 5., 6.], [4., 5., 6.], [4., 5., 6.]]).transpose() a0 = bezier3(waypoints) - a1 = bezier3(waypoints, 3.) + a1 = bezier3(waypoints, 0., 3.) prim0 = a0.compute_primitive(1) prim1 = a1.compute_primitive(1) # Check change in argument time_t of bezier3 @@ -147,6 +149,18 @@ class TestCurves(unittest.TestCase): self.assertTrue (norm(a_hermite(0.3) - a_bezier(0.3)) < __EPS) return + def test_polynom_from_cubic_hermite(self): + # converting cubic hermite to polynom + __EPS = 1e-6 + points = matrix([[1., 2., 3.], [4., 5., 6.]]).transpose() + tangents = matrix([[1., 2., 3.], [4., 5., 6.]]).transpose() + time_points = matrix([0., 1.]).transpose() + a_hermite = cubic_hermite_spline(points, tangents, time_points) + + a_pol = polynom_from_hermite(a_hermite) + self.assertTrue (norm(a_hermite(0.3) - a_pol(0.3)) < __EPS) + return + def test_cubic_hermite_spline(self): points = matrix([[1., 2., 3.], [4., 5., 6.]]).transpose() tangents = matrix([[1., 2., 3.], [4., 5., 6.]]).transpose() diff --git a/tests/Main.cpp b/tests/Main.cpp index fbf6631..a3fe18a 100644 --- a/tests/Main.cpp +++ b/tests/Main.cpp @@ -452,9 +452,11 @@ void BezierToPolynomialConversionTest(bool& error) control_points.push_back(h); control_points.push_back(i); - bezier_curve_t cf(control_points.begin(), control_points.end()); + double T_min = 1.0; + double T_max = 2.0; + bezier_curve_t cf(control_points.begin(), control_points.end(),T_min, T_max); polynomial_t pol =polynom_from_bezier<bezier_curve_t, polynomial_t>(cf); - for(double i =0.; i<1.; i+=0.01) + for(double i =T_min; i<T_max; i+=0.01) { ComparePoints(cf(i),pol(i),errMsg, error, true); ComparePoints(cf(i),pol(i),errMsg, error, false); @@ -1010,13 +1012,10 @@ void BezierSplitCurve(bool& error) std::cout<<"splitting point of the splitted curve doesn't correspond to the original"<<std::endl; } - std::cout<<"4"<<std::endl; - // check along curve : double ti = t0; while(ti <= ts) { - std::cout<<"a "<<ti<<std::endl; if((cs.first(ti) - c(ti)).norm() > 1e-14) { error = true; @@ -1024,8 +1023,8 @@ void BezierSplitCurve(bool& error) } ti += 0.01; } - while(ti <= t1){ - std::cout<<"b "<<ti<<std::endl; + while(ti <= t1) + { if((cs.second(ti) - c(ti)).norm() > 1e-14) { error = true; @@ -1034,7 +1033,6 @@ void BezierSplitCurve(bool& error) ti += 0.01; } - std::cout<<"5"<<std::endl; } } @@ -1176,8 +1174,6 @@ void piecewisePolynomialCurveTest(bool& error) res = ppc_C0(1.5); ComparePoints(point_t(1.5,1.5,1.5),res,errmsg1,error); - std::cout<<"here"<<std::endl; - // piecewise curve C1 from Hermite point_t p0(0.,0.,0.); point_t p1(1.,2.,3.); @@ -1191,35 +1187,81 @@ void piecewisePolynomialCurveTest(bool& error) std::vector< pair_point_tangent_t > control_points_1; control_points_1.push_back(pair_point_tangent_t(p1,t1)); control_points_1.push_back(pair_point_tangent_t(p2,t2)); // control_points_1 = 2nd piece of curve - std::vector< double > time_control_points; - time_control_points.push_back(0.); - time_control_points.push_back(1.); // For both curves, time will be between [0,1] - cubic_hermite_spline_t chs0(control_points_0.begin(), control_points_0.end(), time_control_points); - cubic_hermite_spline_t chs1(control_points_1.begin(), control_points_1.end(), time_control_points); + std::vector< double > time_control_points0, time_control_points1; + time_control_points0.push_back(0.); + time_control_points0.push_back(1.); // hermite 0 between [0,1] + time_control_points1.push_back(1.); + time_control_points1.push_back(3.); // hermite 1 between [1,3] + cubic_hermite_spline_t chs0(control_points_0.begin(), control_points_0.end(), time_control_points0); + cubic_hermite_spline_t chs1(control_points_1.begin(), control_points_1.end(), time_control_points1); // Convert to polynomial polynomial_t pol_chs0 = polynom_from_hermite<cubic_hermite_spline_t, polynomial_t>(chs0); polynomial_t pol_chs1 = polynom_from_hermite<cubic_hermite_spline_t, polynomial_t>(chs1); piecewise_polynomial_curve_t ppc_C1(pol_chs0); ppc_C1.add_polynomial_curve(pol_chs1); + // piecewise curve C2 + point_t a0(0,0,0); + point_t b0(1,1,1); + t_point_t veca, vecb; + // in [0,1[ + veca.push_back(a0); + veca.push_back(b0); // x=t, y=t, z=t + // in [1,2] + vecb.push_back(b0); + vecb.push_back(b0); // x=(t-1)+1, y=(t-1)+1, z=(t-1)+1 + polynomial_t pola(veca.begin(), veca.end(), 0, 1); + polynomial_t polb(vecb.begin(), vecb.end(), 1, 2); + piecewise_polynomial_curve_t ppc_C2(pola); + ppc_C2.add_polynomial_curve(polb); + // check C0 continuity - std::string errmsg2("in piecewise polynomial curve test, Error while checking continuity C0 "); - // Test 1 : not C0 + std::string errmsg2("in piecewise polynomial curve test, Error while checking continuity C0 on "); + std::string errmsg3("in piecewise polynomial curve test, Error while checking continuity C1 on "); + std::string errmsg4("in piecewise polynomial curve test, Error while checking continuity C2 on "); + // not C0 bool isC0 = ppc.isContinuous(0); if (isC0) { std::cout << errmsg2 << " ppc " << std::endl; error = true; } - // Test 1 : C0 + // C0 isC0 = ppc_C0.isContinuous(0); if (not isC0) { std::cout << errmsg2 << " ppc_C0 " << std::endl; error = true; } - + // not C1 + bool isC1 = ppc_C0.isContinuous(1); + if (isC1) + { + std::cout << errmsg3 << " ppc_C0 " << std::endl; + error = true; + } + // C1 + isC1 = ppc_C1.isContinuous(1); + if (not isC1) + { + std::cout << errmsg3 << " ppc_C1 " << std::endl; + error = true; + } + // not C2 + bool isC2 = ppc_C1.isContinuous(2); + if (isC2) + { + std::cout << errmsg4 << " ppc_C1 " << std::endl; + error = true; + } + // C2 + isC2 = ppc_C2.isContinuous(2); + if (not isC2) + { + std::cout << errmsg4 << " ppc_C2 " << std::endl; + error = true; + } } @@ -1244,13 +1286,9 @@ int main(int /*argc*/, char** /*argv[]*/) BezierDerivativeCurveConstraintTest(error); BezierCurveTestCompareHornerAndBernstein(error); BezierDerivativeCurveTimeReparametrizationTest(error); - std::cout<<"here 1"<<std::endl; BezierEvalDeCasteljau(error); - std::cout<<"here 2"<<std::endl; BezierSplitCurve(error); - std::cout<<"here 3"<<std::endl; CubicHermitePairsPositionDerivativeTest(error); - std::cout<<"here 4"<<std::endl; BezierToPolynomialConversionTest(error); CubicHermiteToCubicBezierConversionTest(error); -- GitLab