ismanifold.h 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. namespace igl
  10. {
  11. // check if the mesh is edge-manifold
  12. bool isManifold(Eigen::MatrixXd& V, Eigen::MatrixXd& F)
  13. {
  14. vector<vector<int> > TTT;
  15. for(int f=0;f<F.rows();++f)
  16. for (int i=0;i<3;++i)
  17. {
  18. // v1 v2 f ei
  19. int v1 = F(f,i);
  20. int v2 = F(f,(i+1)%3);
  21. if (v1 > v2) std::swap(v1,v2);
  22. vector<int> r(4);
  23. r[0] = v1; r[1] = v2;
  24. r[2] = f; r[3] = i;
  25. TTT.push_back(r);
  26. }
  27. std::sort(TTT.begin(),TTT.end());
  28. TT = MatrixXi::Constant((int)(F.rows()),3,-1);
  29. for(int i=2;i<TTT.size();++i)
  30. {
  31. vector<int>& r1 = TTT[i-2];
  32. vector<int>& r2 = TTT[i-1];
  33. 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