void Cond::print(std::ostream& o) const { o << "(cond"; for (const auto item : conditions) { o << " ("; boost::apply_visitor(print_visitor(o), item.first); o << " "; boost::apply_visitor(print_visitor(o), item.second); o << ")"; } o << ")"; }
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; }
// Prints severity level through visitation API void print_severity_visitation(logging::record const& rec) { logging::visit< severity_level >("Severity", rec, print_visitor()); }
int main() { // geometries container map geometries; // create some geometries for ( unsigned i = 0 ; i < 10 ; ++i ) { unsigned c = rand() % 3; if ( 0 == c ) { // create polygon polygon p; fill(i, p.outer()); geometries.insert(std::make_pair(i, geometry(p))); } else if ( 1 == c ) { // create ring ring r; fill(i, r); geometries.insert(std::make_pair(i, geometry(r))); } else if ( 2 == c ) { // create linestring linestring l; fill(i, l); geometries.insert(std::make_pair(i, geometry(l))); } } // display geometries std::cout << "generated geometries:" << std::endl; BOOST_FOREACH(map::value_type const& p, geometries) boost::apply_visitor(print_visitor(), p.second); // create the rtree using default constructor bgi::rtree< value, bgi::quadratic<16, 4> > rtree; // fill the spatial index for ( map::iterator it = geometries.begin() ; it != geometries.end() ; ++it ) { // calculate polygon bounding box box b = boost::apply_visitor(envelope_visitor(), it->second); // insert new value rtree.insert(std::make_pair(b, it)); } // find values intersecting some area defined by a box box query_box(point(0, 0), point(5, 5)); std::vector<value> result_s; rtree.query(bgi::intersects(query_box), std::back_inserter(result_s)); // find 5 nearest values to a point std::vector<value> result_n; rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n)); // note: in Boost.Geometry the WKT representation of a box is polygon // note: the values store the bounding boxes of geometries // the geometries aren't used for querying but are printed // display results std::cout << "spatial query box:" << std::endl; std::cout << bg::wkt<box>(query_box) << std::endl; std::cout << "spatial query result:" << std::endl; BOOST_FOREACH(value const& v, result_s) boost::apply_visitor(print_visitor(), v.second->second); std::cout << "knn query point:" << std::endl; std::cout << bg::wkt<point>(point(0, 0)) << std::endl; std::cout << "knn query result:" << std::endl; BOOST_FOREACH(value const& v, result_n) boost::apply_visitor(print_visitor(), v.second->second); return 0; }