circulation.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <test_common.h>
  2. #include <igl/circulation.h>
  3. #include <igl/edge_flaps.h>
  4. #include <igl/unique_edge_map.h>
  5. #include <igl/matlab_format.h>
  6. TEST(circulation,single_edge)
  7. {
  8. // 7
  9. // /₆|₇\
  10. // 4 - 5 - 6
  11. // |₂/₃|₄\₅|
  12. // 1 - 2 - 3
  13. // \₀|₁/
  14. // 0
  15. const Eigen::MatrixXi F = (Eigen::MatrixXi(8,3)<<
  16. 0,2,1,
  17. 0,3,2,
  18. 1,5,4,
  19. 1,2,5,
  20. 2,3,5,
  21. 3,6,5,
  22. 4,5,7,
  23. 5,6,7).finished();
  24. Eigen::MatrixXi E,uE;
  25. Eigen::VectorXi EMAP;
  26. std::vector<std::vector<int> > uE2E;
  27. igl::unique_edge_map(F, E, uE, EMAP, uE2E);
  28. std::cout<<igl::matlab_format(uE,"uE")<<std::endl;
  29. Eigen::MatrixXi EI,EF;
  30. {
  31. const auto & cuE = uE;
  32. const auto & cEMAP = EMAP;
  33. igl::edge_flaps(F,cuE,cEMAP,EF,EI);
  34. }
  35. // Find (2,5) in uE
  36. int ei = 0;
  37. bool flip = false;
  38. for(;ei<E.rows();ei++)
  39. {
  40. if(uE(ei,0) == 2 && uE(ei,1) == 5){flip=false;break;}
  41. if(uE(ei,1) == 2 && uE(ei,0) == 5){flip=true;break;}
  42. }
  43. Eigen::VectorXi Nccw;
  44. igl::circulation(ei,!flip,EMAP,EF,EI,Nccw);
  45. const Eigen::VectorXi Nccwgt =
  46. (Eigen::VectorXi(6)<<
  47. 4,
  48. 5,
  49. 7,
  50. 6,
  51. 2,
  52. 3).finished();
  53. std::cout<<igl::matlab_format(Nccw,"Nccw")<<std::endl;
  54. std::cout<<igl::matlab_format(Nccwgt,"Nccwgt")<<std::endl;
  55. test_common::assert_eq(Nccw,Nccwgt);
  56. Eigen::VectorXi Ncw;
  57. igl::circulation(ei, flip,EMAP,EF,EI,Ncw);
  58. const Eigen::VectorXi Ncwgt =
  59. (Eigen::VectorXi(4)<<
  60. 4,
  61. 1,
  62. 0,
  63. 3).finished();
  64. std::cout<<igl::matlab_format(Ncw,"Ncw")<<std::endl;
  65. std::cout<<igl::matlab_format(Ncwgt,"Ncwgt")<<std::endl;
  66. test_common::assert_eq(Ncw,Ncwgt);
  67. }