boundary_facets.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include <test_common.h>
  2. #include <igl/boundary_facets.h>
  3. #include <igl/sort.h>
  4. #include <igl/sortrows.h>
  5. #include <igl/centroid.h>
  6. #include <igl/volume.h>
  7. #include <igl/matlab_format.h>
  8. #include <iostream>
  9. TEST_CASE("boundary_facets: single_tet_volume", "[igl]")
  10. {
  11. Eigen::MatrixXd V(4,3);
  12. V<<
  13. 0,0,0,
  14. 1,0,0,
  15. 0,1,0,
  16. 0,0,1;
  17. Eigen::MatrixXi T(1,4);
  18. T<<0,1,2,3;
  19. Eigen::MatrixXi F;
  20. igl::boundary_facets(T,F);
  21. REQUIRE( F.rows () == 4 );
  22. double total_volume;
  23. Eigen::RowVector3d centroid;
  24. igl::centroid(V,F,centroid,total_volume);
  25. Eigen::VectorXd volumes;
  26. igl::volume(V,T,volumes);
  27. REQUIRE( total_volume == Approx(volumes(0)) );
  28. }
  29. TEST_CASE("boundary_facets: single_tri", "[igl]")
  30. {
  31. Eigen::MatrixXd V(4,3);
  32. V<<
  33. 0,0,
  34. 1,0,
  35. 0,1;
  36. Eigen::MatrixXi F(1,3);
  37. F<<0,1,2;
  38. Eigen::MatrixXi E;
  39. igl::boundary_facets(F,E);
  40. REQUIRE( E.rows () == 3 );
  41. // orientation should match triangle edges
  42. Eigen::MatrixXi FE(3,2);
  43. FE<<
  44. F(0,1),F(0,2),
  45. F(0,2),F(0,0),
  46. F(0,0),F(0,1);
  47. igl::sortrows(Eigen::MatrixXi(E),true,E);
  48. igl::sortrows(Eigen::MatrixXi(FE),true,FE);
  49. test_common::assert_eq(FE,E);
  50. }
  51. TEST_CASE("boundary_facets: single_tet", "[igl]")
  52. {
  53. const Eigen::MatrixXi T =
  54. (Eigen::MatrixXi(1,4)<<0,1,2,3).finished();
  55. Eigen::MatrixXi F;
  56. Eigen::MatrixXi J;
  57. Eigen::MatrixXi K;
  58. igl::boundary_facets(T,F);
  59. REQUIRE( F.rows () == 4 );
  60. // sorted! (unoriented)
  61. const Eigen::MatrixXi sorted_Fgt =
  62. (Eigen::MatrixXi(4,3) <<
  63. 0,1,2,
  64. 0,1,3,
  65. 0,2,3,
  66. 1,2,3).finished();
  67. Eigen::MatrixXi sorted_F;
  68. {
  69. Eigen::MatrixXi _1;
  70. igl::sort(F,2,true, sorted_F,_1);
  71. igl::sortrows(Eigen::MatrixXi(sorted_F),true,sorted_F,_1);
  72. }
  73. test_common::assert_eq(sorted_Fgt,sorted_F);
  74. }
  75. TEST_CASE("boundary_facets: single_cube", "[igl]")
  76. {
  77. const Eigen::MatrixXi T =
  78. (Eigen::MatrixXi(6,4)<<
  79. 0,1,7,5,
  80. 0,7,4,5,
  81. 0,1,3,7,
  82. 0,3,2,7,
  83. 0,6,4,7,
  84. 0,2,6,7).finished();
  85. const Eigen::MatrixXi Fgt =
  86. (Eigen::MatrixXi(12,3)<<
  87. 0,5,4,
  88. 0,1,5,
  89. 6,7,2,
  90. 7,3,2,
  91. 4,6,0,
  92. 6,2,0,
  93. 1,7,5,
  94. 1,3,7,
  95. 0,3,1,
  96. 0,2,3,
  97. 5,7,4,
  98. 7,6,4).finished();
  99. Eigen::MatrixXi F;
  100. Eigen::VectorXi J,K;
  101. igl::boundary_facets(T,F,J,K);
  102. const auto sortF = [](const Eigen::MatrixXi & F)-> Eigen::MatrixXi
  103. {
  104. Eigen::MatrixXi sorted_F;
  105. igl::sort(F,2,true, sorted_F);
  106. igl::sortrows(Eigen::MatrixXi(sorted_F),true,sorted_F);
  107. return sorted_F;
  108. };
  109. Eigen::MatrixXi sorted_F = sortF(F);
  110. Eigen::MatrixXi sorted_Fgt = sortF(Fgt);
  111. test_common::assert_eq(sorted_Fgt,sorted_F);
  112. for(int f = 0;f<F.rows();f++)
  113. {
  114. Eigen::RowVector3i Ff;
  115. igl::sort(F.row(f),2,true,Ff);
  116. Eigen::RowVector3i Gf(
  117. T(J(f), (K(f)+1)%4 ),
  118. T(J(f), (K(f)+2)%4 ),
  119. T(J(f), (K(f)+3)%4 ));
  120. igl::sort(Eigen::RowVector3i(Gf),2,true,Gf);
  121. test_common::assert_eq(Ff,Gf);
  122. }
  123. }
  124. TEST_CASE("boundary_facets: non-manifold", "[igl]")
  125. {
  126. const auto F = (Eigen::MatrixXi(3,3)<<0,1,2,1,0,3,0,1,4).finished();
  127. auto Egt = (Eigen::MatrixXi(6,2)<<1,2,2,0,3,1,0,3,4,0,1,4).finished();
  128. igl::sortrows(Eigen::MatrixXi(Egt),true,Egt);
  129. Eigen::MatrixXi E;
  130. igl::boundary_facets(F,E);
  131. igl::sortrows(Eigen::MatrixXi(E),true,E);
  132. test_common::assert_eq(Egt,E);
  133. }