ismanifold.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. bool isManifold(Eigen::MatrixXd& V, Eigen::MatrixXi& F)
  14. {
  15. std::vector<std::vector<int> > TTT;
  16. for(int f=0;f<F.rows();++f)
  17. for (int i=0;i<3;++i)
  18. {
  19. // v1 v2 f ei
  20. int v1 = F(f,i);
  21. int v2 = F(f,(i+1)%3);
  22. if (v1 > v2) std::swap(v1,v2);
  23. std::vector<int> r(4);
  24. r[0] = v1; r[1] = v2;
  25. r[2] = f; r[3] = i;
  26. TTT.push_back(r);
  27. }
  28. std::sort(TTT.begin(),TTT.end());
  29. for(int i=2;i<TTT.size();++i)
  30. {
  31. std::vector<int>& r1 = TTT[i-2];
  32. std::vector<int>& r2 = TTT[i-1];
  33. std::vector<int>& r3 = TTT[i];
  34. if ( (r1[0] == r2[0] && r2[0] == r3[0])
  35. &&
  36. (r1[1] == r2[1] && r2[1] == r3[1]) )
  37. {
  38. return false;
  39. }
  40. }
  41. return true;
  42. }
  43. }
  44. #endif