/tests/plf_tests.cc

https://bitbucket.org/tetonedge/libsrvf · C++ · 241 lines · 220 code · 20 blank · 1 comment · 15 complexity · 350056132c0112c653329612a56650f3 MD5 · raw file

  1. #include <boost/test/unit_test.hpp>
  2. #include <FL/Fl.H>
  3. #include <srvf/plf.h>
  4. #include <srvf/pointset.h>
  5. #include <srvf/plot.h>
  6. #include <srvf/plotwin.h>
  7. #include <srvf/render.h>
  8. #include <srvf/matrix.h>
  9. #include <srvf/util.h>
  10. BOOST_AUTO_TEST_SUITE(plf_tests)
  11. BOOST_AUTO_TEST_CASE(evaluate_test1)
  12. {
  13. std::vector<double> samps_data=srvf::util::linspace(0.0,1.0,2);
  14. srvf::Pointset samps(1,2,samps_data);
  15. srvf::Plf F(samps);
  16. std::vector<double> tv=srvf::util::linspace(0.0,1.0,5);
  17. double expdata[]={0.0, 0.25, 0.5, 0.75, 1.0};
  18. srvf::Pointset Ftv1 = F.evaluate(tv);
  19. BOOST_REQUIRE_EQUAL(Ftv1.dim(), F.dim());
  20. BOOST_REQUIRE_EQUAL(Ftv1.npts(), tv.size());
  21. for (size_t i=0; i<5; ++i)
  22. {
  23. srvf::Point Ftv2 = F.evaluate(tv[i]);
  24. BOOST_REQUIRE_EQUAL(Ftv2.dim(), F.dim());
  25. BOOST_CHECK_EQUAL(Ftv1[i][0],expdata[i]);
  26. BOOST_CHECK_EQUAL(Ftv2[0],expdata[i]);
  27. }
  28. }
  29. BOOST_AUTO_TEST_CASE(evaluate_test2)
  30. {
  31. std::vector<double> uv=srvf::util::linspace(0.0,1.0,500);
  32. std::vector<double> uvl=srvf::util::linspace(0.0,1.0,999);
  33. srvf::Pointset X(3,500);
  34. for (size_t i=0; i<3; ++i)
  35. {
  36. for (size_t j=0; j<500; ++j)
  37. {
  38. X[j][i]=(double)j;
  39. }
  40. }
  41. srvf::Plf F(X,uv);
  42. srvf::Pointset res = F.evaluate(uvl);
  43. BOOST_REQUIRE_EQUAL(res.dim(), F.dim());
  44. BOOST_REQUIRE_EQUAL(res.npts(), uvl.size());
  45. for (size_t i=0; i<3; ++i)
  46. {
  47. for (size_t j=0; j<999; ++j)
  48. {
  49. double ev=(double)(j) * 499.0 / 998.0;
  50. BOOST_CHECK_CLOSE(ev,res[j][i],1e-5);
  51. }
  52. }
  53. }
  54. BOOST_AUTO_TEST_CASE(preimages_test1)
  55. {
  56. std::vector<double> samps_data=srvf::util::linspace(0.0,1.0,2);
  57. std::vector<double> uv=srvf::util::linspace(0.0,1.0,13);
  58. srvf::Pointset samps(1,2,samps_data);
  59. srvf::Plf F(samps);
  60. std::vector<double> Fiuv = F.preimages(uv);
  61. for (size_t i=0; i<uv.size(); ++i)
  62. {
  63. BOOST_CHECK_CLOSE(uv[i],Fiuv[i],1e-5);
  64. }
  65. }
  66. BOOST_AUTO_TEST_CASE(preimages_test2)
  67. {
  68. double samps_data[]={0.0, 0.5, 0.5, 1.0};
  69. srvf::Pointset samps(1,4,samps_data);
  70. std::vector<double> tv=srvf::util::linspace(0.0,1.0,5);
  71. double exp_data[]={0.0, 1.0/6.0, 2.0/3.0, 5.0/6.0, 1.0};
  72. srvf::Plf F(samps);
  73. std::vector<double> Fitv = F.preimages(tv);
  74. for (size_t i=0; i<tv.size(); ++i)
  75. {
  76. BOOST_CHECK_CLOSE(exp_data[i],Fitv[i],1e-5);
  77. }
  78. }
  79. BOOST_AUTO_TEST_CASE(arc_length_test1)
  80. {
  81. double samps_data[]=
  82. {
  83. 0.0, 1.0, 1.0, 0.0,
  84. 0.0, 0.0, 1.0, 1.0
  85. };
  86. srvf::Plf F(srvf::Pointset(2,4,samps_data,srvf::Pointset::POINT_PER_COLUMN));
  87. double ev=3.0;
  88. double av=F.arc_length();
  89. BOOST_CHECK_CLOSE(ev,av,1e-5);
  90. }
  91. BOOST_AUTO_TEST_CASE(translate_test1)
  92. {
  93. srvf::Pointset samps(3,20,0.0);
  94. srvf::Plf F(samps);
  95. double v_data[]={1.0,2.0,3.0};
  96. srvf::Point v(&v_data[0],&v_data[3]);
  97. F.translate(v);
  98. for (size_t i=0; i<F.samps().npts(); ++i)
  99. {
  100. for (size_t j=0; j<F.samps().dim(); ++j)
  101. {
  102. BOOST_CHECK_EQUAL(F.samps()[i][j],v[j]);
  103. }
  104. }
  105. }
  106. BOOST_AUTO_TEST_CASE(rotate_test1)
  107. {
  108. // Rotation by 90 degrees counter-clockwise
  109. double R_data[]={
  110. 0.0, -1.0,
  111. 1.0, 0.0
  112. };
  113. srvf::Matrix R(2,2,R_data);
  114. srvf::Pointset samps(2,3,1.0);
  115. srvf::Plf F(samps);
  116. F.rotate(R);
  117. for (size_t i=0; i<F.samps().npts(); ++i)
  118. {
  119. BOOST_CHECK_EQUAL(F.samps()[i][0],-1.0);
  120. BOOST_CHECK_EQUAL(F.samps()[i][1],1.0);
  121. }
  122. }
  123. BOOST_AUTO_TEST_CASE(scale_test1)
  124. {
  125. srvf::Matrix samps_data(3,57,1.0);
  126. srvf::Pointset samps(samps_data);
  127. srvf::Plf F(samps);
  128. F.scale(2.0);
  129. for (size_t i=0; i<F.samps().npts(); ++i)
  130. {
  131. for (size_t j=0; j<F.samps().dim(); ++j)
  132. {
  133. BOOST_CHECK_EQUAL(F.samps()[i][j],2.0);
  134. }
  135. }
  136. }
  137. BOOST_AUTO_TEST_CASE(linear_combination_test1)
  138. {
  139. double params1_data[]= { 0.0, 0.1, 0.2, 0.9, 1.0 };
  140. double params2_data[]= { 0.0, 0.3, 0.4, 0.6, 1.0 };
  141. size_t ncp1=sizeof(params1_data)/sizeof(double);
  142. size_t ncp2=sizeof(params2_data)/sizeof(double);
  143. srvf::Pointset samps1(1,5,1.0);
  144. srvf::Pointset samps2(1,5,-1.0);
  145. std::vector<double> params1(&params1_data[0],&params1_data[ncp1]);
  146. std::vector<double> params2(&params2_data[0],&params2_data[ncp2]);
  147. double exp_params_data[]={ 0.0, 0.1, 0.2, 0.3, 0.4, 0.6, 0.9, 1.0 };
  148. srvf::Plf F1(samps1,params1);
  149. srvf::Plf F2(samps2,params2);
  150. srvf::Plf Fr=srvf::linear_combination(F1,F2,0.75,0.25);
  151. BOOST_REQUIRE_EQUAL(Fr.samps().npts(),8);
  152. BOOST_REQUIRE_EQUAL(Fr.ncp(),8);
  153. for (size_t i=0; i<8; ++i)
  154. {
  155. BOOST_CHECK_EQUAL(Fr.samps()[i][0],0.5);
  156. BOOST_CHECK_EQUAL(Fr.params()[i],exp_params_data[i]);
  157. }
  158. }
  159. BOOST_AUTO_TEST_CASE(composition_test1)
  160. {
  161. double params1_data[]={0.0, 0.25, 0.5, 1.0};
  162. double params2_data[]={0.0, 1.0/3.0, 2.0/3.0, 1.0};
  163. double exp_params[]={0.0, 1.0/6.0, 1.0/3.0, 2.0/3.0, 1.0};
  164. double samps1_data[]={0.0, 0.5, 0.0, 0.5};
  165. double samps2_data[]={0.0, 0.5, 0.5, 1.0};
  166. double exp_samps[]={0.0, 0.5, 0.0, 0.0, 0.5};
  167. size_t n1=sizeof(params1_data)/sizeof(double);
  168. size_t n2=sizeof(params2_data)/sizeof(double);
  169. size_t n3=sizeof(exp_params)/sizeof(double);
  170. std::vector<double> params1(&params1_data[0],&params1_data[n1]);
  171. std::vector<double> params2(&params2_data[0],&params2_data[n2]);
  172. srvf::Pointset samps1(1,n1,samps1_data);
  173. srvf::Pointset samps2(1,n2,samps2_data);
  174. srvf::Plf F1(samps1,params1);
  175. srvf::Plf F2(samps2,params2);
  176. srvf::Plf F12=srvf::composition(F1,F2);
  177. BOOST_REQUIRE_EQUAL(F12.ncp(),n3);
  178. for (size_t i=0; i<n3; ++i)
  179. {
  180. BOOST_CHECK_EQUAL(F12.params()[i],exp_params[i]);
  181. BOOST_CHECK_EQUAL(F12.samps()[i][0],exp_samps[i]);
  182. }
  183. }
  184. BOOST_AUTO_TEST_CASE(inverse_test1)
  185. {
  186. double params_data[]={0.0, 0.25, 0.5, 0.75, 1.0};
  187. double samps_data[]={0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0};
  188. size_t n1=sizeof(params_data)/sizeof(double);
  189. size_t nexp=n1;
  190. std::vector<double> params(&params_data[0],&params_data[n1]);
  191. srvf::Pointset samps(1,n1,samps_data);
  192. srvf::Plf F(samps,params);
  193. srvf::Plf Fi=srvf::inverse(F);
  194. BOOST_REQUIRE_EQUAL(Fi.ncp(),nexp);
  195. for (size_t i=0; i<nexp; ++i)
  196. {
  197. BOOST_CHECK_EQUAL(Fi.params()[i],samps_data[i]);
  198. BOOST_CHECK_EQUAL(Fi.samps()[i][0],params_data[i]);
  199. }
  200. }
  201. BOOST_AUTO_TEST_CASE(constant_speed_reparam_test1)
  202. {
  203. double samps_data[] = { 0.0, 0.1, 1.0, 0.0, 0.1, 0.0 };
  204. double params_data[] = { 0.0, 0.6, 0.7, 0.8, 1.0 };
  205. size_t npts = sizeof(params_data) / sizeof(double);
  206. srvf::Pointset samps(1, npts, samps_data);
  207. std::vector<double> params(&(params_data[0]), &(params_data[npts]));
  208. srvf::Plf F(samps, params);
  209. srvf::Plf G = constant_speed_reparam(F, 0.0, 1.0);
  210. srvf::Plf Fn = composition(F, G);
  211. srvf::plot::FunctionPlot plot;
  212. plot.insert(F, srvf::plot::Color(0.0,0.0,1.0));
  213. plot.insert(Fn, srvf::plot::Color(0.0,1.0,0.0));
  214. plot.insert(G, srvf::plot::Color(1.0,0.0,0.0));
  215. srvf::plot::FltkGlPlotWindow plotwin(800,400,
  216. "constant_speed_reparam_test1: F(blue), Fn(green), and G(red)");
  217. plotwin.add_plot(static_cast<srvf::plot::Plot*>(&plot));
  218. plotwin.show();
  219. Fl::run();
  220. }
  221. BOOST_AUTO_TEST_SUITE_END()