#include #include #include #include #include #include typedef CGAL::Simple_cartesian Kernel; typedef Kernel::Point_3 Point; typedef CGAL::Surface_mesh Mesh; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; typedef boost::graph_traits::vertex_iterator vertex_iterator; typedef boost::graph_traits::edge_descriptor edge_descriptor; void kruskal(const Mesh& sm) { // We use the default edge weight which is the squared length of the edge std::list mst; boost::kruskal_minimum_spanning_tree(sm, std::back_inserter(mst)); std::cout << "#VRML V2.0 utf8\n" "Shape {\n" " appearance Appearance {\n" " material Material { emissiveColor 1 0 0}}\n" " geometry\n" " IndexedLineSet {\n" " coord Coordinate {\n" " point [ \n"; vertex_iterator vb,ve; for(boost::tie(vb, ve) = vertices(sm); vb!=ve; ++vb){ std::cout << " " << sm.point(*vb) << "\n"; } std::cout << " ]\n" " }\n" " coordIndex [\n"; for(std::list::iterator it = mst.begin(); it != mst.end(); ++it) { edge_descriptor e = *it ; vertex_descriptor s = source(e,sm); vertex_descriptor t = target(e,sm); std::cout << " " << s << ", " << t << ", -1\n"; } std::cout << "]\n" " }#IndexedLineSet\n" "}# Shape\n"; } int main(int argc, char** argv) { Mesh sm; std::string fname = argc==1?CGAL::data_file_path("meshes/knot1.off"):argv[1]; if(!CGAL::IO::read_polygon_mesh(fname, sm)) { std::cerr << "Invalid input file." << std::endl; return EXIT_FAILURE; } kruskal(sm); return 0; }