// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2015 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 "collapse_edge.h" #include "circulation.h" #include "edge_collapse_is_valid.h" #include template < typename Derivedp, typename DerivedV, typename DerivedF, typename DerivedE, typename DerivedEMAP, typename DerivedEF, typename DerivedEI> IGL_INLINE bool igl::collapse_edge( const int e, const Eigen::MatrixBase & p, Eigen::MatrixBase & V, Eigen::MatrixBase & F, Eigen::MatrixBase & E, Eigen::MatrixBase & EMAP, Eigen::MatrixBase & EF, Eigen::MatrixBase & EI, int & e1, int & e2, int & f1, int & f2) { std::vector /*Nse,*/Nsf,Nsv; circulation(e, true,F,EMAP,EF,EI,/*Nse,*/Nsv,Nsf); std::vector /*Nde,*/Ndf,Ndv; circulation(e, false,F,EMAP,EF,EI,/*Nde,*/Ndv,Ndf); return collapse_edge( e,p,Nsv,Nsf,Ndv,Ndf,V,F,E,EMAP,EF,EI,e1,e2,f1,f2); } template < typename Derivedp, typename DerivedV, typename DerivedF, typename DerivedE, typename DerivedEMAP, typename DerivedEF, typename DerivedEI> IGL_INLINE bool igl::collapse_edge( const int e, const Eigen::MatrixBase & p, /*const*/ std::vector & Nsv, const std::vector & Nsf, /*const*/ std::vector & Ndv, const std::vector & Ndf, Eigen::MatrixBase & V, Eigen::MatrixBase & F, Eigen::MatrixBase & E, Eigen::MatrixBase & EMAP, Eigen::MatrixBase & EF, Eigen::MatrixBase & EI, int & a_e1, int & a_e2, int & a_f1, int & a_f2) { // Assign this to 0 rather than, say, -1 so that deleted elements will get // draw as degenerate elements at vertex 0 (which should always exist and // never get collapsed to anything else since it is the smallest index) const int eflip = E(e,0)>E(e,1); // source and destination const int s = eflip?E(e,1):E(e,0); const int d = eflip?E(e,0):E(e,1); if(!edge_collapse_is_valid(Nsv,Ndv)) { return false; } // OVERLOAD: caller may have just computed this // // Important to grab neighbors of d before monkeying with edges const std::vector & nV2Fd = (!eflip ? Nsf : Ndf); // The following implementation strongly relies on s, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix>(int, Eigen::MatrixBase> const&, Eigen::MatrixBase>&, Eigen::MatrixBase>&, Eigen::MatrixBase>&, Eigen::MatrixBase>&, Eigen::MatrixBase>&, Eigen::MatrixBase>&, int&, int&, int&, int&); template bool igl::collapse_edge, 1, -1, false>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix>(int, Eigen::MatrixBase, 1, -1, false>> const&, std::vector>&, std::vector> const&, std::vector>&, std::vector> const&, Eigen::MatrixBase>&, Eigen::MatrixBase>&, Eigen::MatrixBase>&, Eigen::MatrixBase>&, Eigen::MatrixBase>&, Eigen::MatrixBase>&, int&, int&, int&, int&); #endif