removeUnreferenced.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. // Why is this also removing combinatorially degenerate faces?
  42. count = 0;
  43. for (int i =0; i<F.rows(); ++i)
  44. {
  45. int v0 = I[F(i,0)];
  46. int v1 = I[F(i,1)];
  47. int v2 = I[F(i,2)];
  48. if ( (v0 != v1) && (v2 != v1) && (v0 != v2) )
  49. NF.row(count++) << v0, v1, v2;
  50. }
  51. }
  52. #ifndef IGL_HEADER_ONLY
  53. // Explicit template specialization
  54. #endif