#include "edges_to_path.h" #include "dfs.h" #include "sort.h" #include "slice.h" #include "ismember.h" #include "unique.h" #include "adjacency_list.h" template < typename DerivedE, typename DerivedI, typename DerivedJ, typename DerivedK> IGL_INLINE void igl::edges_to_path( const Eigen::MatrixBase & OE, Eigen::PlainObjectBase & I, Eigen::PlainObjectBase & J, Eigen::PlainObjectBase & K) { assert(OE.rows()>=1); if(OE.rows() == 1) { I.resize(2); I(0) = OE(0); I(1) = OE(1); J.resize(1); J(0) = 0; K.resize(1); K(0) = 0; } // Compute on reduced graph DerivedI U; Eigen::VectorXi vE; { Eigen::VectorXi IA; unique(OE,U,IA,vE); } Eigen::VectorXi V = Eigen::VectorXi::Zero(vE.maxCoeff()+1); for(int e = 0;e(vE.data(),OE.rows(),OE.cols()).eval(); { std::vector > A; igl::adjacency_list(E,A); Eigen::VectorXi P,C; dfs(A,s,I,P,C); } if(c == 2) { I.conservativeResize(I.size()+1); I(I.size()-1) = I(0); } DerivedE sE; Eigen::Matrix sEI; { Eigen::MatrixXi _; sort(E,2,true,sE,_); Eigen::Matrix EI(I.size()-1,2); EI.col(0) = I.head(I.size()-1); EI.col(1) = I.tail(I.size()-1); sort(EI,2,true,sEI,_); } { Eigen::Array F; ismember_rows(sEI,sE,F,J); } K.resize(I.size()-1); for(int k = 0;k, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); #endif