faces_first.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "faces_first.h"
  2. #include <vector>
  3. #include <Eigen/Dense>
  4. template <typename MatV, typename MatF, typename VecI>
  5. IGL_INLINE void igl::faces_first(
  6. const MatV & V,
  7. const MatF & F,
  8. MatV & RV,
  9. MatF & RF,
  10. VecI & IM)
  11. {
  12. using namespace std;
  13. using namespace Eigen;
  14. vector<bool> in_face(V.rows());
  15. for(int i = 0; i<F.rows(); i++)
  16. {
  17. for(int j = 0; j<F.cols(); j++)
  18. {
  19. in_face[F(i,j)] = true;
  20. }
  21. }
  22. // count number of vertices not in faces
  23. int num_in_F = 0;
  24. for(int i = 0;i<V.rows();i++)
  25. {
  26. num_in_F += (in_face[i]?1:0);
  27. }
  28. // list of unique vertices that occur in F
  29. VectorXi U(num_in_F);
  30. // list of unique vertices that do not occur in F
  31. VectorXi NU(V.rows()-num_in_F);
  32. int Ui = 0;
  33. int NUi = 0;
  34. // loop over vertices
  35. for(int i = 0;i<V.rows();i++)
  36. {
  37. if(in_face[i])
  38. {
  39. U(Ui) = i;
  40. Ui++;
  41. }else
  42. {
  43. NU(NUi) = i;
  44. NUi++;
  45. }
  46. }
  47. IM.resize(V.rows());
  48. // reindex vertices that occur in faces to be first
  49. for(int i = 0;i<U.size();i++)
  50. {
  51. IM(U(i)) = i;
  52. }
  53. // reindex vertices that do not occur in faces to come after those that do
  54. for(int i = 0;i<NU.size();i++)
  55. {
  56. IM(NU(i)) = i+U.size();
  57. }
  58. RF.resize(F.rows(),F.cols());
  59. // Reindex faces
  60. for(int i = 0; i<F.rows(); i++)
  61. {
  62. for(int j = 0; j<F.cols(); j++)
  63. {
  64. RF(i,j) = IM(F(i,j));
  65. }
  66. }
  67. RV.resize(V.rows(),V.cols());
  68. // Reorder vertices
  69. for(int i = 0;i<V.rows();i++)
  70. {
  71. RV.row(IM(i)) = V.row(i);
  72. }
  73. }
  74. #ifndef IGL_HEADER_ONLY
  75. // Explicit template specialization
  76. #endif