removeDuplicates.cpp 1.9 KB

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