int main(int argc, char** argv) { // read input polyhedron Polyhedron_3 polyhedron; std::ifstream input((argc>1)?argv[1]:"data/elephant.off"); input >> polyhedron; input.close(); // initialize indices of vertices, halfedges and faces CGAL::set_halfedgeds_items_id(polyhedron); // pick up some source points inside faces, const unsigned int randSeed = argc > 2 ? boost::lexical_cast<unsigned int>(argv[2]) : 7915421; CGAL::Random rand(randSeed); // by copying the faces in a vector to get a direct access to faces std::size_t nb_faces=num_faces(polyhedron); face_iterator fit, fit_end; boost::tie(fit, fit_end) = faces(polyhedron); std::vector<face_descriptor> face_vector(fit, fit_end); // and creating a vector of Face_location objects const std::size_t nb_source_points = 30; Traits::Barycentric_coordinates face_location = {{0.25, 0.5, 0.25}}; std::vector<Face_location> faceLocations(nb_source_points, Face_location(face_descriptor(), face_location)); for (std::size_t i = 0; i < nb_source_points; ++i) { faceLocations[i].first=face_vector[rand.get_int(0, static_cast<int>(nb_faces))]; } // construct a shortest path query object and add a range of source points Surface_mesh_shortest_path shortest_paths(polyhedron); shortest_paths.add_source_points(faceLocations.begin(), faceLocations.end()); // For all vertices in the polyhedron, compute the points of // the shortest path to the source point and write them // into a file readable using the CGAL Polyhedron demo std::ofstream output("shortest_paths_multiple_sources.cgal"); vertex_iterator vit, vit_end; for ( boost::tie(vit, vit_end) = vertices(polyhedron); vit != vit_end; ++vit) { std::vector<Traits::Point_3> points; shortest_paths.shortest_path_points_to_source_points(*vit, std::back_inserter(points)); // print the points output << points.size() << " "; for (std::size_t i = 0; i < points.size(); ++i) output << " " << points[i]; output << std::endl; } return 0; }
int main(int argc, char** argv) { // read input polyhedron Polyhedron_3 polyhedron; std::ifstream input((argc>1)?argv[1]:"data/elephant.off"); input >> polyhedron; input.close(); // initialize indices of vertices, halfedges and facets CGAL::set_halfedgeds_items_id(polyhedron); // pick up a random face const size_t randSeed = argc > 2 ? std::atoi(argv[2]) : 7915421; CGAL::Random rand(randSeed); const int target_face_index = rand.get_int(0, num_faces(polyhedron)); face_iterator face_it = faces(polyhedron).first; std::advance(face_it,target_face_index); // ... and define a barycentric coordinate inside the face Traits::Barycentric_coordinate face_location = {{0.25, 0.5, 0.25}}; // construct a shortest path query object and add a source point Surface_mesh_shortest_path shortest_paths(polyhedron); shortest_paths.add_source_point(*face_it, face_location); // For all vertices in the polyhedron, compute the points of // the shortest path to the source point and write them // into a file readable using the CGAL Polyhedron demo std::ofstream output("shortest_paths_with_id.cgal"); vertex_iterator vit, vit_end; for ( boost::tie(vit, vit_end) = vertices(polyhedron); vit != vit_end; ++vit) { std::vector<Traits::Point_3> points; shortest_paths.shortest_path_points_to_source_points(*vit, std::back_inserter(points)); // print the points output << points.size() << " "; for (std::size_t i = 0; i < points.size(); ++i) output << " " << points[i]; output << std::endl; } return 0; }
int main(int argc, char** argv) { // read input polyhedron Polyhedron_3 polyhedron; std::ifstream input((argc>1)?argv[1]:"data/elephant.off"); input >> polyhedron; input.close(); // initialize indices of vertices, halfedges and facets CGAL::set_halfedgeds_items_id(polyhedron); // pick up a random face const size_t randSeed = argc > 2 ? std::atoi(argv[2]) : 7915421; CGAL::Random rand(randSeed); const int target_face_index = rand.get_int(0, num_faces(polyhedron)); face_iterator face_it = faces(polyhedron).first; std::advance(face_it,target_face_index); // ... and define a barycentric coordinate inside the face Barycentric_coordinate face_location = {{0.25, 0.5, 0.25}}; // construct a shortest path query object and add a source point Surface_mesh_shortest_path shortest_paths(polyhedron); shortest_paths.add_source_point(*face_it, face_location); // pick a random target point inside a face face_it = faces(polyhedron).first; std::advance(face_it, rand.get_int(0, num_faces(polyhedron))); // collect the sequence of simplicies crossed by the shortest path Sequence_collector sequence_collector; shortest_paths.shortest_path_sequence_to_source_points(*face_it, face_location, sequence_collector); // print the sequence using the visitor pattern Print_visitor print_visitor(polyhedron); for (size_t i = 0; i < sequence_collector.sequence.size(); ++i) boost::apply_visitor(print_visitor, sequence_collector.sequence[i]); return 0; }