diff --git a/include/curves/bezier_curve.h b/include/curves/bezier_curve.h index 2e439dcc212fd3cc80b61caf008dde6e140f98a3..56210193005728412381f4faaf3966de25f41005 100644 --- a/include/curves/bezier_curve.h +++ b/include/curves/bezier_curve.h @@ -348,12 +348,14 @@ struct bezier_curve : public curve_abc<Time, Numeric, Dim, Safe, Point> t_point_t add_constraints(In PointsBegin, In PointsEnd, const curve_constraints_t& constraints) { t_point_t res; + num_t T = T_max_ - T_min_; + num_t T_square = T*T; point_t P0, P1, P2, P_n_2, P_n_1, PN; P0 = *PointsBegin; PN = *(PointsEnd-1); - P1 = P0+ constraints.init_vel / (num_t)degree_; - P_n_1 = PN -constraints.end_vel / (num_t)degree_; - P2 = constraints.init_acc / (num_t)(degree_ * (degree_-1)) + 2* P1 - P0; - P_n_2 = constraints.end_acc / (num_t)(degree_ * (degree_-1)) + 2* P_n_1 - PN; + P1 = P0+ constraints.init_vel * T / (num_t)degree_; + P_n_1 = PN- constraints.end_vel * T / (num_t)degree_; + P2 = constraints.init_acc * T_square / (num_t)(degree_ * (degree_-1)) + 2* P1 - P0; + P_n_2 = constraints.end_acc * T_square / (num_t)(degree_ * (degree_-1)) + 2* P_n_1 - PN; res.push_back(P0); res.push_back(P1); diff --git a/tests/Main.cpp b/tests/Main.cpp index e20739055f4825026d6fcbf4a5faaa1bb8f8103e..fc3b4d8c8fb4aabfe81b1f978030f1fe79ae312f 100644 --- a/tests/Main.cpp +++ b/tests/Main.cpp @@ -438,20 +438,22 @@ void BezierDerivativeCurveConstraintTest(bool& error) std::vector<point_t> params; params.push_back(a); params.push_back(b); - params.push_back(c); - bezier_curve_t cf3(params.begin(), params.end(), constraints); - - assert(cf3.degree_ == params.size() + 3); - assert(cf3.size_ == params.size() + 4); - - ComparePoints(a, cf3(0), errMsg, error); - ComparePoints(c, cf3(1), errMsg, error); - ComparePoints(constraints.init_vel, cf3.derivate(0.,1), errMsg, error); - ComparePoints(constraints.end_vel , cf3.derivate(1.,1), errMsg, error); - ComparePoints(constraints.init_acc, cf3.derivate(0.,2), errMsg, error); - ComparePoints(constraints.end_vel, cf3.derivate(1.,1), errMsg, error); - ComparePoints(constraints.end_acc, cf3.derivate(1.,2), errMsg, error); + + bezier_curve_t::num_t T_min = 1.0; + bezier_curve_t::num_t T_max = 3.0; + bezier_curve_t cf(params.begin(), params.end(), constraints, T_min, T_max); + + assert(cf.degree_ == params.size() + 3); + assert(cf.size_ == params.size() + 4); + + ComparePoints(a, cf(T_min), errMsg, error); + ComparePoints(c, cf(T_max), errMsg, error); + ComparePoints(constraints.init_vel, cf.derivate(T_min,1), errMsg, error); + ComparePoints(constraints.end_vel , cf.derivate(T_max,1), errMsg, error); + ComparePoints(constraints.init_acc, cf.derivate(T_min,2), errMsg, error); + ComparePoints(constraints.end_vel, cf.derivate(T_max,1), errMsg, error); + ComparePoints(constraints.end_acc, cf.derivate(T_max,2), errMsg, error); } @@ -480,8 +482,8 @@ void toPolynomialConversionTest(bool& error) control_points.push_back(h); control_points.push_back(i); - double T_min = 1.0; - double T_max = 3.0; + bezier_curve_t::num_t T_min = 1.0; + bezier_curve_t::num_t T_max = 3.0; bezier_curve_t bc(control_points.begin(), control_points.end(),T_min, T_max); polynomial_t pol = polynomial_from_curve<polynomial_t, bezier_curve_t>(bc); compareCurves<polynomial_t, bezier_curve_t>(pol, bc, errMsg, error);