boundary_facets.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <test_common.h>
  2. #include <igl/boundary_facets.h>
  3. #include <igl/sort.h>
  4. #include <igl/sortrows.h>
  5. #include <igl/setxor.h>
  6. #include <igl/matlab_format.h>
  7. #include <iostream>
  8. TEST_CASE("boundary_facets: single_tet", "[igl]")
  9. {
  10. const Eigen::MatrixXi T =
  11. (Eigen::MatrixXi(1,4)<<0,1,2,3).finished();
  12. Eigen::MatrixXi F;
  13. Eigen::MatrixXi J;
  14. Eigen::MatrixXi K;
  15. igl::boundary_facets(T,F);
  16. REQUIRE( F.rows () == 4 );
  17. // sorted! (unoriented)
  18. const Eigen::MatrixXi sorted_Fgt =
  19. (Eigen::MatrixXi(4,3) <<
  20. 0,1,2,
  21. 0,1,3,
  22. 0,2,3,
  23. 1,2,3).finished();
  24. Eigen::MatrixXi sorted_F;
  25. {
  26. Eigen::MatrixXi _1;
  27. igl::sort(F,2,true, sorted_F,_1);
  28. igl::sortrows(Eigen::MatrixXi(sorted_F),true,sorted_F,_1);
  29. }
  30. test_common::assert_eq(sorted_Fgt,sorted_F);
  31. }
  32. TEST_CASE("boundary_facets: single_cube", "[igl]")
  33. {
  34. const Eigen::MatrixXi T =
  35. (Eigen::MatrixXi(6,4)<<
  36. 0,1,7,5,
  37. 0,7,4,5,
  38. 0,1,3,7,
  39. 0,3,2,7,
  40. 0,6,4,7,
  41. 0,2,6,7).finished();
  42. const Eigen::MatrixXi Fgt =
  43. (Eigen::MatrixXi(12,3)<<
  44. 0,5,4,
  45. 0,1,5,
  46. 6,7,2,
  47. 7,3,2,
  48. 4,6,0,
  49. 6,2,0,
  50. 1,7,5,
  51. 1,3,7,
  52. 0,3,1,
  53. 0,2,3,
  54. 5,7,4,
  55. 7,6,4).finished();
  56. Eigen::MatrixXi F;
  57. Eigen::VectorXi J,K;
  58. igl::boundary_facets(T,F,J,K);
  59. const auto sortF = [](const Eigen::MatrixXi & F)-> Eigen::MatrixXi
  60. {
  61. Eigen::MatrixXi sorted_F;
  62. igl::sort(F,2,true, sorted_F);
  63. igl::sortrows(Eigen::MatrixXi(sorted_F),true,sorted_F);
  64. return sorted_F;
  65. };
  66. Eigen::MatrixXi sorted_F = sortF(F);
  67. Eigen::MatrixXi sorted_Fgt = sortF(Fgt);
  68. test_common::assert_eq(sorted_Fgt,sorted_F);
  69. for(int f = 0;f<F.rows();f++)
  70. {
  71. Eigen::RowVector3i Ff;
  72. igl::sort(F.row(f),2,true,Ff);
  73. Eigen::RowVector3i Gf(
  74. T(J(f), (K(f)+1)%4 ),
  75. T(J(f), (K(f)+2)%4 ),
  76. T(J(f), (K(f)+3)%4 ));
  77. igl::sort(Eigen::RowVector3i(Gf),2,true,Gf);
  78. test_common::assert_eq(Ff,Gf);
  79. }
  80. }
  81. TEST_CASE("boundary_facets: non-manifold", "[igl]")
  82. {
  83. const auto F = (Eigen::MatrixXi(3,3)<<0,1,2,1,0,3,0,1,4).finished();
  84. auto Egt = (Eigen::MatrixXi(6,2)<<1,2,2,0,3,1,0,3,4,0,1,4).finished();
  85. igl::sortrows(Eigen::MatrixXi(Egt),true,Egt);
  86. Eigen::MatrixXi E;
  87. igl::boundary_facets(F,E);
  88. std::cerr<<igl::matlab_format(E,"E")<<std::endl;
  89. igl::sortrows(Eigen::MatrixXi(E),true,E);
  90. test_common::assert_eq(Egt,E);
  91. }