From 85687ecff5c022dfc0e1b007f953243909a5c611 Mon Sep 17 00:00:00 2001 From: Steve T <stonneau@hotmail.fr> Date: Fri, 8 Feb 2019 00:17:31 +0100 Subject: [PATCH] [BUG FIX] evalXXX methods do not consider time --- include/hpp/spline/bezier_curve.h | 14 ++++++++------ tests/Main.cpp | 9 ++++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/include/hpp/spline/bezier_curve.h b/include/hpp/spline/bezier_curve.h index 74e23ed..40e149f 100644 --- a/include/hpp/spline/bezier_curve.h +++ b/include/hpp/spline/bezier_curve.h @@ -141,7 +141,7 @@ struct bezier_curve : public curve_abc<Time, Numeric, Dim, Safe, Point> virtual point_t operator()(const time_t t) const { num_t nT = t / T_; - if(Safe &! (0 <= nT && nT <= 1)) + if(Safe &! (0 <= t && t <= T_)) { throw std::out_of_range("can't evaluate bezier curve, out of range"); // TODO } @@ -166,7 +166,7 @@ struct bezier_curve : public curve_abc<Time, Numeric, Dim, Safe, Point> + 3 * pts_[2] * nT * nT * dt + pts_[3] * nT * nT *nT); default : - return mult_T_ * evalHorner(nT); + return evalHorner(t); break; } } @@ -227,20 +227,22 @@ struct bezier_curve : public curve_abc<Time, Numeric, Dim, Safe, Point> /// point_t evalBernstein(const Numeric u) const { + const Numeric t = u/T_; point_t res = point_t::Zero(Dim); typename t_point_t::const_iterator pts_it = pts_.begin(); for(typename std::vector<Bern<Numeric> >::const_iterator cit = bernstein_.begin(); cit !=bernstein_.end(); ++cit, ++pts_it) - res += cit->operator()(u) * (*pts_it); - return res; + res += cit->operator()(t) * (*pts_it); + return res*mult_T_; } /// /// \brief Evaluates all Bernstein polynomes for a certain degree using horner's scheme /// - point_t evalHorner(const Numeric t) const + point_t evalHorner(const Numeric v) const { + const Numeric t = v/T_; typename t_point_t::const_iterator pts_it = pts_.begin(); Numeric u, bc, tn; u = 1.0 - t; @@ -253,7 +255,7 @@ struct bezier_curve : public curve_abc<Time, Numeric, Dim, Safe, Point> bc = bc*((num_t)(degree_-i+1))/i; tmp = (tmp + tn*bc*(*pts_it))*u; } - return (tmp + tn*t*(*pts_it)); + return (tmp + tn*t*(*pts_it))*mult_T_; } const t_point_t& waypoints() const {return pts_;} diff --git a/tests/Main.cpp b/tests/Main.cpp index 0b9b140..5046ad1 100644 --- a/tests/Main.cpp +++ b/tests/Main.cpp @@ -181,11 +181,14 @@ void BezierCurveTest(bool& error) ComparePoints(d, res1, errMsg + "3(1) ", error); //testing bernstein polynomes + bezier_curve_t cf5(params.begin(), params.end(),2.); std::string errMsg2("In test BezierCurveTest ; Bernstein polynoms do not evaluate as analytical evaluation"); - for(double d = 0.; d <1.; d+=0.1) + for(double d = 0.; d <2.; d+=0.1) { - ComparePoints( cf3.evalBernstein(d) , cf3 (d), errMsg2, error); - ComparePoints( cf3.evalHorner(d) , cf3 (d), errMsg2, error); + ComparePoints( cf5.evalBernstein(d) , cf5 (d), errMsg2, error); + ComparePoints( cf5.evalHorner(d) , cf5 (d), errMsg2, error); + ComparePoints( cf5.compute_derivate(1).evalBernstein(d) , cf5.compute_derivate(1) (d), errMsg2, error); + ComparePoints( cf5.compute_derivate(1).evalHorner(d) , cf5.compute_derivate(1) (d), errMsg2, error); } bool error_in(true); -- GitLab