is_manifold.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. //
  2. // IGL Lib - Simple C++ mesh library
  3. //
  4. // Copyright 2011, Daniele Panozzo. All rights reserved.
  5. #ifndef IGL_IS_MANIFOLD_H
  6. #define IGL_IS_MANIFOLD_H
  7. #include <Eigen/Core>
  8. #include <vector>
  9. namespace igl
  10. {
  11. // check if the mesh is edge-manifold
  12. //
  13. // Not clear whether this returns true or false if the mesh is disc topology
  14. //
  15. // Known Bugs:
  16. // Does not check for non-manifold vertices
  17. template<typename T>
  18. inline bool is_manifold(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F);
  19. }
  20. // Implementation
  21. #include <algorithm>
  22. template<typename T>
  23. inline bool igl::is_manifold(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F);
  24. {
  25. std::vector<std::vector<int> > TTT;
  26. for(int f=0;f<F.rows();++f)
  27. for (int i=0;i<3;++i)
  28. {
  29. // v1 v2 f ei
  30. int v1 = F(f,i);
  31. int v2 = F(f,(i+1)%3);
  32. if (v1 > v2) std::swap(v1,v2);
  33. std::vector<int> r(4);
  34. r[0] = v1; r[1] = v2;
  35. r[2] = f; r[3] = i;
  36. TTT.push_back(r);
  37. }
  38. std::sort(TTT.begin(),TTT.end());
  39. for(int i=2;i<(int)TTT.size();++i)
  40. {
  41. std::vector<int>& r1 = TTT[i-2];
  42. std::vector<int>& r2 = TTT[i-1];
  43. std::vector<int>& r3 = TTT[i];
  44. if ( (r1[0] == r2[0] && r2[0] == r3[0])
  45. &&
  46. (r1[1] == r2[1] && r2[1] == r3[1]) )
  47. {
  48. return false;
  49. }
  50. }
  51. return true;
  52. }
  53. }
  54. #endif