// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2015 Qingnan Zhou // // 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 "remesh_intersections.h" #include "assign_scalar.h" #include #include #include #include template < typename DerivedV, typename DerivedF, typename Kernel, typename DerivedVV, typename DerivedFF, typename DerivedJ, typename DerivedIM> IGL_INLINE void igl::copyleft::cgal::remesh_intersections( const Eigen::PlainObjectBase & V, const Eigen::PlainObjectBase & F, const std::vector > & T, const std::map< typename DerivedF::Index, std::pair > > & offending, const std::map< std::pair, std::vector > & /*edge2faces*/, Eigen::PlainObjectBase & VV, Eigen::PlainObjectBase & FF, Eigen::PlainObjectBase & J, Eigen::PlainObjectBase & IM) { typedef CGAL::Point_3 Point_3; typedef CGAL::Segment_3 Segment_3; typedef CGAL::Triangle_3 Triangle_3; typedef CGAL::Plane_3 Plane_3; //typedef CGAL::Point_2 Point_2; //typedef CGAL::Segment_2 Segment_2; //typedef CGAL::Triangle_2 Triangle_2; typedef CGAL::Triangulation_vertex_base_2 TVB_2; typedef CGAL::Constrained_triangulation_face_base_2 CTFB_2; typedef CGAL::Triangulation_data_structure_2 TDS_2; typedef CGAL::Exact_intersections_tag Itag; typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_2; typedef CGAL::Constrained_triangulation_plus_2 CDT_plus_2; typedef typename DerivedF::Index Index; typedef std::pair Edge; struct EdgeHash { size_t operator()(const Edge& e) const { return (e.first * 805306457) ^ (e.second * 201326611); } }; typedef std::unordered_map, EdgeHash > EdgeMap; auto normalize_plane_coeff = [](const Plane_3& P) { std::vector coeffs = { P.a(), P.b(), P.c(), P.d() }; const auto max_itr = std::max_element(coeffs.begin(), coeffs.end()); const auto min_itr = std::min_element(coeffs.begin(), coeffs.end()); typename Kernel::FT max_coeff; if (*max_itr < -1 * *min_itr) { max_coeff = *min_itr; } else { max_coeff = *max_itr; } std::transform(coeffs.begin(), coeffs.end(), coeffs.begin(), [&](const typename Kernel::FT& val) {return val / max_coeff; } ); return coeffs; }; auto plane_comp = [&](const Plane_3& p1, const Plane_3& p2) { const auto p1_coeffs = normalize_plane_coeff(p1); const auto p2_coeffs = normalize_plane_coeff(p2); if (p1_coeffs[0] != p2_coeffs[0]) return p1_coeffs[0] < p2_coeffs[0]; if (p1_coeffs[1] != p2_coeffs[1]) return p1_coeffs[1] < p2_coeffs[1]; if (p1_coeffs[2] != p2_coeffs[2]) return p1_coeffs[2] < p2_coeffs[2]; if (p1_coeffs[3] != p2_coeffs[3]) return p1_coeffs[3] < p2_coeffs[3]; return false; }; std::map, decltype(plane_comp)> unique_planes(plane_comp); const size_t num_faces = F.rows(); const size_t num_base_vertices = V.rows(); assert(num_faces == T.size()); std::vector is_offending(num_faces, false); for (const auto itr : offending) { const auto& fid = itr.first; is_offending[fid] = true; Plane_3 key = T[fid].supporting_plane(); assert(!key.is_degenerate()); const auto jtr = unique_planes.find(key); if (jtr == unique_planes.end()) { unique_planes.insert({key, {fid}}); } else { jtr->second.push_back(fid); } } std::vector > resolved_faces; std::vector source_faces; std::vector new_vertices; EdgeMap edge_vertices; /** * Run constraint Delaunay triangulation on the plane. */ auto run_delaunay_triangulation = [&](const Plane_3& P, const std::vector& involved_faces, std::vector& vertices, std::vector >& faces) { CDT_plus_2 cdt; for (const auto& fid : involved_faces) { const auto itr = offending.find(fid); const auto& triangle = T[fid]; cdt.insert_constraint(P.to_2d(triangle[0]), P.to_2d(triangle[1])); cdt.insert_constraint(P.to_2d(triangle[1]), P.to_2d(triangle[2])); cdt.insert_constraint(P.to_2d(triangle[2]), P.to_2d(triangle[0])); if (itr == offending.end()) continue; for (const auto& obj : itr->second.second) { if(const Segment_3 *iseg = CGAL::object_cast(&obj)) { // Add segment constraint cdt.insert_constraint( P.to_2d(iseg->vertex(0)),P.to_2d(iseg->vertex(1))); }else if(const Point_3 *ipoint = CGAL::object_cast(&obj)) { // Add point cdt.insert(P.to_2d(*ipoint)); } else if(const Triangle_3 *itri = CGAL::object_cast(&obj)) { // Add 3 segment constraints cdt.insert_constraint( P.to_2d(itri->vertex(0)),P.to_2d(itri->vertex(1))); cdt.insert_constraint( P.to_2d(itri->vertex(1)),P.to_2d(itri->vertex(2))); cdt.insert_constraint( P.to_2d(itri->vertex(2)),P.to_2d(itri->vertex(0))); } else if(const std::vector *polyp = CGAL::object_cast< std::vector >(&obj)) { //cerr< & poly = *polyp; const Index m = poly.size(); assert(m>=2); for(Index p = 0;p v2i; size_t count=0; for (auto itr = cdt.finite_vertices_begin(); itr != cdt.finite_vertices_end(); itr++) { vertices.push_back(P.to_3d(itr->point())); v2i[itr] = count; count++; } for (auto itr = cdt.finite_faces_begin(); itr != cdt.finite_faces_end(); itr++) { faces.push_back( { v2i[itr->vertex(0)], v2i[itr->vertex(1)], v2i[itr->vertex(2)] }); } }; /** * Given p on triangle indexed by ori_f, determine the index of p. */ auto determine_point_index = [&]( const Point_3& p, const size_t ori_f) -> Index { const auto& triangle = T[ori_f]; const auto& f = F.row(ori_f).eval(); // Check if p is one of the triangle corners. for (size_t i=0; i<3; i++) { if (p == triangle[i]) return f[i]; } // Check if p is on one of the edges. for (size_t i=0; i<3; i++) { const Point_3 curr_corner = triangle[i]; const Point_3 next_corner = triangle[(i+1)%3]; const Segment_3 edge(curr_corner, next_corner); if (edge.has_on(p)) { const Index curr = f[i]; const Index next = f[(i+1)%3]; Edge key; key.first = currsecond) { if (p == new_vertices[vid - num_base_vertices]) { return vid; } } const size_t index = num_base_vertices + new_vertices.size(); new_vertices.push_back(p); itr->second.push_back(index); return index; } } } // p must be in the middle of the triangle. const size_t index = num_base_vertices + new_vertices.size(); new_vertices.push_back(p); return index; }; /** * Determine the vertex indices for each corner of each output triangle. */ auto post_triangulation_process = [&]( const std::vector& vertices, const std::vector >& faces, const std::vector& involved_faces) { for (const auto& f : faces) { const Point_3& v0 = vertices[f[0]]; const Point_3& v1 = vertices[f[1]]; const Point_3& v2 = vertices[f[2]]; Point_3 center( (v0[0] + v1[0] + v2[0]) / 3.0, (v0[1] + v1[1] + v2[1]) / 3.0, (v0[2] + v1[2] + v2[2]) / 3.0); for (const auto& ori_f : involved_faces) { const auto& triangle = T[ori_f]; const Plane_3 P = triangle.supporting_plane(); if (triangle.has_on(center)) { std::vector corners(3); corners[0] = determine_point_index(v0, ori_f); corners[1] = determine_point_index(v1, ori_f); corners[2] = determine_point_index(v2, ori_f); if (CGAL::orientation( P.to_2d(v0), P.to_2d(v1), P.to_2d(v2)) == CGAL::RIGHT_TURN) { std::swap(corners[0], corners[1]); } resolved_faces.emplace_back(corners); source_faces.push_back(ori_f); } } } }; // Process un-touched faces. for (size_t i=0; i vertices; std::vector > faces; run_delaunay_triangulation(P, involved_faces, vertices, faces); post_triangulation_process(vertices, faces, involved_faces); } // Output resolved mesh. const size_t num_out_vertices = new_vertices.size() + num_base_vertices; VV.resize(num_out_vertices, 3); for (size_t i=0; i vv2i; // Safe to check for duplicates using double for original vertices: if // incoming reps are different then the points are unique. for(Index v = 0;v, Eigen::Matrix, CGAL::Epeck, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epick, Eigen::Matrix, -1, 3, 0, -1, 3>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epick, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epick, Eigen::Matrix, -1, -1, 0, -1, -1>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, -1, 3, 0, -1, 3>, Eigen::Matrix, CGAL::Epeck, Eigen::Matrix, -1, 3, 0, -1, 3>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, -1, 3, 0, -1, 3>, Eigen::Matrix, CGAL::Epick, Eigen::Matrix, -1, 3, 0, -1, 3>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, -1, 3, 0, -1, 3>, Eigen::Matrix, CGAL::Epeck, Eigen::Matrix, -1, -1, 0, -1, -1>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, -1, 3, 0, -1, 3>, Eigen::Matrix, CGAL::Epick, Eigen::Matrix, -1, -1, 0, -1, -1>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epeck, Eigen::Matrix, -1, 3, 0, -1, 3>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epeck, Eigen::Matrix, -1, 3, 0, -1, 3>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epeck, Eigen::Matrix, -1, 3, 0, -1, 3>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epeck, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epeck, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epick, Eigen::Matrix, -1, 3, 0, -1, 3>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epick, Eigen::Matrix, -1, 3, 0, -1, 3>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, 3, 0, -1, 3> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epick, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epick, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epeck, Eigen::Matrix, -1, -1, 0, -1, -1>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epick, Eigen::Matrix, -1, -1, 0, -1, -1>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::copyleft::cgal::remesh_intersections, Eigen::Matrix, CGAL::Epeck, Eigen::Matrix, -1, -1, 0, -1, -1>, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::PlainObjectBase > const&, Eigen::PlainObjectBase > const&, std::vector, std::allocator > > const&, std::map::Index, std::pair::Index, std::vector > >, std::less::Index>, std::allocator::Index const, std::pair::Index, std::vector > > > > > const&, std::map::Index, Eigen::Matrix::Index>, std::vector::Index, std::allocator::Index> >, std::less::Index, Eigen::Matrix::Index> >, std::allocator::Index, Eigen::Matrix::Index> const, std::vector::Index, std::allocator::Index> > > > > const&, Eigen::PlainObjectBase, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); #endif