13 #ifndef bezier_curve_fit_test_suite_hpp
14 #define bezier_curve_fit_test_suite_hpp
30 template<
typename data__>
86 void octave_print(
int figno,
const std::vector<point_type> &pts,
const bezier_type &bez)
const
90 std::cout <<
"figure(" << figno <<
");" << std::endl;
91 std::cout <<
"xpts=[" << pts[0].x();
92 for (i=1; i<pts.size(); ++i)
93 std::cout <<
", " << pts[i].x();
94 std::cout <<
"];" << std::endl;
95 std::cout <<
"ypts=[" << pts[0].y();
96 for (i=1; i<pts.size(); ++i)
97 std::cout <<
", " << pts[i].y();
98 std::cout <<
"];" << std::endl;
100 std::vector<data__> t(101);
101 for (i=0; i<t.size(); ++i)
102 t[i]=static_cast<data__>(i)/(t.size()-1);
104 std::cout <<
"xint=[" << bez.
f(t[0])(0);
105 for (i=1; i<t.size(); ++i)
106 std::cout <<
", " << bez.
f(t[i])(0);
107 std::cout <<
"];" << std::endl;
108 std::cout <<
"yint=[" << bez.
f(t[0])(1);
109 for (i=1; i<t.size(); ++i)
110 std::cout <<
", " << bez.
f(t[i])(1);
111 std::cout <<
"];" << std::endl;
113 std::cout <<
"plot(xpts, ypts, 'bo', xint, yint, 'k-');" << std::endl;
121 for (
size_t i=0; i<n; ++i)
124 pts[i](0)=std::cos(theta);
125 pts[i](1)=std::sin(theta);
134 fit_container_type fcon;
136 std::vector<point_type> pts(10);
138 std::vector<data_type> t;
148 bez.
fit(t, fcon, deg);
152 for (i=0; i<pts.size(); ++i)
157 TEST_ASSERT(bez.
open());
158 TEST_ASSERT(err < 0.110);
161 TEST_ASSERT(pts[0]!=bez.
f(t[0]));
162 TEST_ASSERT(pts[pts.size()-1]!=bez.
f(t[t.size()-1]));
163 TEST_ASSERT(bez.
f(0)!=bez.
f(1));
170 fit_container_type fcon;
172 std::vector<point_type> pts(10);
174 std::vector<data_type> t;
184 bez.
fit(t, fcon, deg);
188 for (i=0; i<pts.size(); ++i)
193 TEST_ASSERT(bez.
closed());
194 TEST_ASSERT(err < 0.765);
197 TEST_ASSERT(pts[0]!=bez.
f(t[0]));
198 TEST_ASSERT(pts[pts.size()-1]!=bez.
f(t[t.size()-1]));
199 TEST_ASSERT(bez.
f(0)==bez.
f(1));
207 data_type eps(std::numeric_limits<data__>::epsilon());
211 fit_container_type fcon;
213 std::vector<point_type> pts(10);
215 std::vector<data_type> t;
227 bez.
fit(t, fcon, deg);
231 for (i=0; i<pts.size(); ++i)
236 TEST_ASSERT(bez.
open());
237 TEST_ASSERT(err < 0.105);
240 TEST_ASSERT(pts[0]==bez.
f(t[0]));
241 TEST_ASSERT((pts[pts.size()-1]-bez.
f(t[t.size()-1])).norm()<81*eps);
242 TEST_ASSERT(bez.
f(0)!=bez.
f(1));
253 fit_container_type fcon;
255 std::vector<point_type> pts(10);
257 std::vector<data_type> t;
268 bez.
fit(t, fcon, deg);
272 for (i=0; i<pts.size(); ++i)
277 TEST_ASSERT(bez.
closed());
278 TEST_ASSERT(err < 0.207);
281 TEST_ASSERT(pts[0]==bez.
f(t[0]));
282 TEST_ASSERT(pts[pts.size()-1]!=bez.
f(t[t.size()-1]));
283 TEST_ASSERT(bez.
f(0)==bez.
f(1));
290 fit_container_type fcon;
292 std::vector<point_type> pts(10);
294 std::vector<data_type> t;
306 bez.
fit(t, fcon, deg);
310 for (i=0; i<pts.size(); ++i)
315 TEST_ASSERT(bez.
closed());
316 TEST_ASSERT(err < 0.233);
319 TEST_ASSERT(pts[0]==bez.
f(t[0]));
320 TEST_ASSERT(pts[pts.size()-1]!=bez.
f(t[t.size()-1]));
321 TEST_ASSERT(bez.
f(0)==bez.
f(1));
322 TEST_ASSERT((bez.
f(t[5])-pts[5]).norm()<15*eps);
332 fit_container_type fcon;
334 std::vector<point_type> pts(10);
336 std::vector<data_type> t;
342 constraint_point_type fp1, fp2;
355 bez.
fit(t, fcon, deg);
359 for (i=0; i<pts.size(); ++i)
364 TEST_ASSERT(bez.
open());
365 TEST_ASSERT(err < 0.366);
368 TEST_ASSERT(tol.approximately_equal(pts[0], bez.
f(t[0])));
369 TEST_ASSERT(tol.approximately_equal(fp1, bez.
fp(t[0])));
370 TEST_ASSERT(tol.approximately_equal(pts[pts.size()-1], bez.
f(t[t.size()-1])));
371 TEST_ASSERT(tol.approximately_equal(fp2, bez.
fp(t[t.size()-1])));
372 TEST_ASSERT(bez.
f(0)!=bez.
f(1));
379 fit_container_type fcon;
381 std::vector<point_type> pts(10);
383 std::vector<data_type> t;
389 constraint_point_type fp1;
398 bez.
fit(t, fcon, deg);
402 for (i=0; i<pts.size(); ++i)
407 TEST_ASSERT(bez.
closed());
408 TEST_ASSERT(err < 0.331);
411 TEST_ASSERT(pts[pts.size()-1]!=bez.
f(t[t.size()-1]));
412 TEST_ASSERT(tol.approximately_equal(pts[0], bez.
f(t[0])));
413 TEST_ASSERT(tol.approximately_equal(fp1, bez.
fp(t[0])));
414 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
421 fit_container_type fcon;
423 std::vector<point_type> pts(10);
425 std::vector<data_type> t;
431 constraint_point_type fp1, fp2;
444 bez.
fit(t, fcon, deg);
448 for (i=0; i<pts.size(); ++i)
453 TEST_ASSERT(bez.
closed());
454 TEST_ASSERT(err < 0.418);
457 TEST_ASSERT(pts[pts.size()-1]!=bez.
f(t[t.size()-1]));
458 TEST_ASSERT(tol.approximately_equal(pts[0], bez.
f(t[0])));
460 if (
typeid(data_type)!=
typeid(
float))
462 TEST_ASSERT(tol.approximately_equal(fp1, bez.
fp(t[0])));
464 TEST_ASSERT(tol.approximately_equal(pts[5], bez.
f(t[5])));
465 TEST_ASSERT(tol.approximately_equal(fp2, bez.
fp(t[5])));
466 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
476 fit_container_type fcon;
478 std::vector<point_type> pts(20);
480 std::vector<data_type> t;
486 constraint_point_type fp1, fpp1, fp2, fpp2;
505 bez.
fit(t, fcon, deg);
509 for (i=0; i<pts.size(); ++i)
514 TEST_ASSERT(bez.
open());
515 TEST_ASSERT(err < 0.372);
518 TEST_ASSERT(tol.approximately_equal(pts[0], bez.
f(t[0])));
519 TEST_ASSERT(tol.approximately_equal(fp1, bez.
fp(t[0])));
520 TEST_ASSERT(tol.approximately_equal(fpp1, bez.
fpp(t[0])));
521 TEST_ASSERT(tol.approximately_equal(pts[pts.size()-1], bez.
f(t[t.size()-1])));
522 TEST_ASSERT(tol.approximately_equal(fp2, bez.
fp(t[t.size()-1])));
523 TEST_ASSERT(tol.approximately_equal(fpp2, bez.
fpp(t[t.size()-1])));
524 TEST_ASSERT(bez.
f(0)!=bez.
f(1));
531 fit_container_type fcon;
533 std::vector<point_type> pts(20);
535 std::vector<data_type> t;
541 constraint_point_type fp1, fpp1;
553 bez.
fit(t, fcon, deg);
557 for (i=0; i<pts.size(); ++i)
562 TEST_ASSERT(bez.
closed());
563 TEST_ASSERT(err < 0.0479);
566 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
567 TEST_ASSERT(tol.approximately_equal(pts[0], bez.
f(t[0])));
568 TEST_ASSERT(tol.approximately_equal(fp1, bez.
fp(t[0])));
569 TEST_ASSERT(tol.approximately_equal(fpp1, bez.
fpp(t[0])));
570 TEST_ASSERT(pts[pts.size()-1]!=bez.
f(t[t.size()-1]));
577 fit_container_type fcon;
579 std::vector<point_type> pts(20);
581 std::vector<data_type> t;
587 constraint_point_type fp1, fpp1, fp2, fpp2;
606 bez.
fit(t, fcon, deg);
610 for (i=0; i<pts.size(); ++i)
615 TEST_ASSERT(bez.
closed());
616 TEST_ASSERT(err < 0.0785);
619 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
620 TEST_ASSERT(tol.approximately_equal(pts[0], bez.
f(t[0])));
621 TEST_ASSERT(tol.approximately_equal(fp1, bez.
fp(t[0])));
622 TEST_ASSERT(tol.approximately_equal(fpp1, bez.
fpp(t[0])));
623 TEST_ASSERT(tol.approximately_equal(pts[10], bez.
f(t[10])));
624 TEST_ASSERT(tol.approximately_equal(fp2, bez.
fp(t[10])));
625 TEST_ASSERT(tol.approximately_equal(fpp2, bez.
fpp(t[10])));
626 TEST_ASSERT(pts[pts.size()-1]!=bez.
f(t[t.size()-1]));
636 fit_container_type fcon;
638 std::vector<point_type> pts(20);
640 std::vector<data_type> t;
653 TEST_ASSERT(bez.
closed());
654 TEST_ASSERT(err < 0.393);
657 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
658 TEST_ASSERT(bez.
fp(0)!=bez.
fp(1));
659 TEST_ASSERT(bez.
fpp(0)!=bez.
fpp(1));
666 fit_container_type fcon;
668 std::vector<point_type> pts(20);
670 std::vector<data_type> t;
683 TEST_ASSERT(bez.
closed());
684 TEST_ASSERT(err < 0.0312);
687 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
688 TEST_ASSERT(tol.approximately_equal(bez.
fp(0), bez.
fp(1)));
689 TEST_ASSERT(bez.
fpp(0)!=bez.
fpp(1));
696 fit_container_type fcon;
698 std::vector<point_type> pts(20);
700 std::vector<data_type> t;
713 TEST_ASSERT(bez.
closed());
714 TEST_ASSERT(err < 0.0343);
717 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
718 TEST_ASSERT(tol.approximately_equal(bez.
fp(0), bez.
fp(1)));
719 TEST_ASSERT(tol.approximately_equal(bez.
fpp(0), bez.
fpp(1)));
726 fit_container_type fcon;
728 std::vector<point_type> pts(20);
730 std::vector<data_type> t;
744 TEST_ASSERT(bez.
closed());
745 TEST_ASSERT(err < 0.0185);
748 TEST_ASSERT(tol.approximately_equal(bez.
f(0), pts[0]));
749 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
750 TEST_ASSERT(bez.
fp(0)!=bez.
fp(1));
751 TEST_ASSERT(bez.
fpp(0)!=bez.
fpp(1));
758 fit_container_type fcon;
760 std::vector<point_type> pts(20);
762 std::vector<data_type> t;
768 constraint_point_type fp0;
780 TEST_ASSERT(bez.
closed());
781 TEST_ASSERT(err < 0.0395);
784 TEST_ASSERT(tol.approximately_equal(bez.
f(0), pts[0]));
785 TEST_ASSERT(tol.approximately_equal(bez.
fp(0), fp0));
786 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
787 TEST_ASSERT(tol.approximately_equal(bez.
fp(0), bez.
fp(1)));
788 TEST_ASSERT(bez.
fpp(0)!=bez.
fpp(1));
795 fit_container_type fcon;
797 std::vector<point_type> pts(20);
799 std::vector<data_type> t;
805 constraint_point_type fp0, fpp0;
820 TEST_ASSERT(bez.
closed());
821 TEST_ASSERT(err < 0.141);
824 TEST_ASSERT(tol.approximately_equal(bez.
f(0), pts[0]));
825 TEST_ASSERT(tol.approximately_equal(bez.
fp(0), fp0));
826 TEST_ASSERT(tol.approximately_equal(bez.
fpp(0), fpp0));
827 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
828 TEST_ASSERT(tol.approximately_equal(bez.
fp(0), bez.
fp(1)));
829 TEST_ASSERT(tol.approximately_equal(bez.
fpp(0), bez.
fpp(1)));
836 fit_container_type fcon;
838 std::vector<point_type> pts(20);
840 std::vector<data_type> t;
858 TEST_ASSERT(bez.
closed());
859 TEST_ASSERT(err < 0.0180);
863 TEST_ASSERT(tol.approximately_equal(bez.
f(t5), f5));
864 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
865 TEST_ASSERT(bez.
fp(0)!=bez.
fp(1));
866 TEST_ASSERT(bez.
fpp(0)!=bez.
fpp(1));
873 fit_container_type fcon;
875 std::vector<point_type> pts(20);
877 std::vector<data_type> t;
895 TEST_ASSERT(bez.
closed());
896 TEST_ASSERT(err < 0.0316);
900 TEST_ASSERT(tol.approximately_equal(bez.
f(t5), f5));
901 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
902 TEST_ASSERT(tol.approximately_equal(bez.
fp(0), bez.
fp(1)));
903 TEST_ASSERT(bez.
fpp(0)!=bez.
fpp(1));
910 fit_container_type fcon;
912 std::vector<point_type> pts(20);
914 std::vector<data_type> t;
932 TEST_ASSERT(bez.
closed());
933 TEST_ASSERT(err < 0.0353);
937 TEST_ASSERT(tol.approximately_equal(bez.
f(t5), f5));
938 TEST_ASSERT(tol.approximately_equal(bez.
f(0), bez.
f(1)));
939 TEST_ASSERT(tol.approximately_equal(bez.
fp(0), bez.
fp(1)));
940 TEST_ASSERT(tol.approximately_equal(bez.
fpp(0), bez.
fpp(1)));
963 data_type eps(std::numeric_limits<data__>::epsilon());
967 fit_container_type fcon;
968 std::vector<point_type> pts(4);
970 std::vector<data_type> t;
981 TEST_ASSERT(static_cast<size_t>(bez.
degree()+1)==pts.size());
982 TEST_ASSERT(bez.
open());
985 TEST_ASSERT(bez.
f(t[0])==pts[0]);
986 TEST_ASSERT((bez.
f(t[1])-pts[1]).norm()<4*eps);
987 TEST_ASSERT((bez.
f(t[2])-pts[2]).norm()<7*eps);
988 TEST_ASSERT((bez.
f(t[3])-pts[3]).norm()<13*eps);
995 fit_container_type fcon;
996 std::vector<point_type> pts(4);
998 std::vector<data_type> t;
1010 TEST_ASSERT(static_cast<size_t>(bez.
degree()+1)==pts.size()+1);
1011 TEST_ASSERT(bez.
closed());
1014 TEST_ASSERT(bez.
f(t[0])==pts[0]);
1015 TEST_ASSERT((bez.
f(t[1])-pts[1]).norm()<3*eps);
1016 TEST_ASSERT((bez.
f(t[2])-pts[2]).norm()<13*eps);
1017 TEST_ASSERT((bez.
f(t[3])-pts[3]).norm()<37*eps);
1018 TEST_ASSERT(bez.
f(0)==bez.
f(1));
1025 fit_container_type fcon;
1026 std::vector<point_type> pts(4);
1028 std::vector<data_type> t;
1044 TEST_ASSERT(static_cast<size_t>(bez.
degree()+1)==pts.size()+1);
1045 TEST_ASSERT(bez.
open());
1048 TEST_ASSERT((bez.
f(t[0])-pts[0]).norm()<4*eps);
1049 TEST_ASSERT((bez.
f(t[1])-pts[1]).norm()<10*eps);
1050 TEST_ASSERT((bez.
f(t[2])-pts[2]).norm()<28*eps);
1051 TEST_ASSERT((bez.
f(t[3])-pts[3]).norm()<63*eps);
1052 TEST_ASSERT((bez.
fp(t[1])-fp1).norm()<17*eps);
1059 fit_container_type fcon;
1060 std::vector<point_type> pts(4);
1062 std::vector<data_type> t;
1079 TEST_ASSERT(static_cast<size_t>(bez.
degree()+1)==pts.size()+3);
1080 TEST_ASSERT(bez.
closed());
1083 TEST_ASSERT((bez.
f(t[0])-pts[0]).norm()<5*eps);
1084 TEST_ASSERT((bez.
f(t[1])-pts[1]).norm()<3*eps);
1085 TEST_ASSERT((bez.
f(t[2])-pts[2]).norm()<21*eps);
1086 TEST_ASSERT((bez.
f(t[3])-pts[3]).norm()<89*eps);
1087 TEST_ASSERT((bez.
fp(t[1])-fp1).norm()<22*eps);
1088 TEST_ASSERT((bez.
f(0)-bez.
f(1)).norm()<202*eps);
1089 TEST_ASSERT(bez.
f(0)==bez.
f(1));
1096 fit_container_type fcon;
1097 std::vector<point_type> pts(4);
1099 std::vector<data_type> t;
1105 point_type fp1, fpp1;
1118 TEST_ASSERT(static_cast<size_t>(bez.
degree()+1)==pts.size()+2);
1119 TEST_ASSERT(bez.
open());
1122 TEST_ASSERT((bez.
f(t[0])-pts[0]).norm()<9*eps);
1123 TEST_ASSERT((bez.
f(t[1])-pts[1]).norm()<9*eps);
1124 TEST_ASSERT((bez.
f(t[2])-pts[2]).norm()<84*eps);
1125 TEST_ASSERT((bez.
f(t[3])-pts[3]).norm()<2*eps);
1126 TEST_ASSERT((bez.
fp(t[1])-fp1).norm()<130*eps);
1127 TEST_ASSERT((bez.
fpp(t[1])-fpp1).norm()<353*eps);
1134 fit_container_type fcon;
1135 std::vector<point_type> pts(4);
1137 std::vector<data_type> t;
1143 point_type fp1, fpp1;
1157 TEST_ASSERT(static_cast<size_t>(bez.
degree()+1)==pts.size()+5);
1158 TEST_ASSERT(bez.
closed());
1161 TEST_ASSERT((bez.
f(t[0])-pts[0]).norm()<4*eps);
1162 TEST_ASSERT((bez.
f(t[1])-pts[1]).norm()<4*eps);
1163 TEST_ASSERT((bez.
f(t[2])-pts[2]).norm()<32*eps);
1164 TEST_ASSERT((bez.
f(t[3])-pts[3]).norm()<93*eps);
1165 TEST_ASSERT((bez.
fp(t[1])-fp1).norm()<45*eps);
1166 TEST_ASSERT((bez.
fpp(t[1])-fpp1).norm()<398*eps);
1167 TEST_ASSERT(bez.
f(0)==bez.
f(1));
1168 TEST_ASSERT((bez.
fp(0)-bez.
fp(1)).norm()<5.30e3*eps);
1169 TEST_ASSERT((bez.
fpp(0)-bez.
fpp(1)).norm()<24.1e3*eps);
fit_container_type::constraint_point_type constraint_point_type
Definition: bezier_curve_fit_test_suite.hpp:36
~bezier_curve_fit_test_suite()
Definition: bezier_curve_fit_test_suite.hpp:81
Definition: continuity.hpp:26
bool open() const
Definition: bezier.hpp:311
Definition: continuity.hpp:28
Derived1__::Scalar distance(const Eigen::MatrixBase< Derived1__ > &p1, const Eigen::MatrixBase< Derived2__ > &p2)
Definition: distance.hpp:33
error_code add_start_C2_constraint()
Definition: fit_container.hpp:517
void interpolate_test()
Definition: bezier_curve_fit_test_suite.hpp:961
constraint_info::point_type constraint_point_type
Definition: fit_container.hpp:117
Eigen::Matrix< data_type, 1, dim__ > point_type
Definition: bezier.hpp:114
error_code add_C0_constraint(const index_type &i)
Definition: fit_container.hpp:562
void AddTests(const long double &)
Definition: bezier_curve_fit_test_suite.hpp:65
bezier_type::tolerance_type tolerance_type
Definition: bezier_curve_fit_test_suite.hpp:40
eli::geom::curve::bezier< data__, 3 > bezier_type
Definition: bezier_curve_fit_test_suite.hpp:34
point_type f(const data_type &t) const
Definition: bezier.hpp:324
error_code add_C2_constraint(const index_type &i)
Definition: fit_container.hpp:611
bool closed() const
Definition: bezier.hpp:312
tol__ tolerance_type
Definition: bezier.hpp:118
Definition: fit_container.hpp:34
void fit_C0_ends_test()
Definition: bezier_curve_fit_test_suite.hpp:205
void fit_C1_ends_test()
Definition: bezier_curve_fit_test_suite.hpp:328
void fit_free_ends_test()
Definition: bezier_curve_fit_test_suite.hpp:130
data_type fit_with_error(const fit_container_type &fcon, const index_type °_in)
Definition: bezier.hpp:538
error_code add_start_C0_constraint()
Definition: fit_container.hpp:502
index_type degree() const
Definition: bezier.hpp:191
void create_circle(std::vector< point_type > &pts)
Definition: bezier_curve_fit_test_suite.hpp:116
error_code add_end_C0_constraint()
Definition: fit_container.hpp:532
error_code add_start_C1_constraint()
Definition: fit_container.hpp:507
bezier_type::index_type index_type
Definition: bezier_curve_fit_test_suite.hpp:37
point_type fpp(const data_type &t) const
Definition: bezier.hpp:369
Definition: continuity.hpp:27
bezier_type::fit_container_type fit_container_type
Definition: bezier_curve_fit_test_suite.hpp:35
Definition: bezier_curve_fit_test_suite.hpp:31
void fit_C2_ends_test()
Definition: bezier_curve_fit_test_suite.hpp:472
bezier_curve_fit_test_suite()
Definition: bezier_curve_fit_test_suite.hpp:77
void interpolate(const fit_container_type &fcon)
Definition: bezier.hpp:550
error_code add_C1_constraint(const index_type &i)
Definition: fit_container.hpp:575
void set_end_flag(const eli::geom::general::continuity &op)
Definition: fit_container.hpp:399
void fit(const fit_container_type &fcon, const index_type °_in)
Definition: bezier.hpp:527
void fit_closed_test()
Definition: bezier_curve_fit_test_suite.hpp:632
bezier_type::data_type data_type
Definition: bezier_curve_fit_test_suite.hpp:39
tolerance_type tol
Definition: bezier_curve_fit_test_suite.hpp:42
point_type fp(const data_type &t) const
Definition: bezier.hpp:344
data__ data_type
Definition: bezier.hpp:113
void octave_print(int figno, const std::vector< point_type > &pts, const bezier_type &bez) const
Definition: bezier_curve_fit_test_suite.hpp:86
bezier_type::point_type point_type
Definition: bezier_curve_fit_test_suite.hpp:38
error_code add_end_C2_constraint()
Definition: fit_container.hpp:547
Definition: bezier.hpp:109
void set_points(it__ itb, it__ ite)
Definition: fit_container.hpp:444
error_code add_end_C1_constraint()
Definition: fit_container.hpp:537
void AddTests(const float &)
Definition: bezier_curve_fit_test_suite.hpp:45
Definition: continuity.hpp:29
point_type::Index index_type
Definition: bezier.hpp:116
void AddTests(const double &)
Definition: bezier_curve_fit_test_suite.hpp:55