outer_facet.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include <test_common.h>
  2. #include <igl/copyleft/cgal/outer_facet.h>
  3. namespace {
  4. /**
  5. * Check if the outer facet is indeed valid.
  6. * Assumption: mesh is closed.
  7. */
  8. template<typename DerivedV, typename DerivedF>
  9. void assert_outer_facet_is_correct(
  10. const Eigen::PlainObjectBase<DerivedV>& V,
  11. const Eigen::PlainObjectBase<DerivedF>& F,
  12. size_t fid, bool flipped) {
  13. // Todo.
  14. }
  15. } // anonymous namespace
  16. TEST_CASE("OuterFacet: Simple", "[igl/copyleft/cgal]")
  17. {
  18. Eigen::MatrixXd V;
  19. Eigen::MatrixXi F;
  20. test_common::load_mesh("cube.obj", V, F);
  21. const size_t num_faces = F.rows();
  22. Eigen::VectorXi I(num_faces);
  23. I.setLinSpaced(num_faces, 0, num_faces-1);
  24. size_t fid = num_faces + 1;
  25. bool flipped;
  26. igl::copyleft::cgal::outer_facet(V, F, I, fid, flipped);
  27. REQUIRE (num_faces > fid);
  28. REQUIRE (!flipped);
  29. }
  30. TEST_CASE("OuterFacet: DuplicatedOppositeFaces", "[igl/copyleft/cgal]")
  31. {
  32. Eigen::MatrixXd V;
  33. Eigen::MatrixXi F1;
  34. test_common::load_mesh("cube.obj", V, F1);
  35. Eigen::MatrixXi F2 = F1;
  36. F2.col(0).swap(F2.col(1));
  37. Eigen::MatrixXi F(F1.rows()*2, F1.cols());
  38. F << F1, F2;
  39. Eigen::VectorXi I(F.rows());
  40. I.setLinSpaced(F.rows(), 0, F.rows()-1);
  41. size_t fid = F.rows() + 1;
  42. bool flipped;
  43. igl::copyleft::cgal::outer_facet(V, F, I, fid, flipped);
  44. REQUIRE (F.rows() > fid);
  45. REQUIRE (!flipped);
  46. }
  47. TEST_CASE("OuterFacet: FullyDegnerated", "[igl/copyleft/cgal]")
  48. {
  49. Eigen::MatrixXd V;
  50. Eigen::MatrixXi F;
  51. test_common::load_mesh("degenerated.obj", V, F);
  52. Eigen::VectorXi I(F.rows());
  53. I.setLinSpaced(F.rows(), 0, F.rows()-1);
  54. size_t fid = F.rows() + 1;
  55. bool flipped;
  56. igl::copyleft::cgal::outer_facet(V, F, I, fid, flipped);
  57. REQUIRE (F.rows() > fid);
  58. REQUIRE (!flipped);
  59. }
  60. TEST_CASE("OuterFacet: InvertedNormal", "[igl/copyleft/cgal]")
  61. {
  62. Eigen::MatrixXd V;
  63. Eigen::MatrixXi F;
  64. test_common::load_mesh("cube.obj", V, F);
  65. F.col(0).swap(F.col(1));
  66. Eigen::VectorXi I(F.rows());
  67. I.setLinSpaced(F.rows(), 0, F.rows()-1);
  68. size_t fid = F.rows() + 1;
  69. bool flipped;
  70. igl::copyleft::cgal::outer_facet(V, F, I, fid, flipped);
  71. REQUIRE (F.rows() > fid);
  72. REQUIRE (flipped);
  73. }
  74. TEST_CASE("OuterFacet: SliverTet", "[igl/copyleft/cgal]")
  75. {
  76. Eigen::MatrixXd V;
  77. Eigen::MatrixXi F;
  78. test_common::load_mesh("sliver_tet.ply", V, F);
  79. Eigen::VectorXi I(F.rows());
  80. I.setLinSpaced(F.rows(), 0, F.rows()-1);
  81. size_t fid = F.rows() + 1;
  82. bool flipped;
  83. igl::copyleft::cgal::outer_facet(V, F, I, fid, flipped);
  84. REQUIRE (F.rows() > fid);
  85. REQUIRE (!flipped);
  86. }