#include #include #include #include #include typedef CGAL::Simple_cartesian K; typedef K::Point_2 Point_2; typedef boost::adjacency_list < boost::listS, boost::vecS, boost::undirectedS, Point_2 > G; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; typedef std::vector Polyline_2; struct Is_terminal { template bool operator ()(VertexDescriptor vd , const Graph& g ) { return false; // degree(vd,g) != 2; is a bad test in case of parallel edges } }; template struct Polyline_visitor { std::list& polylines; const Graph& points_pmap; Polyline_visitor(std::list& lines, const Graph& points_property_map) : polylines(lines), points_pmap(points_property_map) {} void start_new_polyline() { Polyline_2 V; polylines.push_back(V); } void add_node(typename boost::graph_traits::vertex_descriptor vd) { Polyline_2& polyline = polylines.back(); polyline.push_back(points_pmap[vd]); } }; int main() { G g; std::list polylines; Polyline_visitor polyline_visitor(polylines, g); std::map p2vd; int n; std::cin >> n; // number of segments Point_2 p, q; vertex_descriptor vdp, vdq; for(int i=0; i < n; i++){ std::cin >> p >> q; if(p2vd.find(p) == p2vd.end()){ vdp = add_vertex(g); g[vdp] = p; p2vd[p] = vdp; } else { vdp = p2vd[p]; } if(p2vd.find(q) == p2vd.end()){ vdq = add_vertex(g); g[vdq] = q; p2vd[q] = vdq; } else { vdq = p2vd[q]; } boost::add_edge(vdp, vdq, g); } CGAL::split_graph_into_polylines( g, polyline_visitor, Is_terminal() ); std::cout.precision(17); for(std::list::iterator it = polylines.begin(); it!= polylines.end(); ++it){ Polyline_2& poly = *it; std::size_t n; if(poly.front() == poly.back()){ std::cout << "POLYGON" << std::endl; n = poly.size() -1; }else{ std::cout << "POLYLINE" << std::endl; n = poly.size(); } for(std::size_t j=0; j < n; j++){ std::cout << poly[j] << std::endl; } std::cout << std::endl; } return 0; }