tetrahedralize.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include <test_common.h>
  2. #include <igl/setxor.h>
  3. #include <igl/copyleft/tetgen/tetrahedralize.h>
  4. #include <igl/unique_simplices.h>
  5. #include <igl/matlab_format.h>
  6. #include <iostream>
  7. TEST_CASE("tetrahedralize: single_tet", "[igl/copyleft/tetgen]")
  8. {
  9. const Eigen::MatrixXd V = (Eigen::MatrixXd(4,3)<<
  10. 0,0,0,
  11. 1,0,0,
  12. 0,1,0,
  13. 0,0,1).finished();
  14. Eigen::MatrixXi F(0,3);
  15. Eigen::MatrixXd TV;
  16. Eigen::MatrixXi TT,TF;
  17. igl::copyleft::tetgen::tetrahedralize(V,F,"cpQ",TV,TT,TF);
  18. REQUIRE (4 == TV.rows());
  19. REQUIRE (1 == TT.rows());
  20. REQUIRE (4 == TF.rows());
  21. Eigen::MatrixXi TTcorrect = (Eigen::MatrixXi(1,4)<<0,1,2,3).finished();
  22. {
  23. Eigen::VectorXi TT_XOR,IA,IB;
  24. igl::setxor(TT,TTcorrect,TT_XOR,IA,IB);
  25. REQUIRE (0 == TT_XOR.size());
  26. }
  27. test_common::assert_eq(TV,V);
  28. }
  29. TEST_CASE("tetrahedralize: two_tets", "[igl/copyleft/tetgen]")
  30. {
  31. const Eigen::MatrixXd V = (Eigen::MatrixXd(5,3)<<
  32. 2,1,0,
  33. 1,-1,0,
  34. -1,-1,0,
  35. -1,1,0,
  36. 0,0,1 ).finished();
  37. Eigen::MatrixXi F(0,3);
  38. Eigen::MatrixXd TV;
  39. Eigen::MatrixXi TT,TF;
  40. Eigen::MatrixXd H,R;
  41. Eigen::VectorXi FM,PT,TM,TR;
  42. Eigen::VectorXi VM = (Eigen::VectorXi(5)<< 0, 1, 2, 3, 4).finished();
  43. Eigen::MatrixXi TN,FT;
  44. int num_regions;
  45. igl::copyleft::tetgen::tetrahedralize(
  46. V,F,H,VM,FM,R,"cpnnfmQ",TV,TT,TF,TM,TR,TN,PT,FT,num_regions);
  47. REQUIRE (5 == TV.rows());
  48. REQUIRE (2 == TT.rows());
  49. REQUIRE (7 == TF.rows());
  50. REQUIRE (TV.rows() == TM.rows());
  51. REQUIRE (TN.rows() == TT.rows());
  52. REQUIRE (TN.cols() == 4);
  53. REQUIRE((TN.row(0).array() == 1).any());
  54. REQUIRE((TN.row(1).array() == 0).any());
  55. REQUIRE(FT.rows() == TF.rows());
  56. REQUIRE(PT.size() == TV.rows());
  57. REQUIRE(PT(0) == 0);
  58. REQUIRE(PT(2) == 1);
  59. Eigen::MatrixXi TTcorrect(2,4);
  60. TTcorrect<<
  61. 4,0,1,3,
  62. 4,3,1,2;
  63. {
  64. Eigen::MatrixXi TT_combined = Eigen::MatrixXi(TT.rows()+TTcorrect.rows(),TT.cols());
  65. TT_combined<<TT,TTcorrect;
  66. Eigen::MatrixXi TT_unique;
  67. igl::unique_simplices(TT_combined,TT_unique);
  68. REQUIRE(TT_unique.rows() == TT.rows());
  69. }
  70. test_common::assert_eq(TV,V);
  71. }
  72. TEST_CASE("tetrahedralize: schoenhardt", "[igl/copyleft/tetgen]")
  73. {
  74. const Eigen::MatrixXd V = (Eigen::MatrixXd(6,3)<<
  75. -246.2,-43.412,500,
  76. 160.7,-191.51,500,
  77. 85.505, 234.92,500,
  78. 250, 0, 0,
  79. -125, 216.51, 0,
  80. -125,-216.51, 0).finished();
  81. const Eigen::MatrixXi F = (Eigen::MatrixXi(8,3)<<
  82. 1,2,0,
  83. 5,0,2,
  84. 3,1,0,
  85. 4,2,1,
  86. 0,5,3,
  87. 1,3,4,
  88. 2,4,5,
  89. 3,5,4).finished();
  90. Eigen::MatrixXd TV;
  91. Eigen::MatrixXi TT,TF;
  92. igl::copyleft::tetgen::tetrahedralize(V,F,"pQ",TV,TT,TF);
  93. REQUIRE (V.rows() <= TV.rows());
  94. }
  95. TEST_CASE("tetrahedralize: quad_face", "[igl/copyleft/tetgen]")
  96. {
  97. const Eigen::MatrixXd V = (Eigen::MatrixXd(5,3)<<
  98. -1.0,0.0,0.0,
  99. 0.0,-1.0,0.0,
  100. 1.0,0.0,0.0,
  101. 0.0,1.0,0.0,
  102. 0.0,0.0,1.0).finished();
  103. const Eigen::MatrixXi F = (Eigen::MatrixXi(5,4)<<
  104. 0,1,2,3,
  105. 0,1,4,-1,
  106. 1,2,4,-1,
  107. 2,3,4,-1,
  108. 3,0,4,-1).finished();
  109. Eigen::MatrixXd TV;
  110. Eigen::MatrixXi TT,TF;
  111. igl::copyleft::tetgen::tetrahedralize(V,F,"pQ",TV,TT,TF);
  112. REQUIRE (TT.rows() == 2);
  113. }
  114. TEST_CASE("tetrahedralize: embedded_segment", "[igl/copyleft/tetgen]")
  115. {
  116. const Eigen::MatrixXd V = (Eigen::MatrixXd(6,3)<<
  117. -0.5,0.5,0.0,
  118. 0.0,-1.0,0.0,
  119. 0.5,0.5,0.0,
  120. 0.0,0.0,1.0,
  121. 0.0,0.0,0.2,
  122. 0.0,0.0,0.9).finished();
  123. const Eigen::MatrixXi F = (Eigen::MatrixXi(5,3)<<
  124. 0,1,2,
  125. 1,3,2,
  126. 0,2,3,
  127. 1,0,3,
  128. 4,5,-1).finished();
  129. Eigen::MatrixXd TV;
  130. Eigen::MatrixXi TT,TF;
  131. igl::copyleft::tetgen::tetrahedralize(V,F,"pQ",TV,TT,TF);
  132. REQUIRE (TT.rows() == 7);
  133. }