edges_to_path.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "edges_to_path.h"
  2. #include "ismember.h"
  3. #include "adjacency_list.h"
  4. template <
  5. typename DerivedE,
  6. typename DerivedI,
  7. typename DerivedJ,
  8. typename DerivedK>
  9. IGL_INLINE void igl::edges_to_path(
  10. const Eigen::MatrixBase<DerivedE> & OE,
  11. Eigen::PlainObjectBase<DerivedI> & I,
  12. Eigen::PlainObjectBase<DerivedJ> & J,
  13. Eigen::PlainObjectBase<DerivedK> & K)
  14. {
  15. assert(OE.rows()>=1);
  16. if(OE.rows() == 1)
  17. {
  18. I.resize(2);
  19. I(0) = OE(0);
  20. I(1) = OE(1);
  21. J.resize(1);
  22. J(0) = 0;
  23. K.resize(1);
  24. K(0) = 0;
  25. }
  26. // Compute on reduced graph
  27. DerivedI U;
  28. DerivedE E;
  29. {
  30. Eigen::VectorXi IA;
  31. unique(OE,U,IA,E);
  32. }
  33. Eigen::VectorXi V = Eigen::VectorXi::Zero(E.maxCoeff()+1);
  34. for(int e = 0;e<E.size();e++)
  35. {
  36. V(E(e))++;
  37. assert(V(E(e))<=2);
  38. }
  39. // Try to find a vertex with valence = 1
  40. int c = 2;
  41. int s = E(0);
  42. for(int v = 0;v<V.size();v++)
  43. {
  44. if(V(v) == 1)
  45. {
  46. c = V(v);
  47. s = v;
  48. break;
  49. }
  50. }
  51. assert(V(s) == c);
  52. assert(c == 2 || c == 1);
  53. // reshape E to be #E by 2
  54. E = Eigen::Map<DerivedE>(E.data(),OE.rows(),OE.cols()).eval();
  55. {
  56. std::vector<std::vector<int> > A;
  57. igl::adjacency_list(E,A);
  58. Eigen::VectorXi P,C;
  59. dfs(A,s,I,P,C);
  60. }
  61. if(c == 2)
  62. {
  63. I.conservativeResize(I.size()+1);
  64. I(I.size()-1) = I(I.size()-2);
  65. }
  66. DerivedE sE;
  67. Eigen::Matrix<typename DerivedI::Scalar,Eigen::Dynamic,2> sEI;
  68. {
  69. Eigen::MatrixXi _;
  70. sort(E,2,true,sE,_);
  71. Eigen::Matrix<typename DerivedI::Scalar,Eigen::Dynamic,2> EI(I.size()-1,2);
  72. EI.col(0) = I.head(I.size()-1);
  73. EI.col(1) = I.tail(I.size()-1);
  74. sort(EI,2,true,sEI,_);
  75. }
  76. {
  77. Eigen::Array<bool,Eigen::Dynamic,1> F;
  78. ismember_rows(sEI,sE,F,J);
  79. }
  80. K.resize(I.size()-1);
  81. for(int k = 0;k<K.size();k++)
  82. {
  83. K(k) = 1 + (E(J(k),0) != I(k) ? 1 : 0);
  84. }
  85. // Map vertex indices onto original graph
  86. slice(U,DerivedI(I),1,I);
  87. }