outer_facet.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include <test_common.h>
  2. #include <igl/copyleft/cgal/outer_facet.h>
  3. namespace OuterFacetHelper {
  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. TEST_CASE("OuterFacet: Simple", "[igl/copyleft/cgal]")
  16. Eigen::MatrixXd V;
  17. Eigen::MatrixXi F;
  18. test_common::load_mesh("cube.obj", V, F);
  19. const size_t num_faces = F.rows();
  20. Eigen::VectorXi I(num_faces);
  21. I.setLinSpaced(num_faces, 0, num_faces-1);
  22. size_t fid = num_faces + 1;
  23. bool flipped;
  24. igl::copyleft::cgal::outer_facet(V, F, I, fid, flipped);
  25. REQUIRE (num_faces > fid);
  26. REQUIRE (!flipped);
  27. }
  28. TEST_CASE("OuterFacet: DuplicatedOppositeFaces", "[igl/copyleft/cgal]")
  29. Eigen::MatrixXd V;
  30. Eigen::MatrixXi F1;
  31. test_common::load_mesh("cube.obj", V, F1);
  32. Eigen::MatrixXi F2 = F1;
  33. F2.col(0).swap(F2.col(1));
  34. Eigen::MatrixXi F(F1.rows()*2, F1.cols());
  35. F << F1, F2;
  36. Eigen::VectorXi I(F.rows());
  37. I.setLinSpaced(F.rows(), 0, F.rows()-1);
  38. size_t fid = F.rows() + 1;
  39. bool flipped;
  40. igl::copyleft::cgal::outer_facet(V, F, I, fid, flipped);
  41. REQUIRE (F.rows() > fid);
  42. REQUIRE (!flipped);
  43. }
  44. TEST_CASE("OuterFacet: FullyDegnerated", "[igl/copyleft/cgal]")
  45. Eigen::MatrixXd V;
  46. Eigen::MatrixXi F;
  47. test_common::load_mesh("degenerated.obj", V, F);
  48. Eigen::VectorXi I(F.rows());
  49. I.setLinSpaced(F.rows(), 0, F.rows()-1);
  50. size_t fid = F.rows() + 1;
  51. bool flipped;
  52. igl::copyleft::cgal::outer_facet(V, F, I, fid, flipped);
  53. REQUIRE (F.rows() > fid);
  54. REQUIRE (!flipped);
  55. }
  56. TEST_CASE("OuterFacet: InvertedNormal", "[igl/copyleft/cgal]")
  57. Eigen::MatrixXd V;
  58. Eigen::MatrixXi F;
  59. test_common::load_mesh("cube.obj", V, F);
  60. F.col(0).swap(F.col(1));
  61. Eigen::VectorXi I(F.rows());
  62. I.setLinSpaced(F.rows(), 0, F.rows()-1);
  63. size_t fid = F.rows() + 1;
  64. bool flipped;
  65. igl::copyleft::cgal::outer_facet(V, F, I, fid, flipped);
  66. REQUIRE (F.rows() > fid);
  67. REQUIRE (flipped);
  68. }
  69. TEST_CASE("OuterFacet: SliverTet", "[igl/copyleft/cgal]")
  70. Eigen::MatrixXd V;
  71. Eigen::MatrixXi F;
  72. test_common::load_mesh("sliver_tet.ply", V, F);
  73. Eigen::VectorXi I(F.rows());
  74. I.setLinSpaced(F.rows(), 0, F.rows()-1);
  75. size_t fid = F.rows() + 1;
  76. bool flipped;
  77. igl::copyleft::cgal::outer_facet(V, F, I, fid, flipped);
  78. REQUIRE (F.rows() > fid);
  79. REQUIRE (!flipped);
  80. }
  81. }