boundary_faces.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "boundary_faces.h"
  2. #include "face_occurences.h"
  3. // IGL includes
  4. #include "sort.h"
  5. // STL includes
  6. #include <map>
  7. #include <iostream>
  8. template <typename IntegerT, typename IntegerF>
  9. IGL_INLINE void igl::boundary_faces(
  10. const std::vector<std::vector<IntegerT> > & T,
  11. std::vector<std::vector<IntegerF> > & F)
  12. {
  13. using namespace std;
  14. using namespace igl;
  15. // Get a list of all faces
  16. vector<vector<IntegerF> > allF(T.size()*4,vector<IntegerF>(3));
  17. // Gather faces, loop over tets
  18. for(int i = 0; i< (int)T.size();i++)
  19. {
  20. assert(T[i].size() == 4);
  21. // get face in correct order
  22. allF[i*4+0][0] = T[i][1];
  23. allF[i*4+0][1] = T[i][3];
  24. allF[i*4+0][2] = T[i][2];
  25. // get face in correct order
  26. allF[i*4+1][0] = T[i][0];
  27. allF[i*4+1][1] = T[i][2];
  28. allF[i*4+1][2] = T[i][3];
  29. // get face in correct order
  30. allF[i*4+2][0] = T[i][0];
  31. allF[i*4+2][1] = T[i][3];
  32. allF[i*4+2][2] = T[i][1];
  33. // get face in correct order
  34. allF[i*4+3][0] = T[i][0];
  35. allF[i*4+3][1] = T[i][1];
  36. allF[i*4+3][2] = T[i][2];
  37. }
  38. // Counts
  39. vector<int> C;
  40. face_occurences(allF,C);
  41. int twos = (int) count(C.begin(),C.end(),2);
  42. // Resize output to fit number of ones
  43. F.resize(allF.size() - twos);
  44. int k = 0;
  45. for(int i = 0;i< (int)allF.size();i++)
  46. {
  47. if(C[i] == 1)
  48. {
  49. assert(k<(int)F.size());
  50. F[k] = allF[i];
  51. k++;
  52. }
  53. }
  54. }
  55. #ifndef IGL_NO_EIGEN
  56. #include "list_to_matrix.h"
  57. #include "matrix_to_list.h"
  58. template <typename DerivedT, typename DerivedF>
  59. IGL_INLINE void igl::boundary_faces(
  60. const Eigen::PlainObjectBase<DerivedT>& T,
  61. Eigen::PlainObjectBase<DerivedF>& F)
  62. {
  63. assert(T.cols() == 0 || T.cols() == 4);
  64. using namespace std;
  65. using namespace Eigen;
  66. using namespace igl;
  67. // Cop out: use vector of vectors version
  68. vector<vector<typename Eigen::PlainObjectBase<DerivedT>::Scalar> > vT;
  69. matrix_to_list(T,vT);
  70. vector<vector<typename Eigen::PlainObjectBase<DerivedF>::Scalar> > vF;
  71. boundary_faces(vT,vF);
  72. list_to_matrix(vF,F);
  73. }
  74. #endif
  75. #ifndef IGL_HEADER_ONLY
  76. // Explicit template specialization
  77. template void igl::boundary_faces<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
  78. #endif