13 #ifndef bezier_curve_test_suite_hpp
14 #define bezier_curve_test_suite_hpp
30 template<
typename data__>
116 void octave_print(
int figno,
const std::vector<point_type> &pts,
const bezier_type &bez)
const
120 std::cout <<
"figure(" << figno <<
");" << std::endl;
121 std::cout <<
"xpts=[" << pts[0].x();
122 for (i=1; i<pts.size(); ++i)
123 std::cout <<
", " << pts[i].x();
124 std::cout <<
"];" << std::endl;
125 std::cout <<
"ypts=[" << pts[0].y();
126 for (i=1; i<pts.size(); ++i)
127 std::cout <<
", " << pts[i].y();
128 std::cout <<
"];" << std::endl;
130 std::vector<data__> t(101);
131 for (i=0; i<t.size(); ++i)
132 t[i]=static_cast<data__>(i)/(t.size()-1);
134 std::cout <<
"xint=[" << bez.
f(t[0])(0);
135 for (i=1; i<t.size(); ++i)
136 std::cout <<
", " << bez.
f(t[i])(0);
137 std::cout <<
"];" << std::endl;
138 std::cout <<
"yint=[" << bez.
f(t[0])(1);
139 for (i=1; i<t.size(); ++i)
140 std::cout <<
", " << bez.
f(t[i])(1);
141 std::cout <<
"];" << std::endl;
143 std::cout <<
"plot(xpts, ypts, 'bo', xint, yint, 'k-');" << std::endl;
151 for (
size_t i=0; i<n; ++i)
154 pts[i](0)=std::cos(theta);
155 pts[i](1)=std::sin(theta);
162 bezier_type bc1, bc2;
163 point_type cntrl_in[4];
167 cntrl_in[0] << 2, 2, 0;
168 cntrl_in[1] << 1, 1, 0;
169 cntrl_in[2] << 3, 0, 0;
170 cntrl_in[3] << 4, 1, 0;
182 bezier_type bcc1(bc1);
196 TEST_ASSERT(bc2.
degree()==4-1);
202 point_type cntrl_in[4];
206 cntrl_in[0] << 2, 2, 0;
207 cntrl_in[1] << 1, 1, 0;
208 cntrl_in[2] << 3, 0, 0;
209 cntrl_in[3] << 4, 1, 0;
218 point_type pmin_ref, pmax_ref;
223 TEST_ASSERT(bb.
get_min()==pmin_ref);
224 TEST_ASSERT(bb.
get_max()==pmax_ref);
229 point_type cntrl_in[4];
230 data_type eps(std::numeric_limits<data__>::epsilon());
233 cntrl_in[0] << 2.0, 2.0, 0.0;
234 cntrl_in[1] << 1.0, 1.5, 0.0;
235 cntrl_in[2] << 3.5, 0.0, 0.0;
236 cntrl_in[3] << 4.0, 1.0, 0.0;
238 bezier_type bc1(3), bc2;
239 point_type eval_out, eval_ref;
243 for (index_type i=0; i<4; ++i)
245 bc1.set_control_point(cntrl_in[i], i);
260 eval_ref=trans+cntrl_in[0];
261 TEST_ASSERT(eval_out==eval_ref);
264 eval_ref=trans+cntrl_in[3];
265 TEST_ASSERT(eval_out==eval_ref);
268 t=
static_cast<data__
>(0.45);
270 eval_ref << static_cast<data__>(2.2750625),
static_cast<data__
>(1.0364375),
static_cast<data__
>(0);
272 TEST_ASSERT((eval_out-eval_ref).norm()<5e3*eps);
282 rmat << std::cos(one), 0, -std::sin(one),
284 std::sin(one), 0, std::cos(one);
290 eval_ref=(cntrl_in[0]*rmat.transpose());
291 TEST_ASSERT(eval_out==eval_ref);
294 eval_ref=(cntrl_in[3]*rmat.transpose());
295 TEST_ASSERT(eval_out==eval_ref);
298 t=
static_cast<data__
>(0.45);
300 eval_ref << static_cast<data__>(2.2750625),
static_cast<data__
>(1.0364375),
static_cast<data__
>(0);
301 eval_ref*=rmat.transpose();
302 TEST_ASSERT((eval_out-eval_ref).norm()<5e3*eps);
314 rmat << std::cos(one), 0, -std::sin(one),
316 std::sin(one), 0, std::cos(one);
322 eval_ref=rorig+(cntrl_in[0]-rorig)*rmat.transpose();
323 TEST_ASSERT(eval_out==eval_ref);
326 eval_ref=rorig+(cntrl_in[3]-rorig)*rmat.transpose();
327 TEST_ASSERT(eval_out==eval_ref);
330 t=
static_cast<data__
>(0.45);
332 eval_ref << static_cast<data__>(2.2750625),
static_cast<data__
>(1.0364375),
static_cast<data__
>(0);
333 eval_ref=rorig+(eval_ref-rorig)*rmat.transpose();
334 TEST_ASSERT((eval_out-eval_ref).norm()<5e3*eps);
340 point_type cntrl_in[4];
341 data_type eps(std::numeric_limits<data__>::epsilon());
344 cntrl_in[0] << 2.0, 2.0, 0.0;
345 cntrl_in[1] << 1.0, 1.5, 0.0;
346 cntrl_in[2] << 3.5, 0.0, 0.0;
347 cntrl_in[3] << 4.0, 1.0, 0.0;
350 point_type eval_out, eval_ref;
354 for (index_type i=0; i<4; ++i)
362 TEST_ASSERT(eval_out==cntrl_in[0]);
365 TEST_ASSERT(eval_out==cntrl_in[3]);
368 t=
static_cast<data__
>(0.45);
370 eval_ref << static_cast<data__>(2.2750625),
static_cast<data__
>(1.0364375),
static_cast<data__
>(0);
371 TEST_ASSERT((eval_out-eval_ref).norm()<5e3*eps);
376 point_type cntrl_in[4];
377 data_type eps(std::numeric_limits<data__>::epsilon());
380 cntrl_in[0] << 2.0, 2.0, 0.0;
381 cntrl_in[1] << 1.0, 1.5, 0.0;
382 cntrl_in[2] << 3.5, 0.0, 0.0;
383 cntrl_in[3] << 4.0, 1.0, 0.0;
386 point_type eval_out, eval_ref;
390 for (index_type i=0; i<4; ++i)
398 eval_ref << -3, -1.5, 0;
399 TEST_ASSERT(eval_out==eval_ref);
402 eval_ref << 1.5, 3, 0;
403 TEST_ASSERT(eval_out==eval_ref);
406 t=
static_cast<data__
>(0.45);
408 eval_ref << static_cast<data__>(3.10875),
static_cast<data__
>(-2.07375),
static_cast<data__
>(0);
409 TEST_ASSERT((eval_out-eval_ref).norm() < 5e3*eps);
414 point_type cntrl_in[4];
415 data_type eps(std::numeric_limits<data__>::epsilon());
418 cntrl_in[0] << 2.0, 2.0, 0.0;
419 cntrl_in[1] << 1.0, 1.5, 0.0;
420 cntrl_in[2] << 3.5, 0.0, 0.0;
421 cntrl_in[3] << 4.0, 1.0, 0.0;
424 point_type eval_out, eval_ref;
428 for (index_type i=0; i<4; ++i)
436 eval_ref << 21, -6, 0;
437 TEST_ASSERT(eval_out==eval_ref);
440 eval_ref << -12, 15, 0;
441 TEST_ASSERT(eval_out==eval_ref);
444 t=
static_cast<data__
>(0.45);
446 eval_ref << static_cast<data__>(6.15),
static_cast<data__
>(3.45),
static_cast<data__
>(0);
447 TEST_ASSERT_DELTA((eval_out-eval_ref).norm(), 0, 1e4*eps);
452 point_type cntrl_in[4];
453 data_type eps(std::numeric_limits<data__>::epsilon());
456 cntrl_in[0] << 2.0, 2.0, 0.0;
457 cntrl_in[1] << 1.0, 1.5, 0.0;
458 cntrl_in[2] << 3.5, 0.0, 0.0;
459 cntrl_in[3] << 4.0, 1.0, 0.0;
462 point_type eval_out, eval_ref;
466 for (index_type i=0; i<4; ++i)
473 eval_out=bc1.
fppp(t);
474 eval_ref << -33, 21, 0;
475 TEST_ASSERT(eval_out==eval_ref);
477 eval_out=bc1.
fppp(t);
478 eval_ref << -33, 21, 0;
479 TEST_ASSERT(eval_out==eval_ref);
482 t=
static_cast<data__
>(0.45);
483 eval_out=bc1.
fppp(t);
484 eval_ref << -33, 21, 0;
485 TEST_ASSERT(eval_out==eval_ref);
488 data_type curv_out, curv_ref;
491 curv_ref=
static_cast<data__
>(1.31182654679988);
492 TEST_ASSERT_DELTA(curv_out, curv_ref, std::max(static_cast<data__>(1e-13), static_cast<data__>(1e2)*eps));
495 curv_ref=
static_cast<data__
>(1.55034046439985);
496 TEST_ASSERT_DELTA(curv_out, curv_ref, std::max(static_cast<data__>(1e-13), static_cast<data__>(1e2)*eps));
499 t=
static_cast<data__
>(0.45);
501 curv_ref=
static_cast<data__
>(0.449908807121445);
502 TEST_ASSERT_DELTA(curv_out, curv_ref, std::max(static_cast<data__>(1e-13), static_cast<data__>(1e2)*eps));
507 point_type cntrl_in[4];
508 data_type eps(std::numeric_limits<data__>::epsilon());
511 cntrl_in[0] << 2.0, 2.0, 0.0;
512 cntrl_in[1] << 1.0, 1.5, 0.0;
513 cntrl_in[2] << 3.5, 0.0, 0.0;
514 cntrl_in[3] << 4.0, 1.0, 0.0;
517 point_type t_dir, n_dir, b_dir, t_dir_ref;
521 for (index_type i=0; i<4; ++i)
528 t_dir_ref << static_cast<data_type>(0.874157),
static_cast<data_type
>(-0.485643), 0;
529 TEST_ASSERT((t_dir-t_dir_ref).norm()<1e-5);
532 TEST_ASSERT((t_dir.cross(n_dir)-b_dir).norm()<2*eps);
537 point_type cntrl_in[4];
540 cntrl_in[0] << 2.0, 2.0, 0.0;
541 cntrl_in[1] << 1.0, 1.5, 0.0;
542 cntrl_in[2] << 3.5, 0.0, 0.0;
543 cntrl_in[3] << 4.0, 1.0, 0.0;
548 for (index_type i=0; i<4; ++i)
557 for (index_type i=0; i<4; ++i)
565 point_type cntrl_in[4], cntrl_out[4];
569 cntrl_in[0] << 2.0, 2.0, 1.0;
570 cntrl_in[1] << 1.0, 1.5, 2.0;
571 cntrl_in[2] << 3.5, 0.0, 3.0;
572 cntrl_in[3] << 4.0, 1.0, 4.0;
574 bezier_type bc(3), bcc;
577 for (index_type i=0; i<4; ++i)
579 bc.set_control_point(cntrl_in[i], i);
588 cntrl_out[i].x()= cntrl_in[i].x();
589 cntrl_out[i].y()= cntrl_in[i].y();
590 cntrl_out[i].z()=-cntrl_in[i].z();
596 TEST_ASSERT(bc.get_control_point(i)==cntrl_out[i]);
606 cntrl_out[i].x()= cntrl_in[i].x();
607 cntrl_out[i].y()=-cntrl_in[i].y();
608 cntrl_out[i].z()= cntrl_in[i].z();
614 TEST_ASSERT(bc.get_control_point(i)==cntrl_out[i]);
624 cntrl_out[i].x()=-cntrl_in[i].x();
625 cntrl_out[i].y()= cntrl_in[i].y();
626 cntrl_out[i].z()= cntrl_in[i].z();
632 TEST_ASSERT(bc.get_control_point(i)==cntrl_out[i]);
639 data_type eps(std::numeric_limits<data__>::epsilon());
640 point_type normal, n;
649 cntrl_out[i]=cntrl_in[i]-2*cntrl_in[i].dot(n)*n;
655 TEST_ASSERT((bc.get_control_point(i)-cntrl_out[i]).norm()<10*eps);
662 data_type eps(std::numeric_limits<data__>::epsilon());
663 point_type normal, n;
670 bc.reflect(normal, d);
673 cntrl_out[i]=cntrl_in[i]-2*(cntrl_in[i].dot(n)-d)*n;
679 TEST_ASSERT((bc.get_control_point(i)-cntrl_out[i]).norm()<10*eps);
686 point_type cntrl_in[5];
687 data_type eps(std::numeric_limits<data__>::epsilon());
690 cntrl_in[0] << 0, 0, 0;
691 cntrl_in[1] << 0, 4, 0;
692 cntrl_in[2] << 2, 4, 0;
693 cntrl_in[3] << 2, 3, 0;
694 cntrl_in[4] << 1.5, 3, 0;
696 bezier_type bc1(4), bc2;
697 point_type eval_out, eval_ref;
698 data_type t, curv_out, curv_ref;
701 for (index_type i=0; i<5; ++i)
703 bc1.set_control_point(cntrl_in[i], i);
711 TEST_ASSERT(bc1.degree()+1==bc2.
degree());
714 if (bc1.degree()+1==bc2.
degree())
716 point_type cntrl_ref[6];
718 cntrl_ref[0] << 0.0, 0.0, 0.0;
719 cntrl_ref[1] << 0.0,
static_cast<data__
>(3.2), 0.0;
720 cntrl_ref[2] <<
static_cast<data__
>(1.2), 4.0, 0.0;
721 cntrl_ref[3] << 2.0,
static_cast<data__
>(3.6), 0.0;
722 cntrl_ref[4] <<
static_cast<data__
>(1.9), 3.0, 0.0;
723 cntrl_ref[5] <<
static_cast<data__
>(1.5), 3.0, 0.0;
724 for (index_type i=0; i<6; ++i)
726 if (
typeid(data__)==
typeid(
long double))
741 TEST_ASSERT(eval_out==eval_ref);
745 TEST_ASSERT(eval_out==eval_ref);
748 t=
static_cast<data__
>(0.45);
751 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
757 TEST_ASSERT(eval_out==eval_ref);
761 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
764 t=
static_cast<data__
>(0.45);
767 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
773 TEST_ASSERT((eval_out-eval_ref).norm()<33*eps);
777 TEST_ASSERT((eval_out-eval_ref).norm()<18*eps);
780 t=
static_cast<data__
>(0.45);
783 TEST_ASSERT((eval_out-eval_ref).norm()<33*eps);
787 eval_out=bc2.
fppp(t);
788 eval_ref=bc1.fppp(t);
789 TEST_ASSERT((eval_out-eval_ref).norm()<390*eps);
791 eval_out=bc2.
fppp(t);
792 eval_ref=bc1.fppp(t);
793 TEST_ASSERT((eval_out-eval_ref).norm()<390*eps);
796 t=
static_cast<data__
>(0.45);
797 eval_out=bc2.
fppp(t);
798 eval_ref=bc1.fppp(t);
799 TEST_ASSERT((eval_out-eval_ref).norm()<203*eps);
805 TEST_ASSERT(curv_out==curv_ref);
809 TEST_ASSERT(std::abs(curv_out-curv_ref)<203*eps);
812 t=
static_cast<data__
>(0.45);
815 TEST_ASSERT(std::abs(curv_out-curv_ref)<203*eps);
820 point_type cntrl_in[5];
821 data_type eps(std::numeric_limits<data__>::epsilon());
824 cntrl_in[0] << 0, 0, 0;
825 cntrl_in[1] << 0, 4, 0;
826 cntrl_in[2] << 2, 4, 0;
827 cntrl_in[3] << 2, 3, 0;
828 cntrl_in[4] << 1.5, 3, 0;
830 bezier_type bc1(4), bc2, bc3, bc4;
831 point_type eval_out, eval_ref;
832 data_type t, curv_out, curv_ref;
835 for (index_type i=0; i<5; ++i)
837 bc1.set_control_point(cntrl_in[i], i);
854 for (index_type i=0; i<6; ++i)
864 TEST_ASSERT(bc4.
degree()==bc1.degree()+5);
870 TEST_ASSERT(eval_out==eval_ref);
874 TEST_ASSERT(eval_out==eval_ref);
877 t=
static_cast<data__
>(0.45);
880 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
886 TEST_ASSERT((eval_out-eval_ref).norm()<20*eps);
890 TEST_ASSERT((eval_out-eval_ref).norm()<5*4*eps);
893 t=
static_cast<data__
>(0.45);
896 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
902 TEST_ASSERT((eval_out-eval_ref).norm()<200*eps);
906 TEST_ASSERT((eval_out-eval_ref).norm()<18*16*eps);
909 t=
static_cast<data__
>(0.45);
912 TEST_ASSERT((eval_out-eval_ref).norm()<35*eps);
916 eval_out=bc4.
fppp(t);
917 eval_ref=bc1.fppp(t);
918 TEST_ASSERT((eval_out-eval_ref).norm()<390*16*eps);
920 eval_out=bc4.
fppp(t);
921 eval_ref=bc1.fppp(t);
922 TEST_ASSERT((eval_out-eval_ref).norm()<390*4*eps);
925 t=
static_cast<data__
>(0.45);
926 eval_out=bc4.
fppp(t);
927 eval_ref=bc1.fppp(t);
928 TEST_ASSERT((eval_out-eval_ref).norm()<203*4*eps);
934 TEST_ASSERT(std::abs(curv_out-curv_ref)<5*eps);
938 TEST_ASSERT(std::abs(curv_out-curv_ref)<203*eps);
941 t=
static_cast<data__
>(0.45);
944 TEST_ASSERT(std::abs(curv_out-curv_ref)<203*eps);
949 data_type eps(std::numeric_limits<data__>::epsilon());
953 point_type cntrl_in[7], cntrl_ref[6];
955 cntrl_in[0] << 0, 0, 0;
956 cntrl_in[1] << 2, 6, 0;
957 cntrl_in[2] << 3, 0, 0;
958 cntrl_in[3] << 5, 4, 0;
959 cntrl_in[4] << 7, 1, 0;
960 cntrl_in[5] << 5, 5, 0;
961 cntrl_in[6] << 10, 6, 0;
963 bezier_type bc1(6), bc2;
966 for (index_type i=0; i<7; ++i)
968 bc1.set_control_point(cntrl_in[i], i);
975 TEST_ASSERT(bc1.degree()+1==bc2.
degree());
977 if (bc1.degree()+1==bc2.
degree())
980 cntrl_ref[0] <<
static_cast<data__
>(-0.00878906),
static_cast<data__
>(0.0610352), 0;
981 cntrl_ref[1] <<
static_cast<data__
>( 2.5177734),
static_cast<data__
>(6.3821289), 0;
982 cntrl_ref[2] <<
static_cast<data__
>( 2.8060547),
static_cast<data__
>(-0.16982422), 0;
983 cntrl_ref[3] <<
static_cast<data__
>( 8.0060547),
static_cast<data__
>( 2.5301758), 0;
984 cntrl_ref[4] <<
static_cast<data__
>( 4.1177734),
static_cast<data__
>( 3.9821289), 0;
985 cntrl_ref[5] <<
static_cast<data__
>( 9.9912109),
static_cast<data__
>( 6.0610352), 0;
986 for (index_type i=0; i<6; ++i)
988 TEST_ASSERT_DELTA((bc1.get_control_point(i)-cntrl_ref[i]).norm(), 0, 1e-6);
995 point_type cntrl_in[5];
998 cntrl_in[0] << 0, 0, 0;
999 cntrl_in[1] << 0, 4, 0;
1000 cntrl_in[2] << 2, 4, 0;
1001 cntrl_in[3] << 2, 3, 0;
1002 cntrl_in[4] << 1.5, 3, 0;
1004 bezier_type bc1(4), bc2;
1007 for (index_type i=0; i<5; ++i)
1009 bc1.set_control_point(cntrl_in[i], i);
1016 TEST_ASSERT(bc1.degree()==bc2.
degree());
1019 for (index_type i=0; i<5; ++i)
1021 if (
typeid(data__)==
typeid(
long double))
1034 point_type cntrl_in[10];
1036 cntrl_in[0] << 0, 0, 0,
1037 cntrl_in[1] << 2, 6, 0,
1038 cntrl_in[2] << 3, 0, 0,
1039 cntrl_in[3] << 5, 4, 0,
1040 cntrl_in[4] << 7, 1, 0,
1041 cntrl_in[5] << 5, 5, 0,
1042 cntrl_in[6] << 6, 6, 0,
1043 cntrl_in[7] << 7, 5, 0,
1044 cntrl_in[8] << 5, 5, 0,
1045 cntrl_in[9] << 10, 6, 0;
1050 for (index_type i=0; i<10; ++i)
1057 bezier_type bc2(bc1);
1058 point_type eval_out[3], eval_ref[3];
1059 data_type d[3], tv[3]={0, 1,
static_cast<data__
>(0.45)};
1063 TEST_ASSERT(success);
1065 for (
size_t k=0; k<3; ++k)
1068 eval_out[0]=bc2.
f(t);
1069 eval_out[1]=bc2.
fp(t);
1070 eval_out[2]=bc2.
fpp(t);
1071 eval_ref[0]=bc1.
f(t);
1072 eval_ref[1]=bc1.
fp(t);
1073 eval_ref[2]=bc1.
fpp(t);
1080 TEST_ASSERT_DELTA(d[0], 0.00435372, 5e-4);
1081 TEST_ASSERT_DELTA(d[1], 0.70530, 5e-3);
1082 TEST_ASSERT_DELTA(d[2], 37.6161, 5e-2);
1086 TEST_ASSERT_DELTA(d[0], 0.003414, 1e-5);
1087 TEST_ASSERT_DELTA(d[1], 0.04887, 5e-4);
1088 TEST_ASSERT_DELTA(d[2], 1.10759, 5e-4);
1095 bezier_type bc2(bc1);
1096 point_type eval_out[3], eval_ref[3];
1097 data_type d[3], tv[3]={0, 1,
static_cast<data__
>(0.45)};
1101 TEST_ASSERT(success);
1103 for (
size_t k=0; k<3; ++k)
1106 eval_out[0]=bc2.
f(t);
1107 eval_out[1]=bc2.
fp(t);
1108 eval_out[2]=bc2.
fpp(t);
1109 eval_ref[0]=bc1.
f(t);
1110 eval_ref[1]=bc1.
fp(t);
1111 eval_ref[2]=bc1.
fpp(t);
1118 TEST_ASSERT_DELTA(d[0], 0.0, 5e-6);
1119 TEST_ASSERT_DELTA(d[1], 0.64553, 5e-5);
1120 TEST_ASSERT_DELTA(d[2], 37.4409, 5e-4);
1124 TEST_ASSERT_DELTA(d[0], 0.00305362, 5e-6);
1125 TEST_ASSERT_DELTA(d[1], 0.042752, 5e-5);
1126 TEST_ASSERT_DELTA(d[2], 1.043406, 1e-4);
1133 bezier_type bc2(bc1);
1134 point_type eval_out[3], eval_ref[3];
1135 data_type d[3], tv[3]={0, 1,
static_cast<data__
>(0.45)};
1139 TEST_ASSERT(success);
1141 for (
size_t k=0; k<3; ++k)
1144 eval_out[0]=bc2.
f(t);
1145 eval_out[1]=bc2.
fp(t);
1146 eval_out[2]=bc2.
fpp(t);
1147 eval_ref[0]=bc1.
f(t);
1148 eval_ref[1]=bc1.
fp(t);
1149 eval_ref[2]=bc1.
fpp(t);
1156 TEST_ASSERT(d[0]==0);
1157 TEST_ASSERT(d[1]==0);
1158 TEST_ASSERT_DELTA(d[2], 16.7838, 5e-4);
1162 TEST_ASSERT_DELTA(d[0], 0.0057941, 5e-6);
1163 TEST_ASSERT_DELTA(d[1], 0.086370, 5e-5);
1164 TEST_ASSERT_DELTA(d[2], 1.69369, 5e-4);
1171 bezier_type bc2(bc1);
1172 point_type eval_out[3], eval_ref[3];
1173 data_type d[3], tv[3]={0, 1,
static_cast<data__
>(0.45)};
1177 TEST_ASSERT(success);
1179 for (
size_t k=0; k<3; ++k)
1182 eval_out[0]=bc2.
f(t);
1183 eval_out[1]=bc2.
fp(t);
1184 eval_out[2]=bc2.
fpp(t);
1185 eval_ref[0]=bc1.
f(t);
1186 eval_ref[1]=bc1.
fp(t);
1187 eval_ref[2]=bc1.
fpp(t);
1194 TEST_ASSERT(d[0]==0);
1195 TEST_ASSERT(d[1]==0);
1196 TEST_ASSERT(d[2] < 129*eps);
1200 TEST_ASSERT_DELTA(d[0], 0.0180029, 5e-5);
1201 TEST_ASSERT_DELTA(d[1], 0.294979, 5e-5);
1202 TEST_ASSERT_DELTA(d[2], 3.78229, 5e-4);
1211 data_type eps(std::numeric_limits<data__>::epsilon());
1215 point_type cntrl_in[2];
1217 cntrl_in[0] << 0, 0, 0;
1218 cntrl_in[1] << 2, 6, 0;
1220 bezier_type bc1(1), bc2;
1221 point_type eval_out, eval_ref;
1222 data_type t, curv_out, curv_ref;
1225 for (index_type i=0; i<2; ++i)
1227 bc1.set_control_point(cntrl_in[i], i);
1234 TEST_ASSERT(bc1.degree()==3);
1240 TEST_ASSERT(eval_out==eval_ref);
1244 TEST_ASSERT(eval_out==eval_ref);
1247 t=
static_cast<data__
>(0.45);
1250 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
1256 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
1260 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
1263 t=
static_cast<data__
>(0.45);
1266 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
1270 eval_out=bc2.
fpp(t);
1271 eval_ref=bc1.fpp(t);
1272 TEST_ASSERT((eval_out-eval_ref).norm()<33*eps);
1274 eval_out=bc2.
fpp(t);
1275 eval_ref=bc1.fpp(t);
1276 TEST_ASSERT((eval_out-eval_ref).norm()<18*eps);
1279 t=
static_cast<data__
>(0.45);
1280 eval_out=bc2.
fpp(t);
1281 eval_ref=bc1.fpp(t);
1282 TEST_ASSERT((eval_out-eval_ref).norm()<33*eps);
1286 eval_out=bc2.
fppp(t);
1287 eval_ref=bc1.fppp(t);
1288 TEST_ASSERT((eval_out-eval_ref).norm()<390*eps);
1290 eval_out=bc2.
fppp(t);
1291 eval_ref=bc1.fppp(t);
1292 TEST_ASSERT((eval_out-eval_ref).norm()<390*eps);
1295 t=
static_cast<data__
>(0.45);
1296 eval_out=bc2.
fppp(t);
1297 eval_ref=bc1.fppp(t);
1298 TEST_ASSERT((eval_out-eval_ref).norm()<203*eps);
1304 TEST_ASSERT(curv_out==curv_ref);
1308 TEST_ASSERT(std::abs(curv_out-curv_ref)<203*eps);
1311 t=
static_cast<data__
>(0.45);
1314 TEST_ASSERT(std::abs(curv_out-curv_ref)<203*eps);
1319 point_type cntrl_in[3];
1321 cntrl_in[0] << 0, 0, 0;
1322 cntrl_in[1] << 2, 6, 0;
1323 cntrl_in[2] << 3, 0, 0;
1325 bezier_type bc1(2), bc2;
1326 point_type eval_out, eval_ref;
1327 data_type t, curv_out, curv_ref;
1330 for (index_type i=0; i<3; ++i)
1332 bc1.set_control_point(cntrl_in[i], i);
1339 TEST_ASSERT(bc1.degree()==3);
1345 TEST_ASSERT(eval_out==eval_ref);
1349 TEST_ASSERT(eval_out==eval_ref);
1352 t=
static_cast<data__
>(0.45);
1355 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
1361 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
1365 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
1368 t=
static_cast<data__
>(0.45);
1371 TEST_ASSERT((eval_out-eval_ref).norm()<5*eps);
1375 eval_out=bc2.
fpp(t);
1376 eval_ref=bc1.fpp(t);
1377 TEST_ASSERT((eval_out-eval_ref).norm()<33*eps);
1379 eval_out=bc2.
fpp(t);
1380 eval_ref=bc1.fpp(t);
1381 TEST_ASSERT((eval_out-eval_ref).norm()<18*eps);
1384 t=
static_cast<data__
>(0.45);
1385 eval_out=bc2.
fpp(t);
1386 eval_ref=bc1.fpp(t);
1387 TEST_ASSERT((eval_out-eval_ref).norm()<33*eps);
1391 eval_out=bc2.
fppp(t);
1392 eval_ref=bc1.fppp(t);
1393 TEST_ASSERT((eval_out-eval_ref).norm()<390*eps);
1395 eval_out=bc2.
fppp(t);
1396 eval_ref=bc1.fppp(t);
1397 TEST_ASSERT((eval_out-eval_ref).norm()<390*eps);
1400 t=
static_cast<data__
>(0.45);
1401 eval_out=bc2.
fppp(t);
1402 eval_ref=bc1.fppp(t);
1403 TEST_ASSERT((eval_out-eval_ref).norm()<203*eps);
1409 TEST_ASSERT((curv_out-curv_ref)<10*eps);
1413 TEST_ASSERT(std::abs(curv_out-curv_ref)<203*eps);
1416 t=
static_cast<data__
>(0.45);
1419 TEST_ASSERT(std::abs(curv_out-curv_ref)<203*eps);
1424 point_type cntrl_in[4];
1426 cntrl_in[0] << 0, 0, 0;
1427 cntrl_in[1] << 2, 6, 0;
1428 cntrl_in[2] << 3, 0, 0;
1429 cntrl_in[3] << 5, 4, 0;
1431 bezier_type bc1(3), bc2;
1434 for (index_type i=0; i<4; ++i)
1436 bc1.set_control_point(cntrl_in[i], i);
1443 TEST_ASSERT(bc1.degree()==3);
1446 if (bc1.degree()==3)
1448 for (index_type i=0; i<4; ++i)
1457 point_type cntrl_in[7];
1459 cntrl_in[0] << 0, 0, 0;
1460 cntrl_in[1] << 2, 6, 0;
1461 cntrl_in[2] << 3, 0, 0;
1462 cntrl_in[3] << 5, 4, 0;
1463 cntrl_in[4] << 7, 1, 0;
1464 cntrl_in[5] << 5, 5, 0;
1465 cntrl_in[6] << 10, 6, 0;
1467 bezier_type bc1(6), bc2;
1470 for (index_type i=0; i<7; ++i)
1472 bc1.set_control_point(cntrl_in[i], i);
1479 TEST_ASSERT(bc1.degree()==3);
1497 point_type cntrl_in[5];
1500 cntrl_in[0] << 0, 0, 0;
1501 cntrl_in[1] << 0, 4, 0;
1502 cntrl_in[2] << 2, 4, 0;
1503 cntrl_in[3] << 2, 3, 0;
1504 cntrl_in[4] << 1.5, 3, 0;
1509 for (index_type i=0; i<5; ++i)
1520 point_type cntrl_in[5];
1523 cntrl_in[0] << 0, 0, 0;
1524 cntrl_in[1] << 0, 4, 0;
1525 cntrl_in[2] << 2, 4, 0;
1526 cntrl_in[3] << 2, 3, 0;
1527 cntrl_in[4] << 1.5, 3, 0;
1529 bezier_type bc1(4), bc2;
1532 for (index_type i=0; i<5; ++i)
1534 bc1.set_control_point(cntrl_in[i], i);
1544 data_type d2 = bc1.eqp_distance_bound(bc2);
1550 point_type cntrl_in[5];
1553 cntrl_in[0] << 0, 0, 0;
1554 cntrl_in[1] << 0, 4, 0;
1555 cntrl_in[2] << 2, 4, 0;
1556 cntrl_in[3] << 2, 3, 0;
1557 cntrl_in[4] << 1.5, 3, 0;
1563 bezier_type bc1(4), bc2(4);
1566 for (index_type i=0; i<5; ++i)
1568 bc1.set_control_point(cntrl_in[i], i);
1576 TEST_ASSERT(d1==dz);
1578 data_type d2 = bc1.eqp_distance_bound(bc2);
1579 TEST_ASSERT(d2==dz);
1584 point_type cntrl_in[5];
1588 cntrl_in[0] << 0, 0, 0;
1589 cntrl_in[1] << 1, 1, 0;
1590 cntrl_in[2] << 2, 0.5, 0;
1591 cntrl_in[3] << 3, 2.5, 0;
1592 cntrl_in[4] << 4, 6.0, 0;
1594 bezier_type bc1(4), bc2(4);
1597 for (index_type i=0; i<5; ++i)
1599 bc1.set_control_point(cntrl_in[i], i);
1605 data_type dendpts = (bc1.get_control_point(4)-bc1.get_control_point(0) ).norm();
1611 TEST_ASSERT(d1==dendpts);
1613 data_type d2 = bc1.eqp_distance_bound(bc2);
1614 TEST_ASSERT(d2==dendpts);
1620 point_type cntrl_in[4], cntrl_ref[4];
1621 data_type eps(std::numeric_limits<data__>::epsilon());
1624 cntrl_in[0] << 0, 0, 0;
1625 cntrl_in[1] << 0, 2, 0;
1626 cntrl_in[2] << 8, 2, 0;
1627 cntrl_in[3] << 4, 0, 0;
1629 bezier_type bc1(3), bc1l, bc1r;
1630 point_type eval_out, eval_ref;
1634 for (index_type i=0; i<4; ++i)
1636 bc1.set_control_point(cntrl_in[i], i);
1641 bc1.split(bc1l, bc1r, t);
1642 cntrl_ref[0] << 0.0, 0.0, 0.0;
1643 cntrl_ref[1] << 0.0, 1.0, 0.0;
1644 cntrl_ref[2] << 2.0, 1.5, 0.0;
1645 cntrl_ref[3] << 3.5, 1.5, 0.0;
1646 for (index_type i=0; i<4; ++i)
1650 cntrl_ref[0] << 3.5, 1.5, 0.0;
1651 cntrl_ref[1] << 5.0, 1.5, 0.0;
1652 cntrl_ref[2] << 6.0, 1.0, 0.0;
1653 cntrl_ref[3] << 4.0, 0.0, 0.0;
1654 for (index_type i=0; i<4; ++i)
1660 data_type tl, tr, ts;
1661 tl=
static_cast<data__
>(0.3);
1662 tr=
static_cast<data__
>(0.87);
1663 ts=
static_cast<data__
>(0.586);
1665 bc1.split(bc1l, bc1r, ts);
1669 eval_out=bc1l.
f(tl);
1671 TEST_ASSERT((eval_out-eval_ref).norm()<1e2*eps);
1672 eval_out=bc1l.
fp(tl);
1673 eval_ref=bc1.fp(t)*ts;
1674 TEST_ASSERT((eval_out-eval_ref).norm()<1e2*eps);
1675 eval_out=bc1l.
fpp(tl);
1676 eval_ref=bc1.fpp(t)*ts*ts;
1677 TEST_ASSERT((eval_out-eval_ref).norm()<1e2*eps);
1678 eval_out=bc1l.
fppp(tl);
1679 eval_ref=bc1.fppp(t)*ts*ts*ts;
1680 TEST_ASSERT((eval_out-eval_ref).norm()<1e2*eps);
1684 eval_out=bc1r.
f(tr);
1686 TEST_ASSERT((eval_out-eval_ref).norm()<1e2*eps);
1687 eval_out=bc1r.
fp(tr);
1688 eval_ref=bc1.fp(t)*(1-ts);
1689 TEST_ASSERT((eval_out-eval_ref).norm()<1e2*eps);
1690 eval_out=bc1r.
fpp(tr);
1691 eval_ref=bc1.fpp(t)*(1-ts)*(1-ts);
1692 TEST_ASSERT((eval_out-eval_ref).norm()<1e2*eps);
1693 eval_out=bc1r.
fppp(tr);
1694 eval_ref=bc1.fppp(t)*(1-ts)*(1-ts)*(1-ts);
1695 TEST_ASSERT((eval_out-eval_ref).norm()<1.21e2*eps);
1700 point_type cntrl_in[4];
1701 data_type eps(std::numeric_limits<data__>::epsilon());
1704 cntrl_in[0] << 0, 0, 0;
1705 cntrl_in[1] << 0, 2, 0;
1706 cntrl_in[2] << 8, 2, 0;
1707 cntrl_in[3] << 4, 0, 0;
1710 data_type length_cal, length_ref;
1713 for (index_type i=0; i<4; ++i)
1719 size_t i, npts(1001), n(npts-1);
1720 std::vector<data__> speed(npts);
1721 for (i=0; i<npts; ++i)
1723 data_type t(i/static_cast<data__>(n));
1724 speed[i]=bc1.
fp(t).norm();
1726 length_ref=speed[0];
1727 for (i=1; i<=n-1; i+=2)
1729 length_ref+=4*speed[i];
1730 length_ref+=2*speed[i+1];
1732 length_ref-=speed[n];
1733 length_ref*=
static_cast<data__
>(1-0)/n/3;
1736 data_type tol(std::sqrt(eps));
1737 length(length_cal, bc1, tol);
1738 TEST_ASSERT_DELTA(1, length_cal/length_ref, tol);
1741 data_type length01_cal, length12_cal, t0, t1, t2;
1743 t1=
static_cast<data__
>(0.3);
1746 length(length01_cal, bc1, t0, t1, tol);
1747 length(length12_cal, bc1, t1, t2, tol);
1748 TEST_ASSERT_DELTA(1, (length01_cal+length12_cal)/length_cal, tol);
Definition: continuity.hpp:26
void evaluation_test()
Definition: bezier_curve_test_suite.hpp:338
void get_bounding_box(bounding_box_type &bb) const
Definition: bezier.hpp:270
void reflect_xy()
Definition: bezier.hpp:225
Eigen::Matrix< data_type, dim__, dim__ > rotation_matrix_type
Definition: bezier.hpp:119
Definition: continuity.hpp:28
bezier_type::point_type point_type
Definition: bezier_curve_test_suite.hpp:38
void promotion_to_test()
Definition: bezier_curve_test_suite.hpp:818
Derived1__::Scalar distance(const Eigen::MatrixBase< Derived1__ > &p1, const Eigen::MatrixBase< Derived2__ > &p2)
Definition: distance.hpp:33
void reflect_xz()
Definition: bezier.hpp:230
Definition: bounding_box.hpp:27
void derivative_1_test()
Definition: bezier_curve_test_suite.hpp:374
void rotate(const rotation_matrix_type &rmat)
Definition: bezier.hpp:281
constraint_info::point_type constraint_point_type
Definition: fit_container.hpp:117
Eigen::Matrix< data_type, 1, dim__ > point_type
Definition: bezier.hpp:114
void create_circle(std::vector< point_type > &pts)
Definition: bezier_curve_test_suite.hpp:146
void bounding_box_test()
Definition: bezier_curve_test_suite.hpp:199
void degree_to_cubic_test()
Definition: bezier_curve_test_suite.hpp:1209
void AddTests(const double &)
Definition: bezier_curve_test_suite.hpp:63
void split_test()
Definition: bezier_curve_test_suite.hpp:1618
void demotion_test()
Definition: bezier_curve_test_suite.hpp:947
point_type get_max() const
Definition: bounding_box.hpp:104
void degree_promote()
Definition: bezier.hpp:436
void derivative_3_test()
Definition: bezier_curve_test_suite.hpp:450
point_type f(const data_type &t) const
Definition: bezier.hpp:324
void derivative_2_test()
Definition: bezier_curve_test_suite.hpp:412
Definition: fit_container.hpp:34
void degree_promote_to(const index_type target_degree)
Definition: bezier.hpp:448
void AddTests(const long double &)
Definition: bezier_curve_test_suite.hpp:84
point_type tangent(const data_type &t) const
Definition: bezier.hpp:419
void translate(const point_type &trans)
Definition: bezier.hpp:293
void frenet_serret_frame(point_type &t, point_type &n, point_type &b, const data_type &t0)
Definition: bezier.hpp:427
bezier_type::fit_container_type fit_container_type
Definition: bezier_curve_test_suite.hpp:35
~bezier_curve_test_suite()
Definition: bezier_curve_test_suite.hpp:111
index_type degree() const
Definition: bezier.hpp:191
point_type fpp(const data_type &t) const
Definition: bezier.hpp:369
control_point_type get_control_point(const index_type &i) const
Definition: bezier.hpp:213
Definition: continuity.hpp:27
fit_container_type::constraint_point_type constraint_point_type
Definition: bezier_curve_test_suite.hpp:36
void promotion_test()
Definition: bezier_curve_test_suite.hpp:684
void degree_to_cubic()
Definition: bezier.hpp:494
void curvature(typename curve__::data_type &rho, const curve__ &c, const typename curve__::data_type &t)
Definition: curvature.hpp:25
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 frenet_serret_test()
Definition: bezier_curve_test_suite.hpp:505
point_type get_min() const
Definition: bounding_box.hpp:93
bezier_type::data_type data_type
Definition: bezier_curve_test_suite.hpp:39
void assignment_test()
Definition: bezier_curve_test_suite.hpp:160
bezier_curve_test_suite()
Definition: bezier_curve_test_suite.hpp:107
void resize(const index_type &t_dim)
Definition: bezier.hpp:186
void AddTests(const float &)
Definition: bezier_curve_test_suite.hpp:42
void set_control_point(const control_point_type &cp, const index_type &i)
Definition: bezier.hpp:201
void octave_print(int figno, const std::vector< point_type > &pts, const bezier_type &bez) const
Definition: bezier_curve_test_suite.hpp:116
eli::geom::curve::bezier< data__, 3 > bezier_type
Definition: bezier_curve_test_suite.hpp:34
void length_test()
Definition: bezier_curve_test_suite.hpp:1698
void transformation_test()
Definition: bezier_curve_test_suite.hpp:227
point_type fppp(const data_type &t) const
Definition: bezier.hpp:394
point_type fp(const data_type &t) const
Definition: bezier.hpp:344
data__ data_type
Definition: bezier.hpp:113
void reverse_test()
Definition: bezier_curve_test_suite.hpp:535
void distance_bound_test()
Definition: bezier_curve_test_suite.hpp:1493
void reflection_test()
Definition: bezier_curve_test_suite.hpp:563
Definition: bezier.hpp:109
void reverse()
Definition: bezier.hpp:256
data_type eqp_distance_bound(const bezier< data_type, dim__, tolerance_type > &bc) const
Definition: bezier.hpp:174
Definition: continuity.hpp:29
Definition: bezier_curve_test_suite.hpp:31
void reflect_yz()
Definition: bezier.hpp:235
bool degree_demote(const geom::general::continuity &continuity_degree=geom::general::C0)
Definition: bezier.hpp:460
bezier_type::index_type index_type
Definition: bezier_curve_test_suite.hpp:37
point_type::Index index_type
Definition: bezier.hpp:116