#include #include #include #include #include #include #include #include #include namespace order_facets_around_edges_test { typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; template size_t index_of(const std::vector& array, T val) { auto loc = std::find(array.begin(), array.end(), val); assert(loc != array.end()); return loc - array.begin(); } void assert_consistently_oriented(size_t num_faces, const std::vector& expected_face_order, const std::vector& e_order) { const size_t num_items = expected_face_order.size(); ASSERT_EQ(num_items, e_order.size()); std::vector order(num_items); std::transform(e_order.begin(), e_order.end(), order.begin(), [=](int val) { return val % num_faces; }); size_t ref_start = index_of(order, expected_face_order[0]); for (size_t i=0; i void assert_order( const Eigen::PlainObjectBase& V, const Eigen::PlainObjectBase& F, size_t v0, size_t v1, std::vector expected_order, const std::string& normal="") { Eigen::MatrixXi E, uE, EMAP; std::vector > uE2E; igl::unique_edge_map(F, E, uE, EMAP, uE2E); std::vector > uE2oE; std::vector > uE2C; if (normal != "") { Eigen::MatrixXd N; //igl::per_face_normals_stable(V, F, N); //igl::per_face_normals(V, F, N); test_common::load_matrix(normal, N); igl::cgal::order_facets_around_edges(V, F, N, E, uE, EMAP, uE2E, uE2oE, uE2C); } else { igl::cgal::order_facets_around_edges(V, F, E, uE, EMAP, uE2E, uE2oE, uE2C); } const size_t num_uE = uE.rows(); for (size_t i=0; i