tt.cpp 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "tt.h"
  2. #include "is_manifold.h"
  3. #include <algorithm>
  4. template<typename T, typename S>
  5. IGL_INLINE void igl::tt_preprocess(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>& 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. template<typename S>
  23. IGL_INLINE void igl::tt_extractTT(const Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>& F, std::vector<std::vector<int> >& TTT, Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>& TT)
  24. {
  25. TT = Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>::Constant((int)(F.rows()),3,-1);
  26. for(int i=1;i<(int)TTT.size();++i)
  27. {
  28. std::vector<int>& r1 = TTT[i-1];
  29. std::vector<int>& r2 = TTT[i];
  30. if ((r1[0] == r2[0]) && (r1[1] == r2[1]))
  31. {
  32. TT(r1[2],r1[3]) = r2[2];
  33. TT(r2[2],r2[3]) = r1[2];
  34. }
  35. }
  36. }
  37. // Extract the face adjacencies indices (needed for fast traversal)
  38. template<typename S>
  39. IGL_INLINE void igl::tt_extractTTi(const Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>& F, std::vector<std::vector<int> >& TTT, Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>& TTi)
  40. {
  41. TTi = Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>::Constant((int)(F.rows()),3,-1);
  42. for(int i=1;i<(int)TTT.size();++i)
  43. {
  44. std::vector<int>& r1 = TTT[i-1];
  45. std::vector<int>& r2 = TTT[i];
  46. if ((r1[0] == r2[0]) && (r1[1] == r2[1]))
  47. {
  48. TTi(r1[2],r1[3]) = r2[3];
  49. TTi(r2[2],r2[3]) = r1[3];
  50. }
  51. }
  52. }
  53. // Compute triangle-triangle adjacency
  54. template<typename T, typename S>
  55. IGL_INLINE void igl::tt(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>& F, Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>& TT)
  56. {
  57. assert(igl::is_manifold(V,F));
  58. std::vector<std::vector<int> > TTT;
  59. tt_preprocess<T>(V,F,TTT);
  60. tt_extractTT(F,TTT,TT);
  61. }
  62. // Compute triangle-triangle adjacency with indices
  63. template<typename T, typename S>
  64. IGL_INLINE void igl::tt(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& V, const Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>& F, Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>& TT, Eigen::Matrix<S,Eigen::Dynamic, Eigen::Dynamic>& TTi)
  65. {
  66. assert(igl::is_manifold(V,F));
  67. std::vector<std::vector<int> > TTT;
  68. tt_preprocess<T>(V,F,TTT);
  69. tt_extractTT(F,TTT,TT);
  70. tt_extractTTi(F,TTT,TTi);
  71. }
  72. #ifndef IGL_HEADER_ONLY
  73. // Explicit template specialization
  74. // generated by autoexplicit.sh
  75. 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>&);
  76. template void igl::tt<double, int>(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>&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&);
  77. #endif