tt.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. //
  2. // IGL Lib - Simple C++ mesh library
  3. //
  4. // Copyright 2011, Daniele Panozzo. All rights reserved.
  5. #ifndef IGL_TT_H
  6. #define IGL_TT_H
  7. #include <Eigen/Core>
  8. #include <vector>
  9. namespace igl
  10. {
  11. // Preprocessing
  12. template<typename T>
  13. inline void tt_preprocess(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT);
  14. // Extract the face adjacencies
  15. inline void tt_extractTT(const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT, Eigen::MatrixXi& TT);
  16. // Extract the face adjacencies indices (needed for fast traversal)
  17. inline void tt_extractTTi(const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT, Eigen::MatrixXi& TTi);
  18. // Compute triangle-triangle adjacency
  19. template<typename T>
  20. inline void tt(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, Eigen::MatrixXi& TT);
  21. // Compute triangle-triangle adjacency with indices
  22. template<typename T>
  23. inline void tt(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, Eigen::MatrixXi& TT, Eigen::MatrixXi& TTi);
  24. }
  25. // Implementation
  26. #include "is_manifold.h"
  27. #include <algorithm>
  28. template<typename T>
  29. inline void igl::tt_preprocess(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT)
  30. {
  31. for(int f=0;f<F.rows();++f)
  32. for (int i=0;i<3;++i)
  33. {
  34. // v1 v2 f ei
  35. int v1 = F(f,i);
  36. int v2 = F(f,(i+1)%3);
  37. if (v1 > v2) std::swap(v1,v2);
  38. std::vector<int> r(4);
  39. r[0] = v1; r[1] = v2;
  40. r[2] = f; r[3] = i;
  41. TTT.push_back(r);
  42. }
  43. std::sort(TTT.begin(),TTT.end());
  44. }
  45. // Extract the face adjacencies
  46. inline void igl::tt_extractTT(const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT, Eigen::MatrixXi& TT)
  47. {
  48. TT = Eigen::MatrixXi::Constant((int)(F.rows()),3,-1);
  49. for(int i=1;i<(int)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. TT(r1[2],r1[3]) = r2[2];
  56. TT(r2[2],r2[3]) = r1[2];
  57. }
  58. }
  59. }
  60. // Extract the face adjacencies indices (needed for fast traversal)
  61. inline void igl::tt_extractTTi(const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT, Eigen::MatrixXi& TTi)
  62. {
  63. TTi = Eigen::MatrixXi::Constant((int)(F.rows()),3,-1);
  64. for(int i=1;i<(int)TTT.size();++i)
  65. {
  66. std::vector<int>& r1 = TTT[i-1];
  67. std::vector<int>& r2 = TTT[i];
  68. if ((r1[0] == r2[0]) && (r1[1] == r2[1]))
  69. {
  70. TTi(r1[2],r1[3]) = r2[3];
  71. TTi(r2[2],r2[3]) = r1[3];
  72. }
  73. }
  74. }
  75. // Compute triangle-triangle adjacency
  76. template<typename T>
  77. inline void igl::tt(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, Eigen::MatrixXi& TT)
  78. {
  79. assert(igl::is_manifold(V,F));
  80. std::vector<std::vector<int> > TTT;
  81. tt_preprocess<T>(V,F,TTT);
  82. tt_extractTT(F,TTT,TT);
  83. }
  84. // Compute triangle-triangle adjacency with indices
  85. template<typename T>
  86. inline void igl::tt(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, Eigen::MatrixXi& TT, Eigen::MatrixXi& TTi)
  87. {
  88. assert(igl::is_manifold(V,F));
  89. std::vector<std::vector<int> > TTT;
  90. tt_preprocess<T>(V,F,TTT);
  91. tt_extractTT(F,TTT,TT);
  92. tt_extractTTi(F,TTT,TTi);
  93. }
  94. #endif