removeUnreferenced.cpp 1.3 KB

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