limit_faces.cpp 1003 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "limit_faces.h"
  2. #include <vector>
  3. #include <Eigen/Dense>
  4. template <typename MatF, typename VecL>
  5. IGL_INLINE void igl::limit_faces(
  6. const MatF & F,
  7. const VecL & L,
  8. const bool exclusive,
  9. MatF & LF)
  10. {
  11. using namespace std;
  12. using namespace Eigen;
  13. vector<bool> in(F.rows(),false);
  14. int num_in = 0;
  15. // loop over faces
  16. for(int i = 0;i<F.rows();i++)
  17. {
  18. bool all = true;
  19. bool any = false;
  20. for(int j = 0;j<F.cols();j++)
  21. {
  22. bool found = false;
  23. // loop over L
  24. for(int l = 0;l<L.size();l++)
  25. {
  26. if(F(i,j) == L(l))
  27. {
  28. found = true;
  29. break;
  30. }
  31. }
  32. any |= found;
  33. all &= found;
  34. }
  35. in[i] = (exclusive?all:any);
  36. num_in += (in[i]?1:0);
  37. }
  38. LF.resize(num_in,F.cols());
  39. // loop over faces
  40. int lfi = 0;
  41. for(int i = 0;i<F.rows();i++)
  42. {
  43. if(in[i])
  44. {
  45. LF.row(lfi) = F.row(i);
  46. lfi++;
  47. }
  48. }
  49. }
  50. #ifndef IGL_HEADER_ONLY
  51. // Explicit template specialization
  52. #endif