// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2016 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #include #include #include #include #include #include #include template void igl::polyvector_field_one_ring_matchings(const Eigen::PlainObjectBase &V, const Eigen::PlainObjectBase &F, const std::vector >& VF, const Eigen::MatrixXi& E2F, const Eigen::MatrixXi& F2E, const Eigen::PlainObjectBase& TT, const Eigen::PlainObjectBase &match_ab, const Eigen::PlainObjectBase &match_ba, const int vi, Eigen::MatrixXi &mvi, Eigen::VectorXi &fi) { int half_degree = match_ab.cols(); mvi.resize(VF[vi].size()+1,half_degree); fi.resize(VF[vi].size()+1,1); //start from one face //first, check if the vertex is on a boundary //then there must be two faces that are on the boundary //(other cases not supported) int fstart = -1; int ind = 0; for (int i =0; i1 ) { std::cerr<<"igl::polyvector_field_one_ring_matchings -- vertex "<=half_degree) mvi(i,k) = (mvi(i,k)+half_degree)%(2*half_degree); } } current_face = next_face; fi[i] = current_face; } } template IGL_INLINE void igl::polyvector_field_singularities_from_matchings( const Eigen::PlainObjectBase &V, const Eigen::PlainObjectBase &F, const Eigen::PlainObjectBase &match_ab, const Eigen::PlainObjectBase &match_ba, Eigen::PlainObjectBase &singularities) { std::vector V_border = igl::is_border_vertex(V,F); std::vector > VF, VFi; igl::vertex_triangle_adjacency(V,F,VF,VFi); Eigen::MatrixXi TT, TTi; igl::triangle_triangle_adjacency(F,TT,TTi); Eigen::MatrixXi E, E2F, F2E; igl::edge_topology(V,F,E,F2E,E2F); igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities); } template IGL_INLINE void igl::polyvector_field_singularities_from_matchings( const Eigen::PlainObjectBase &V, const Eigen::PlainObjectBase &F, const std::vector &V_border, const std::vector > &VF, const Eigen::MatrixXi &TT, const Eigen::MatrixXi &E2F, const Eigen::MatrixXi &F2E, const Eigen::PlainObjectBase &match_ab, const Eigen::PlainObjectBase &match_ba, Eigen::PlainObjectBase &singularities) { int numV = V.rows(); std::vector singularities_v; int half_degree = match_ab.cols(); for (int vi =0; vi IGL_INLINE void igl::polyvector_field_singularities_from_matchings( const Eigen::PlainObjectBase &V, const Eigen::PlainObjectBase &F, const Eigen::PlainObjectBase &match_ab, const Eigen::PlainObjectBase &match_ba, Eigen::PlainObjectBase &singularities, Eigen::PlainObjectBase &singularity_indices) { std::vector V_border = igl::is_border_vertex(V,F); std::vector > VF, VFi; igl::vertex_triangle_adjacency(V,F,VF,VFi); Eigen::MatrixXi TT, TTi; igl::triangle_triangle_adjacency(V,F,TT,TTi); Eigen::MatrixXi E, E2F, F2E; igl::edge_topology(V,F,E,F2E,E2F); igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities, singularity_indices); } template IGL_INLINE void igl::polyvector_field_singularities_from_matchings( const Eigen::PlainObjectBase &V, const Eigen::PlainObjectBase &F, const std::vector &V_border, const std::vector > &VF, const Eigen::MatrixXi &TT, const Eigen::MatrixXi &E2F, const Eigen::MatrixXi &F2E, const Eigen::PlainObjectBase &match_ab, const Eigen::PlainObjectBase &match_ba, Eigen::PlainObjectBase &singularities, Eigen::PlainObjectBase &singularity_indices) { igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities); singularity_indices.setZero(singularities.size(), 1); //get index from first vector only int vector_to_match = 0; for (int i =0; i, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase >&); #endif