ismanifold.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. //
  2. // IGL Lib - Simple C++ mesh library
  3. //
  4. // Copyright 2011, Daniele Panozzo. All rights reserved.
  5. #ifndef ISMANIFOLD_H
  6. #define ISMANIFOLD_H
  7. #include <Eigen/Core>
  8. #include <string>
  9. #include <vector>
  10. namespace igl
  11. {
  12. // check if the mesh is edge-manifold
  13. template<typename T>
  14. inline bool isManifold(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F)
  15. {
  16. std::vector<std::vector<int> > TTT;
  17. for(int f=0;f<F.rows();++f)
  18. for (int i=0;i<3;++i)
  19. {
  20. // v1 v2 f ei
  21. int v1 = F(f,i);
  22. int v2 = F(f,(i+1)%3);
  23. if (v1 > v2) std::swap(v1,v2);
  24. std::vector<int> r(4);
  25. r[0] = v1; r[1] = v2;
  26. r[2] = f; r[3] = i;
  27. TTT.push_back(r);
  28. }
  29. std::sort(TTT.begin(),TTT.end());
  30. for(int i=2;i<TTT.size();++i)
  31. {
  32. std::vector<int>& r1 = TTT[i-2];
  33. std::vector<int>& r2 = TTT[i-1];
  34. std::vector<int>& r3 = TTT[i];
  35. if ( (r1[0] == r2[0] && r2[0] == r3[0])
  36. &&
  37. (r1[1] == r2[1] && r2[1] == r3[1]) )
  38. {
  39. return false;
  40. }
  41. }
  42. return true;
  43. }
  44. }
  45. #endif