removeDuplicates.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "removeDuplicates.h"
  2. #include <vector>
  3. template <typename T>
  4. IGL_INLINE void igl::removeDuplicates(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, const double epsilon)
  5. {
  6. using namespace std;
  7. //// build collapse map
  8. int n = V.rows();
  9. I = Eigen::VectorXi (n);
  10. I[0] = 0;
  11. bool *VISITED = new bool[n];
  12. for (int i =0; i <n; ++i)
  13. VISITED[i] = false;
  14. NV = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>(n,V.cols());
  15. int count = 0;
  16. Eigen::VectorXd d(n);
  17. for (int i =0; i <n; ++i)
  18. {
  19. if(!VISITED[i])
  20. {
  21. NV.row(count) = V.row(i);
  22. I[i] = count;
  23. VISITED[i] = true;
  24. for (int j = i+1; j <n; ++j)
  25. {
  26. if((V.row(j) - V.row(i)).norm() < epsilon)
  27. {
  28. VISITED[j] = true;
  29. I[j] = count;
  30. }
  31. }
  32. count ++;
  33. }
  34. }
  35. NV.conservativeResize ( count , Eigen::NoChange );
  36. count = 0;
  37. std::vector<int> face;
  38. NF = Eigen::MatrixXi(F.rows(),F.cols());
  39. for (int i =0; i <F.rows(); ++i)
  40. {
  41. face.clear();
  42. for (int j = 0; j< F.cols(); ++j)
  43. if(std::find(face.begin(), face.end(), I[F(i,j)]) == face.end())
  44. face.push_back(I[F(i,j)]);
  45. if (face.size() == F.cols())
  46. {
  47. for (int j = 0; j< F.cols(); ++j)
  48. NF(count,j) = face[j];
  49. count ++;
  50. }
  51. }
  52. NF.conservativeResize ( count , Eigen::NoChange );
  53. delete [] VISITED;
  54. }
  55. #ifndef IGL_HEADER_ONLY
  56. // Explicit template specialization
  57. #endif