#include "outer_facet.h" #include "sort.h" #include "vertex_triangle_adjacency.h" template < typename DerivedV, typename DerivedF, typename DerivedN, typename DerivedI, typename f_type> IGL_INLINE void igl::outer_facet( const Eigen::PlainObjectBase & V, const Eigen::PlainObjectBase & F, const Eigen::PlainObjectBase & N, const Eigen::PlainObjectBase & I, f_type & max_f, bool & flip) { using namespace std; typedef typename DerivedV::Scalar Scalar; typedef typename DerivedV::Index Index; typedef typename Eigen::Matrix VectorXI; typedef typename Eigen::Matrix VectorXS; // "Direct repair of self-intersecting meshes" [Attene 14] const Index mi = I.size(); Scalar max_x = -1e26; Index max_v = -1; Scalar max_nx = -1e26; for(Index i = 0;i0) { for(Index c = 0;c<3;c++) { const Index v = F(f,c); if(v == max_v) { if(fabs(nx) > max_nx) { // Just update max face and normal max_f = f; max_nx = fabs(nx); flip = nx<0; } }else { const Scalar x = V(v); if(x>max_x) { // update max vertex, face and normal max_v = v; max_x = x; max_f = f; max_nx = fabs(nx); flip = nx<0; } } } } } assert(max_v >=0 && "Very degenerate case, no suitable face found."); } #ifdef IGL_STATIC_LIBRARY // Explicit template specialization template void igl::outer_facet, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, int>(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, int&, bool&); #endif