tt.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "tt.h"
  2. #include "is_manifold.h"
  3. #include <algorithm>
  4. template<typename T>
  5. IGL_INLINE void igl::tt_preprocess(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT)
  6. {
  7. for(int f=0;f<F.rows();++f)
  8. for (int i=0;i<3;++i)
  9. {
  10. // v1 v2 f ei
  11. int v1 = F(f,i);
  12. int v2 = F(f,(i+1)%3);
  13. if (v1 > v2) std::swap(v1,v2);
  14. std::vector<int> r(4);
  15. r[0] = v1; r[1] = v2;
  16. r[2] = f; r[3] = i;
  17. TTT.push_back(r);
  18. }
  19. std::sort(TTT.begin(),TTT.end());
  20. }
  21. // Extract the face adjacencies
  22. IGL_INLINE void igl::tt_extractTT(const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT, Eigen::MatrixXi& TT)
  23. {
  24. TT = Eigen::MatrixXi::Constant((int)(F.rows()),3,-1);
  25. for(int i=1;i<(int)TTT.size();++i)
  26. {
  27. std::vector<int>& r1 = TTT[i-1];
  28. std::vector<int>& r2 = TTT[i];
  29. if ((r1[0] == r2[0]) && (r1[1] == r2[1]))
  30. {
  31. TT(r1[2],r1[3]) = r2[2];
  32. TT(r2[2],r2[3]) = r1[2];
  33. }
  34. }
  35. }
  36. // Extract the face adjacencies indices (needed for fast traversal)
  37. IGL_INLINE void igl::tt_extractTTi(const Eigen::MatrixXi& F, std::vector<std::vector<int> >& TTT, Eigen::MatrixXi& TTi)
  38. {
  39. TTi = Eigen::MatrixXi::Constant((int)(F.rows()),3,-1);
  40. for(int i=1;i<(int)TTT.size();++i)
  41. {
  42. std::vector<int>& r1 = TTT[i-1];
  43. std::vector<int>& r2 = TTT[i];
  44. if ((r1[0] == r2[0]) && (r1[1] == r2[1]))
  45. {
  46. TTi(r1[2],r1[3]) = r2[3];
  47. TTi(r2[2],r2[3]) = r1[3];
  48. }
  49. }
  50. }
  51. // Compute triangle-triangle adjacency
  52. template<typename T>
  53. IGL_INLINE void igl::tt(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, Eigen::MatrixXi& TT)
  54. {
  55. assert(igl::is_manifold(V,F));
  56. std::vector<std::vector<int> > TTT;
  57. tt_preprocess<T>(V,F,TTT);
  58. tt_extractTT(F,TTT,TT);
  59. }
  60. // Compute triangle-triangle adjacency with indices
  61. template<typename T>
  62. IGL_INLINE void igl::tt(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::MatrixXi& F, Eigen::MatrixXi& TT, Eigen::MatrixXi& TTi)
  63. {
  64. assert(igl::is_manifold(V,F));
  65. std::vector<std::vector<int> > TTT;
  66. tt_preprocess<T>(V,F,TTT);
  67. tt_extractTT(F,TTT,TT);
  68. tt_extractTTi(F,TTT,TTi);
  69. }
  70. #ifndef IGL_HEADER_ONLY
  71. // Explicit template specialization
  72. // generated by autoexplicit.sh
  73. template void igl::tt<double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&);
  74. #endif