tt.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //
  2. // IGL Lib - Simple C++ mesh library
  3. //
  4. // Copyright 2011, Daniele Panozzo. All rights reserved.
  5. #ifndef TT_H
  6. #define TT_H
  7. #include <Eigen/Core>
  8. #include <string>
  9. #include <ismanifold.h>
  10. #include <vector>
  11. namespace igl
  12. {
  13. // Preprocessing
  14. inline void tt_preprocess(const Eigen::MatrixXd& V, const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT)
  15. {
  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. }
  30. // Extract the face adjacencies
  31. inline void tt_extractTT(const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT, Eigen::MatrixXi& TT)
  32. {
  33. TT = Eigen::MatrixXi::Constant((int)(F.rows()),3,-1);
  34. for(int i=1;i<TTT.size();++i)
  35. {
  36. std::vector<int>& r1 = TTT[i-1];
  37. std::vector<int>& r2 = TTT[i];
  38. if ((r1[0] == r2[0]) && (r1[1] == r2[1]))
  39. {
  40. TT(r1[2],r1[3]) = r2[2];
  41. TT(r2[2],r2[3]) = r1[2];
  42. }
  43. }
  44. }
  45. // Extract the face adjacencies indices (needed for fast traversal)
  46. inline void tt_extractTTi(const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT, Eigen::MatrixXi& TTi)
  47. {
  48. TTi = Eigen::MatrixXi::Constant((int)(F.rows()),3,-1);
  49. for(int i=1;i<TTT.size();++i)
  50. {
  51. std::vector<int>& r1 = TTT[i-1];
  52. std::vector<int>& r2 = TTT[i];
  53. if ((r1[0] == r2[0]) && (r1[1] == r2[1]))
  54. {
  55. TTi(r1[2],r1[3]) = r2[3];
  56. TTi(r2[2],r2[3]) = r1[3];
  57. }
  58. }
  59. }
  60. // Compute triangle-triangle adjacency
  61. inline void tt(const Eigen::MatrixXd& V, const Eigen::MatrixXi& F, Eigen::MatrixXi& TT)
  62. {
  63. assert(igl::isManifold(V,F));
  64. std::vector<std::vector<int> > TTT;
  65. tt_preprocess(V,F,TTT);
  66. tt_extractTT(F,TTT,TT);
  67. }
  68. // Compute triangle-triangle adjacency with indices
  69. inline void tt(const Eigen::MatrixXd& V, const Eigen::MatrixXi& F, Eigen::MatrixXi& TT, Eigen::MatrixXi& TTi)
  70. {
  71. assert(igl::isManifold(V,F));
  72. std::vector<std::vector<int> > TTT;
  73. tt_preprocess(V,F,TTT);
  74. tt_extractTT(F,TTT,TT);
  75. tt_extractTTi(F,TTT,TTi);
  76. }
  77. }
  78. #endif