#include #include #include #include #include #include #include #include template IGL_INLINE void igl::polyvector_field_cut_mesh_with_singularities( const Eigen::PlainObjectBase &V, const Eigen::PlainObjectBase &F, const std::vector >& VF, const std::vector >& VV, const Eigen::PlainObjectBase& TT, const Eigen::PlainObjectBase& TTi, const Eigen::PlainObjectBase &singularities, Eigen::PlainObjectBase &cuts) { //first, get a spanning tree for the mesh (no missmatch needed) igl::cut_mesh_from_singularities(V, F, Eigen::MatrixXd::Zero(F.rows(), 3).eval(), cuts); std::set vertices_in_cut; for (int i =0; i< cuts.rows(); ++i) for (int j =0;j< cuts.cols(); ++j) if (cuts(i,j)) vertices_in_cut.insert(F(i,j)); //then, add all singularities one by one by using Dijkstra's algorithm for (int i = 0; i path; Eigen::VectorXd min_distance; Eigen::VectorXi previous; int vertex_found = igl::dijkstra_compute_paths(singularities[i], vertices_in_cut, VV, min_distance, previous); if(vertex_found ==-1) // this means that there are no cuts path.push_back(singularities[i]); else igl::dijkstra_get_shortest_path_to(vertex_found, previous, path); vertices_in_cut.insert(path.begin(), path.end()); //insert to cut for (int ii = 0; ii vf0 = VF[v0]; std::sort(vf0.begin(), vf0.end()); std::vector vf1 = VF[v1]; std::sort(vf1.begin(), vf1.end()); std::vector common_face_v(std::max(vf0.size(),vf1.size())); std::vector::iterator it; it=std::set_intersection (vf0.begin(), vf0.end(), vf1.begin(), vf1.end(), common_face_v.begin()); common_face_v.resize(it-common_face_v.begin()); assert(common_face_v.size() == 2); const int &fi = common_face_v[0]; int j=-1; for (unsigned z=0; z<3; ++z) if (((F(fi,z) == v0) && (F(fi,(z+1)%3) == v1)) ||((F(fi,z) == v1) && (F(fi,(z+1)%3) == v0))) j=z; assert(j!=-1); cuts(fi,j) = 1; cuts(TT(fi,j), TTi(fi,j)) = 1; } } } //Wrapper of the above with only vertices and faces as mesh input template IGL_INLINE void igl::polyvector_field_cut_mesh_with_singularities( const Eigen::PlainObjectBase &V, const Eigen::PlainObjectBase &F, const Eigen::PlainObjectBase &singularities, Eigen::PlainObjectBase &cuts) { std::vector > VF, VFi; igl::vertex_triangle_adjacency(V,F,VF,VFi); std::vector > VV; igl::adjacency_list(F, VV); Eigen::MatrixXi TT, TTi; igl::triangle_triangle_adjacency(F,TT,TTi); igl::polyvector_field_cut_mesh_with_singularities(V, F, VF, VV, TT, TTi, singularities, cuts); } #ifdef IGL_STATIC_LIBRARY // Explicit template specialization template void igl::polyvector_field_cut_mesh_with_singularities, Eigen::Matrix, int, int, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector >, std::allocator > > > const&, std::vector >, std::allocator > > > const&, Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase >&); template void igl::polyvector_field_cut_mesh_with_singularities, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase >&); #endif