split_nonmanifold.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. #include <test_common.h>
  2. #include <igl/split_nonmanifold.h>
  3. #include <igl/matlab_format.h>
  4. #include <iostream>
  5. TEST_CASE("split_nonmanifold: edge-fan", "[igl]")
  6. {
  7. using namespace igl;
  8. Eigen::MatrixXd V(7,3);
  9. V << 0,0,0,
  10. 1,0,0,
  11. -1,0,0,
  12. 0,1,0,
  13. 0,0,1,
  14. 0,0,-1,
  15. 1,0,1;
  16. Eigen::MatrixXi F(5,3);
  17. F<<0,1,3,
  18. 0,3,2,
  19. 0,4,3,
  20. 0,3,5,
  21. 0,3,6;
  22. Eigen::MatrixXd SV;
  23. Eigen::MatrixXi SF;
  24. Eigen::VectorXi SVI;
  25. igl::split_nonmanifold(V,F,SV,SF,SVI);
  26. Eigen::MatrixXd SVgt(13,3);
  27. SVgt<<
  28. 0,0,0,
  29. 0,0,0,
  30. 0,0,0,
  31. 0,0,0,
  32. 1,0,0,
  33. 0,1,0,
  34. 0,0,1,
  35. 0,1,0,
  36. 0,1,0,
  37. -1,0,0,
  38. 0,1,0,
  39. 0,0,-1,
  40. 1,0,1;
  41. Eigen::MatrixXi SFgt(5,3);
  42. SFgt<<
  43. 0,4,5,
  44. 0,5,9,
  45. 1,6,10,
  46. 2,7,11,
  47. 3,8,12;
  48. Eigen::VectorXi SVIgt(13);
  49. SVIgt<<0,0,0,0,1,3,4,3,3,2,3,5,6;
  50. test_common::assert_eq(SV,SVgt);
  51. test_common::assert_eq(SF,SFgt);
  52. test_common::assert_eq(SVI,SVIgt);
  53. }
  54. TEST_CASE("split_nonmanifold: vertex-boundary", "[igl]")
  55. {
  56. using namespace igl;
  57. Eigen::MatrixXd V(5,2);
  58. V << 0,0,
  59. 1,0,
  60. 0,1,
  61. 2,0,
  62. 1,1;
  63. Eigen::MatrixXi F(2,3);
  64. F<<0,1,2,
  65. 1,3,4;
  66. Eigen::MatrixXd SV;
  67. Eigen::MatrixXi SF;
  68. Eigen::VectorXi SVI;
  69. igl::split_nonmanifold(V,F,SV,SF,SVI);
  70. Eigen::MatrixXd SVgt(6,2);
  71. SVgt<<
  72. 0,0,
  73. 1,0,
  74. 1,0,
  75. 2,0,
  76. 0,1,
  77. 1,1;
  78. Eigen::MatrixXi SFgt(2,3);
  79. SFgt<<
  80. 0,2,4,
  81. 1,3,5;
  82. Eigen::VectorXi SVIgt(6);
  83. SVIgt << 0, 1, 1, 3, 2, 4;
  84. test_common::assert_eq(SV,SVgt);
  85. test_common::assert_eq(SF,SFgt);
  86. test_common::assert_eq(SVI,SVIgt);
  87. }
  88. TEST_CASE("split_nonmanifold: edge-disk-flap", "[igl]")
  89. {
  90. using namespace igl;
  91. Eigen::MatrixXd V(6,3);
  92. V<<
  93. 0,0,0,
  94. 1,0,0,
  95. 0,1,0,
  96. -1,0,0,
  97. 0,-1,0,
  98. 0,0,1;
  99. Eigen::MatrixXi F(5,3);
  100. F<<
  101. 0,1,2,
  102. 0,2,3,
  103. 0,3,4,
  104. 0,4,1,
  105. 0,5,1;
  106. Eigen::MatrixXd SV;
  107. Eigen::MatrixXi SF;
  108. Eigen::VectorXi SVI;
  109. igl::split_nonmanifold(V,F,SV,SF,SVI);
  110. Eigen::MatrixXd SVgt(8,3);
  111. SVgt<<
  112. 0,0,0,
  113. 0,0,0,
  114. 1,0,0,
  115. 0,1,0,
  116. -1,0,0,
  117. 0,-1,0,
  118. 0,0,1,
  119. 1,0,0;
  120. Eigen::MatrixXi SFgt(5,3);
  121. SFgt<<
  122. 0,2,3,
  123. 0,3,4,
  124. 0,4,5,
  125. 0,5,2,
  126. 1,6,7;
  127. Eigen::VectorXi SVIgt(8);
  128. SVIgt<< 0, 0, 1, 2, 3, 4, 5, 1;
  129. test_common::assert_eq(SV,SVgt);
  130. test_common::assert_eq(SF,SFgt);
  131. test_common::assert_eq(SVI,SVIgt);
  132. }
  133. TEST_CASE("split_nonmanifold: edge-disk-tent", "[igl]")
  134. {
  135. using namespace igl;
  136. Eigen::MatrixXd V(5,3);
  137. V<<
  138. 0,0,0,
  139. 1,0,0,
  140. -1,1,0,
  141. 0,-1,0,
  142. 0,0,1;
  143. Eigen::MatrixXi F(5,3);
  144. F<<
  145. 0,1,2,
  146. 0,2,3,
  147. 0,3,1,
  148. 0,4,1,
  149. 1,4,3;
  150. Eigen::MatrixXd SV;
  151. Eigen::MatrixXi SF;
  152. Eigen::VectorXi SVI;
  153. igl::split_nonmanifold(V,F,SV,SF,SVI);
  154. Eigen::MatrixXd SVgt(8,3);
  155. SVgt<<
  156. 0,0,0,
  157. 0,0,0,
  158. 1,0,0,
  159. 1,0,0,
  160. -1,1,0,
  161. 0,-1,0,
  162. 0,0,1,
  163. 0,-1,0;
  164. Eigen::MatrixXi SFgt(5,3);
  165. SFgt<<
  166. 0,3,4,
  167. 0,4,5,
  168. 0,5,3,
  169. 1,6,2,
  170. 2,6,7;
  171. Eigen::VectorXi SVIgt(8);
  172. SVIgt<< 0, 0, 1, 1, 2, 3, 4, 3;
  173. test_common::assert_eq(SV,SVgt);
  174. test_common::assert_eq(SF,SFgt);
  175. test_common::assert_eq(SVI,SVIgt);
  176. }
  177. TEST_CASE("split_nonmanifold: vertex-kiss", "[igl]")
  178. {
  179. using namespace igl;
  180. Eigen::MatrixXd V(7,3);
  181. V<<
  182. 0,0,0,
  183. 1,0,0,
  184. 0,1,0,
  185. 0,0,1,
  186. 0,0,2,
  187. 1,0,2,
  188. 0,1,2;
  189. Eigen::MatrixXi F(6,3);
  190. F<<
  191. 0,1,3,
  192. 1,2,3,
  193. 2,0,3,
  194. 4,5,3,
  195. 5,6,3,
  196. 6,4,3;
  197. Eigen::MatrixXd SV;
  198. Eigen::MatrixXi SF;
  199. Eigen::VectorXi SVI;
  200. igl::split_nonmanifold(V,F,SV,SF,SVI);
  201. Eigen::MatrixXd SVgt(8,3);
  202. SVgt<<
  203. 0,0,0,
  204. 1,0,0,
  205. 0,1,0,
  206. 0,0,2,
  207. 1,0,2,
  208. 0,1,2,
  209. 0,0,1,
  210. 0,0,1;
  211. Eigen::MatrixXi SFgt(6,3);
  212. SFgt<<
  213. 0,1,6,
  214. 1,2,6,
  215. 2,0,6,
  216. 3,4,7,
  217. 4,5,7,
  218. 5,3,7;
  219. Eigen::VectorXi SVIgt(8);
  220. SVIgt<< 0, 1, 2, 4, 5, 6, 3, 3;
  221. test_common::assert_eq(SV,SVgt);
  222. test_common::assert_eq(SF,SFgt);
  223. test_common::assert_eq(SVI,SVIgt);
  224. }
  225. TEST_CASE("split_nonmanifold: non-orientable", "[igl]")
  226. {
  227. using namespace igl;
  228. Eigen::MatrixXd V(6,3);
  229. V<<
  230. 6, 0, 0,
  231. 4, 0, 0,
  232. -3, 5, 0,
  233. -2, 4, 0,
  234. -2,-4, 1,
  235. -3,-5,-1;
  236. Eigen::MatrixXi F(6,3);
  237. F<<
  238. 0,2,1,
  239. 2,3,1,
  240. 2,4,3,
  241. 4,5,3,
  242. 4,1,5,
  243. 1,0,5;
  244. Eigen::MatrixXd SV;
  245. Eigen::MatrixXi SF;
  246. Eigen::VectorXi SVI;
  247. igl::split_nonmanifold(V,F,SV,SF,SVI);
  248. Eigen::MatrixXd SVgt(8,3);
  249. SVgt<<
  250. 6,0,0,
  251. -3,5,0,
  252. -2,-4,1,
  253. 4,0,0,
  254. -2,4,0,
  255. -3,-5,-1,
  256. 6,0,0,
  257. 4,0,0;
  258. Eigen::MatrixXi SFgt(6,3);
  259. SFgt<<
  260. 0,1,7,
  261. 1,4,7,
  262. 1,2,4,
  263. 2,5,4,
  264. 2,3,5,
  265. 3,6,5;
  266. Eigen::VectorXi SVIgt(8);
  267. SVIgt<< 0, 2, 4, 1, 3, 5, 0, 1;
  268. test_common::assert_eq(SV,SVgt);
  269. test_common::assert_eq(SF,SFgt);
  270. test_common::assert_eq(SVI,SVIgt);
  271. }