13 #ifndef explicit_bezier_curve_test_suite_hpp
14 #define explicit_bezier_curve_test_suite_hpp
30 template<
typename data__>
85 void octave_print(
int figno,
const std::vector<point_type, Eigen::aligned_allocator<point_type> > &pts,
const curve_type &bez)
const
89 std::cout <<
"figure(" << figno <<
");" << std::endl;
90 std::cout <<
"xpts=[" << pts[0].x();
91 for (i=1; i<pts.size(); ++i)
92 std::cout <<
", " << pts[i].x();
93 std::cout <<
"];" << std::endl;
94 std::cout <<
"ypts=[" << pts[0].y();
95 for (i=1; i<pts.size(); ++i)
96 std::cout <<
", " << pts[i].y();
97 std::cout <<
"];" << std::endl;
99 std::vector<data_type> t(101);
100 for (i=0; i<t.size(); ++i)
101 t[i]=static_cast<data_type>(i)/(t.size()-1);
103 std::cout <<
"xint=[" << bez.
f(t[0])(0);
104 for (i=1; i<t.size(); ++i)
105 std::cout <<
", " << bez.
f(t[i])(0);
106 std::cout <<
"];" << std::endl;
107 std::cout <<
"yint=[" << bez.
f(t[0])(1);
108 for (i=1; i<t.size(); ++i)
109 std::cout <<
", " << bez.
f(t[i])(1);
110 std::cout <<
"];" << std::endl;
112 std::cout <<
"plot(xpts, ypts, 'bo', xint, yint, 'k-');" << std::endl;
115 void create_circle(std::vector<point_type, Eigen::aligned_allocator<point_type> > &pts)
119 for (
size_t i=0; i<n; ++i)
122 pts[i](0)=(1-std::cos(theta))/2;
123 pts[i](1)=std::sin(theta);
129 curve_type ebc1(3), ebc2;
130 control_point_type cntrl_in[4];
138 for (index_type i=0; i<4; ++i)
140 ebc1.set_control_point(cntrl_in[i], i);
143 for (index_type i=0; i<4; ++i)
145 TEST_ASSERT(ebc1.get_control_point(i)==cntrl_in[i]);
149 curve_type ebcc1(ebc1);
150 for (index_type i=0; i<4; ++i)
157 for (index_type i=0; i<4; ++i)
163 TEST_ASSERT(ebc2.
degree()==3);
168 curve_type ebc1(3), ebc2;
169 control_point_type cntrl_in[4];
177 for (index_type i=0; i<4; ++i)
179 ebc1.set_control_point(cntrl_in[i], i);
184 for (index_type i=0; i<4; ++i)
193 data_type eps(std::numeric_limits<data__>::epsilon());
195 control_point_type cntrl_in[5];
196 typename bezier_curve_type::control_point_type bez_cntrl[5];
198 bezier_curve_type bc;
208 bez_cntrl[0] << 0, 2;
209 bez_cntrl[1] << 0.25, 1.5;
210 bez_cntrl[2] << 0.5, 0;
211 bez_cntrl[3] << 0.75, 1;
212 bez_cntrl[4] << 1, 0.5;
216 for (index_type i=0; i<5; ++i)
219 bc.set_control_point(bez_cntrl[i], i);
226 TEST_ASSERT(eval_out==eval_ref);
230 TEST_ASSERT(eval_out==eval_ref);
233 t=
static_cast<data__
>(0.45);
236 TEST_ASSERT((eval_out-eval_ref).norm()<1.1*eps);
242 data_type eps(std::numeric_limits<data__>::epsilon());
243 control_point_type cntrl_in[5];
244 typename bezier_curve_type::control_point_type bez_cntrl[5];
246 bezier_curve_type bc;
256 bez_cntrl[0] << 0, 2;
257 bez_cntrl[1] << 0.25, 1.5;
258 bez_cntrl[2] << 0.5, 0;
259 bez_cntrl[3] << 0.75, 1;
260 bez_cntrl[4] << 1, 0.5;
264 for (index_type i=0; i<5; ++i)
267 bc.set_control_point(bez_cntrl[i], i);
274 TEST_ASSERT(eval_out==eval_ref);
278 TEST_ASSERT(eval_out==eval_ref);
281 t=
static_cast<data__
>(0.45);
284 if (
typeid(data__)==
typeid(
float))
286 TEST_ASSERT((eval_out-eval_ref).norm()<3*eps);
290 TEST_ASSERT(eval_out==eval_ref);
297 TEST_ASSERT(eval_out==eval_ref);
301 TEST_ASSERT(eval_out==eval_ref);
304 t=
static_cast<data__
>(0.45);
307 if (
typeid(data__)==
typeid(
float))
309 TEST_ASSERT((eval_out-eval_ref).norm()<17*eps);
313 TEST_ASSERT(eval_out==eval_ref);
318 eval_out=ebc.
fppp(t);
320 TEST_ASSERT(eval_out==eval_ref);
322 eval_out=ebc.
fppp(t);
324 TEST_ASSERT(eval_out==eval_ref);
327 t=
static_cast<data__
>(0.45);
328 eval_out=ebc.
fppp(t);
330 TEST_ASSERT(eval_out==eval_ref);
333 data_type curv_out, curv_ref;
337 TEST_ASSERT(curv_out==curv_ref);
341 TEST_ASSERT(curv_out==curv_ref);
344 t=
static_cast<data__
>(0.45);
347 if (
typeid(data__)==
typeid(
float))
349 TEST_ASSERT((eval_out-eval_ref).norm()<3*eps);
353 TEST_ASSERT(curv_out==curv_ref);
360 data_type eps(std::numeric_limits<data__>::epsilon());
361 control_point_type cntrl_in[5];
362 typename bezier_curve_type::control_point_type bez_cntrl[5];
364 bezier_curve_type bc;
374 bez_cntrl[0] << 0, 2;
375 bez_cntrl[1] << 0.25, 1.5;
376 bez_cntrl[2] << 0.5, 0;
377 bez_cntrl[3] << 0.75, 1;
378 bez_cntrl[4] << 1, 0.5;
382 for (index_type i=0; i<5; ++i)
385 bc.set_control_point(bez_cntrl[i], i);
392 TEST_ASSERT(ebc.
degree()==bc.degree());
398 TEST_ASSERT(eval_out==eval_ref);
402 if (
typeid(data_type)==
typeid(
double))
404 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
408 TEST_ASSERT(eval_out==eval_ref);
412 t=
static_cast<data__
>(0.45);
415 TEST_ASSERT((eval_out-eval_ref).norm()<2.1*eps);
421 TEST_ASSERT(eval_out==eval_ref);
425 TEST_ASSERT((eval_out-eval_ref).norm()<25*eps);
428 t=
static_cast<data__
>(0.45);
431 TEST_ASSERT((eval_out-eval_ref).norm()<4.1*eps);
437 TEST_ASSERT(eval_out==eval_ref);
441 TEST_ASSERT((eval_out-eval_ref).norm()<11*eps);
444 t=
static_cast<data__
>(0.45);
447 TEST_ASSERT((eval_out-eval_ref).norm()<17*eps);
451 eval_out=ebc.
fppp(t);
453 TEST_ASSERT((eval_out-eval_ref).norm()<132*eps);
455 eval_out=ebc.
fppp(t);
457 TEST_ASSERT((eval_out-eval_ref).norm()<151*eps);
460 t=
static_cast<data__
>(0.45);
461 eval_out=ebc.
fppp(t);
463 TEST_ASSERT((eval_out-eval_ref).norm()<65*eps);
469 TEST_ASSERT(curv_out==curv_ref);
473 TEST_ASSERT(std::abs(curv_out-curv_ref)<48*eps);
476 t=
static_cast<data__
>(0.45);
479 TEST_ASSERT(std::abs(curv_out-curv_ref)<10*eps);
487 control_point_type cntrl_in[9];
488 typename bezier_curve_type::control_point_type bez_cntrl[9];
490 bezier_curve_type bc;
502 bez_cntrl[0] <<
static_cast<data__
>(0), 2.0;
503 bez_cntrl[1] <<
static_cast<data__
>(0.125), 1.5;
504 bez_cntrl[2] <<
static_cast<data__
>(0.25), 1.0;
505 bez_cntrl[3] <<
static_cast<data__
>(0.375), 0.5;
506 bez_cntrl[4] <<
static_cast<data__
>(0.5), 0.0;
507 bez_cntrl[5] <<
static_cast<data__
>(0.625),-0.5;
508 bez_cntrl[6] <<
static_cast<data__
>(0.75), -1.0;
509 bez_cntrl[7] <<
static_cast<data__
>(0.875), 1.0;
510 bez_cntrl[8] <<
static_cast<data__
>(1), 0.5;
514 for (index_type i=0; i<9; ++i)
517 bc.set_control_point(bez_cntrl[i], i);
522 for(index_type i=0; i<8; ++i)
524 if (
typeid(data__)==
typeid(
float))
526 TEST_ASSERT((ebc.
get_control_point(i).col(0)-bc.get_control_point(i).col(1)).norm()<36*std::numeric_limits<data__>::epsilon());
538 control_point_type cntrl_in[9];
539 typename bezier_curve_type::control_point_type bez_cntrl[9];
541 bezier_curve_type bc;
553 bez_cntrl[0] <<
static_cast<data__
>(0), 2.0;
554 bez_cntrl[1] <<
static_cast<data__
>(0.125), 1.5;
555 bez_cntrl[2] <<
static_cast<data__
>(0.25), 1.0;
556 bez_cntrl[3] <<
static_cast<data__
>(0.375), 0.5;
557 bez_cntrl[4] <<
static_cast<data__
>(0.5), 0.0;
558 bez_cntrl[5] <<
static_cast<data__
>(0.625),-0.5;
559 bez_cntrl[6] <<
static_cast<data__
>(0.75), -1.0;
560 bez_cntrl[7] <<
static_cast<data__
>(0.875), 1.0;
561 bez_cntrl[8] <<
static_cast<data__
>(1), 0.5;
565 for (index_type i=0; i<9; ++i)
568 bc.set_control_point(bez_cntrl[i], i);
573 for(index_type i=0; i<8; ++i)
582 control_point_type cntrl_in[9];
583 typename bezier_curve_type::control_point_type bez_cntrl[9];
585 bezier_curve_type bc;
597 bez_cntrl[0] <<
static_cast<data__
>(0), 2.0;
598 bez_cntrl[1] <<
static_cast<data__
>(0.125), 1.5;
599 bez_cntrl[2] <<
static_cast<data__
>(0.25), 1.0;
600 bez_cntrl[3] <<
static_cast<data__
>(0.375), 0.5;
601 bez_cntrl[4] <<
static_cast<data__
>(0.5), 0.0;
602 bez_cntrl[5] <<
static_cast<data__
>(0.625),-0.5;
603 bez_cntrl[6] <<
static_cast<data__
>(0.75), -1.0;
604 bez_cntrl[7] <<
static_cast<data__
>(0.875), 1.0;
605 bez_cntrl[8] <<
static_cast<data__
>(1), 0.5;
609 for (index_type i=0; i<9; ++i)
612 bc.set_control_point(bez_cntrl[i], i);
617 for(index_type i=0; i<8; ++i)
626 control_point_type cntrl_in[9];
627 typename bezier_curve_type::control_point_type bez_cntrl[9];
629 bezier_curve_type bc;
641 bez_cntrl[0] <<
static_cast<data__
>(0), 2.0;
642 bez_cntrl[1] <<
static_cast<data__
>(0.125), 1.5;
643 bez_cntrl[2] <<
static_cast<data__
>(0.25), 1.0;
644 bez_cntrl[3] <<
static_cast<data__
>(0.375), 0.5;
645 bez_cntrl[4] <<
static_cast<data__
>(0.5), 0.0;
646 bez_cntrl[5] <<
static_cast<data__
>(0.625),-0.5;
647 bez_cntrl[6] <<
static_cast<data__
>(0.75), -1.0;
648 bez_cntrl[7] <<
static_cast<data__
>(0.875), 1.0;
649 bez_cntrl[8] <<
static_cast<data__
>(1), 0.5;
653 for (index_type i=0; i<9; ++i)
656 bc.set_control_point(bez_cntrl[i], i);
661 for(index_type i=0; i<8; ++i)
670 data_type eps(std::numeric_limits<data__>::epsilon());
672 control_point_type cntrl_in[5];
673 typename bezier_curve_type::control_point_type bez_cntrl[5];
675 bezier_curve_type bc;
685 bez_cntrl[0] << 0, 2;
686 bez_cntrl[1] << 0.25, 1.5;
687 bez_cntrl[2] << 0.5, 0;
688 bez_cntrl[3] << 0.75, 1;
689 bez_cntrl[4] << 1, 0.5;
693 for (index_type i=0; i<5; ++i)
696 bc.set_control_point(bez_cntrl[i], i);
700 data_type tol(std::sqrt(eps));
701 length(length_cal, ebc, tol);
702 length(length_ref, bc, tol);
703 TEST_ASSERT(length_cal==length_ref);
707 t0 =
static_cast<data__
>(0.2);
708 t1 =
static_cast<data__
>(0.7);
710 length(length_cal, ebc, t0, t1, tol);
711 length(length_ref, bc, t0, t1, tol);
712 TEST_ASSERT(length_cal==length_ref);
Definition: continuity.hpp:26
point_type f(const data_type &t) const
Definition: explicit_bezier.hpp:100
Definition: continuity.hpp:28
curve_type::index_type index_type
Definition: explicit_bezier.hpp:42
curve_type::control_point_type control_point_type
Definition: explicit_bezier_curve_test_suite.hpp:35
curve_type::data_type data_type
Definition: explicit_bezier.hpp:39
void assignment_test()
Definition: explicit_bezier_curve_test_suite.hpp:127
point_type fpp(const data_type &t) const
Definition: explicit_bezier.hpp:114
void promotion_test()
Definition: explicit_bezier_curve_test_suite.hpp:357
Definition: explicit_bezier.hpp:32
void AddTests(const float &)
Definition: explicit_bezier_curve_test_suite.hpp:41
Definition: explicit_bezier_curve_test_suite.hpp:31
void reverse()
Definition: explicit_bezier.hpp:95
void demotion_test()
Definition: explicit_bezier_curve_test_suite.hpp:482
Definition: continuity.hpp:27
void degree_promote()
Definition: explicit_bezier.hpp:144
bool degree_demote(const geom::general::continuity &continuity_degree=geom::general::C0)
Definition: explicit_bezier.hpp:149
~explicit_bezier_curve_test_suite()
Definition: explicit_bezier_curve_test_suite.hpp:80
void derivative_test()
Definition: explicit_bezier_curve_test_suite.hpp:239
void AddTests(const double &)
Definition: explicit_bezier_curve_test_suite.hpp:52
void length_test()
Definition: explicit_bezier_curve_test_suite.hpp:668
eli::geom::curve::explicit_bezier< data__ > curve_type
Definition: explicit_bezier_curve_test_suite.hpp:34
curve_type::point_type point_type
Definition: explicit_bezier_curve_test_suite.hpp:36
void reverse_test()
Definition: explicit_bezier_curve_test_suite.hpp:166
curve_type::index_type index_type
Definition: explicit_bezier_curve_test_suite.hpp:38
void resize(const index_type &t_dim)
Definition: explicit_bezier.hpp:66
void curvature(typename curve__::data_type &rho, const curve__ &c, const typename curve__::data_type &t)
Definition: curvature.hpp:25
curve_type::point_type control_point_type
Definition: explicit_bezier.hpp:41
void evaluation_test()
Definition: explicit_bezier_curve_test_suite.hpp:190
void length(typename piecewise< curve__, data__, dim__, tol__ >::data_type &len, const piecewise< curve__, data__, dim__, tol__ > &pc, const typename piecewise< curve__, data__, dim__, tol__ >::data_type &tol)
Definition: length.hpp:43
void AddTests(const long double &)
Definition: explicit_bezier_curve_test_suite.hpp:63
explicit_bezier_curve_test_suite()
Definition: explicit_bezier_curve_test_suite.hpp:76
index_type degree() const
Definition: explicit_bezier.hpp:80
control_point_type get_control_point(const index_type &i) const
Definition: explicit_bezier.hpp:90
void octave_print(int figno, const std::vector< point_type, Eigen::aligned_allocator< point_type > > &pts, const curve_type &bez) const
Definition: explicit_bezier_curve_test_suite.hpp:85
point_type fppp(const data_type &t) const
Definition: explicit_bezier.hpp:121
point_type fp(const data_type &t) const
Definition: explicit_bezier.hpp:107
Eigen::Matrix< data_type, 1, 2 > point_type
Definition: explicit_bezier.hpp:40
void set_control_point(const control_point_type &cp_in, const index_type &i)
Definition: explicit_bezier.hpp:85
void create_circle(std::vector< point_type, Eigen::aligned_allocator< point_type > > &pts)
Definition: explicit_bezier_curve_test_suite.hpp:115
Definition: bezier.hpp:109
curve_type::data_type data_type
Definition: explicit_bezier_curve_test_suite.hpp:37
Definition: continuity.hpp:29