removeUnreferenced.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "removeUnreferenced.h"
  2. template <typename T, typename S>
  3. IGL_INLINE void igl::removeUnreferenced(
  4. const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &V,
  5. const Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> &F,
  6. Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &NV,
  7. Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> &NF,
  8. Eigen::Matrix<S, Eigen::Dynamic, 1> &I)
  9. {
  10. // Mark referenced vertices
  11. Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> mark = Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>::Zero(V.rows(),1);
  12. for(int i=0; i<F.rows(); ++i)
  13. {
  14. for(int j=0; j<F.cols(); ++j)
  15. {
  16. if (F(i,j) != -1)
  17. mark(F(i,j),0) = 1;
  18. }
  19. }
  20. // Sum the occupied cells
  21. int newsize = mark.sum();
  22. NV = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>(newsize,V.cols());
  23. NF = Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic>(F.rows(),F.cols());
  24. I = Eigen::Matrix<S, Eigen::Dynamic, 1>(V.rows(),1);
  25. // Do a pass on the marked vector and remove the unreferenced vertices
  26. int count = 0;
  27. for(int i=0;i<mark.rows();++i)
  28. {
  29. if (mark(i) == 1)
  30. {
  31. NV.row(count) = V.row(i);
  32. I(i) = count;
  33. count++;
  34. }
  35. else
  36. {
  37. I(i) = -1;
  38. }
  39. }
  40. // Apply I on F
  41. count = 0;
  42. for (int i =0; i<F.rows(); ++i)
  43. {
  44. int v0 = I[F(i,0)];
  45. int v1 = I[F(i,1)];
  46. int v2 = I[F(i,2)];
  47. if ( (v0 != v1) && (v2 != v1) && (v0 != v2) )
  48. NF.row(count++) << v0, v1, v2;
  49. }
  50. }
  51. #ifndef IGL_HEADER_ONLY
  52. // Explicit template specialization
  53. #endif