tt.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. template<typename T>
  15. inline void tt_preprocess(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT)
  16. {
  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. }
  31. // Extract the face adjacencies
  32. inline void tt_extractTT(const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT, Eigen::MatrixXi& TT)
  33. {
  34. TT = Eigen::MatrixXi::Constant((int)(F.rows()),3,-1);
  35. for(int i=1;i<TTT.size();++i)
  36. {
  37. std::vector<int>& r1 = TTT[i-1];
  38. std::vector<int>& r2 = TTT[i];
  39. if ((r1[0] == r2[0]) && (r1[1] == r2[1]))
  40. {
  41. TT(r1[2],r1[3]) = r2[2];
  42. TT(r2[2],r2[3]) = r1[2];
  43. }
  44. }
  45. }
  46. // Extract the face adjacencies indices (needed for fast traversal)
  47. inline void tt_extractTTi(const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT, Eigen::MatrixXi& TTi)
  48. {
  49. TTi = Eigen::MatrixXi::Constant((int)(F.rows()),3,-1);
  50. for(int i=1;i<TTT.size();++i)
  51. {
  52. std::vector<int>& r1 = TTT[i-1];
  53. std::vector<int>& r2 = TTT[i];
  54. if ((r1[0] == r2[0]) && (r1[1] == r2[1]))
  55. {
  56. TTi(r1[2],r1[3]) = r2[3];
  57. TTi(r2[2],r2[3]) = r1[3];
  58. }
  59. }
  60. }
  61. // Compute triangle-triangle adjacency
  62. template<typename T>
  63. inline void tt(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, Eigen::MatrixXi& TT)
  64. {
  65. assert(igl::isManifold(V,F));
  66. std::vector<std::vector<int> > TTT;
  67. tt_preprocess<T>(V,F,TTT);
  68. tt_extractTT(F,TTT,TT);
  69. }
  70. // Compute triangle-triangle adjacency with indices
  71. template<typename T>
  72. inline void tt(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, Eigen::MatrixXi& TT, Eigen::MatrixXi& TTi)
  73. {
  74. assert(igl::isManifold(V,F));
  75. std::vector<std::vector<int> > TTT;
  76. tt_preprocess<T>(V,F,TTT);
  77. tt_extractTT(F,TTT,TT);
  78. tt_extractTTi(F,TTT,TTi);
  79. }
  80. }
  81. #endif