// Copyright (c) 2001 Tel-Aviv University (Israel). // All rights reserved. // // This file is part of CGAL (www.cgal.org); you may redistribute it under // the terms of the Q Public License version 1.0. // See the file LICENSE.QPL distributed with CGAL. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $Source$ // $Revision$ $Date$ // $Name$ // // Author(s) : Eti Ezra #ifndef CGAL_IO_WRITE_ARR_H #define CGAL_IO_WRITE_ARR_H #ifndef CGAL_BASIC_H #include #endif #include #include #include #include CGAL_BEGIN_NAMESPACE template void write_arr(const Arr & arr, Writer & writer, std::ostream & o) { typedef typename Arr::Planar_map PM; typedef typename Arr::Vertex Vertex; typedef typename Arr::Face Face; typedef typename Arr::Halfedge Halfedge; typedef typename Arr::Curve_iterator Curve_iterator; typedef typename Arr::Subcurve_iterator Subcurve_iterator; typedef typename Arr::Edge_iterator Edge_iterator; typedef typename Arr::Curve_const_iterator Curve_const_iterator; typedef typename Arr::Subcurve_const_iterator Subcurve_const_iterator; typedef typename Arr::Edge_const_iterator Edge_const_iterator; typedef typename Arr::Vertex_handle Vertex_handle; typedef typename Arr::Halfedge_handle Halfedge_handle; typedef typename Arr::Face_handle Face_handle; typedef typename Arr::Vertex_const_handle Vertex_const_handle; typedef typename Arr::Halfedge_const_handle Halfedge_const_handle; typedef typename Arr::Face_const_handle Face_const_handle; typedef typename Arr::Vertex_iterator Vertex_iterator; typedef typename Arr::Vertex_const_iterator Vertex_const_iterator; typedef typename Arr::Halfedge_iterator Halfedge_iterator; typedef typename Arr::Halfedge_const_iterator Halfedge_const_iterator; typedef typename Arr::Face_iterator Face_iterator; typedef typename Arr::Face_const_iterator Face_const_iterator; typedef typename Arr::Ccb_halfedge_circulator Ccb_halfedge_circulator; typedef typename Arr::Ccb_halfedge_const_circulator Ccb_halfedge_const_circulator; typedef typename Arr::Holes_iterator Holes_iterator; typedef typename Arr::Holes_const_iterator Holes_const_iterator; typedef typename Arr::Overlap_circulator Overlap_circulator; typedef typename Arr::Overlap_const_circulator Overlap_const_circulator; typedef typename Arr::Locate_type Locate_type; typedef Inverse_index H_index; typedef Inverse_index Cn_index; typedef Inverse_index Scv_index; typedef Inverse_index En_index; H_index h_index(arr.halfedges_begin(), arr.halfedges_end()); writer.write_title("Printing Arrangement"); write_pm(arr.get_planar_map(), writer, o); writer.write_comment("Printing curve hierachy"); std::vector en_index_table; // creating curve indices. Cn_index cn_index(arr.curve_node_begin(), arr.curve_node_end()); // creating the edge node indices table. Curve_const_iterator cv_iter; for (cv_iter = arr.curve_node_begin(); cv_iter != arr.curve_node_end(); cv_iter++){ En_index en_index(cv_iter->edges_begin(), cv_iter->edges_end()); en_index_table.push_back(en_index); } int number_of_curves = 0; for (cv_iter = arr.curve_node_begin(); cv_iter != arr.curve_node_end(); cv_iter++, number_of_curves++); writer.write_comment("number of curves"); writer.write_value(number_of_curves); unsigned int curve_index = 0; for (cv_iter = arr.curve_node_begin(); cv_iter != arr.curve_node_end(); cv_iter++, curve_index++){ unsigned int number_of_edge_nodes = 0; writer.write_comment("'th curve", curve_index+1); //cout<curve()<number_of_sc_levels()); // making a table of indices for all scv levels. std::vector scv_index; unsigned int i; for (i = 0; i < cv_iter->number_of_sc_levels(); i++){ //Subcurve_const_iterator tmp_begin, tmp_end; // for debug. //tmp_begin = cv_iter->level_begin(i); //tmp_end = cv_iter->level_end(i); Scv_index one_scv_index(cv_iter->level_begin(i), cv_iter->level_end(i)); scv_index.push_back(one_scv_index); } En_index en_index(cv_iter->edges_begin(), cv_iter->edges_end()); for (i = 0; i < cv_iter->number_of_sc_levels(); i++){ writer.write_comment("'th level", i+1); unsigned int number_of_subcurves = 0; Subcurve_const_iterator sc_iter; for (sc_iter = cv_iter->level_begin(i); sc_iter != cv_iter->level_end(i); sc_iter++, number_of_subcurves++); writer.write_value(number_of_subcurves); for (sc_iter = cv_iter->level_begin(i); sc_iter != cv_iter->level_end(i); sc_iter++){ if (i+1 < cv_iter->number_of_sc_levels()){ if (!writer.verbose()){ writer.write_comment( "begin and past end indices of children subcurve nodes"); Subcurve_const_iterator last_child = sc_iter->children_end(); writer.write_value((scv_index[i+1])[sc_iter->children_begin()], ' '); writer.write_value((scv_index[i+1])[--last_child] + 1); } else { writer.write_comment("All children subcurve nodes"); Subcurve_const_iterator child_iter; for (child_iter = sc_iter->children_begin(); child_iter != sc_iter->children_end(); child_iter++) writer.write_subcurve (child_iter); } } else{ // getting to the edge nodes. if (!writer.verbose()){ writer.write_comment ("begin and past end indices of children edge nodes"); Edge_const_iterator last_child = sc_iter->edges_end(); writer.write_value(en_index[sc_iter->edges_begin()], ' '); writer.write_value(en_index[--last_child] + 1); } else{ writer.write_comment("All children edge nodes"); for (Edge_const_iterator child_iter = sc_iter->edges_begin(); child_iter != sc_iter->edges_end(); child_iter++) writer.write_edge(child_iter); } } //writer.skip_line(); writer.write_comment("subcurve of current level"); writer.write_subcurve(sc_iter); } } writer.write_comment("number of edge nodes"); for (Edge_const_iterator edge_count_iter = cv_iter->edges_begin(); edge_count_iter != cv_iter->edges_end(); edge_count_iter++, number_of_edge_nodes++); writer.write_value(number_of_edge_nodes); writer.write_comment("----------------------- Edge nodes childrens:"); for (Edge_const_iterator edge_iter = cv_iter->edges_begin(); edge_iter != cv_iter->edges_end(); edge_iter++){ if (!writer.verbose()){ // printing next overlapping edge node. writer.write_comment("pair indices (curve node and its edge node) " "for next overlapping edge node :"); //cout<<"edge_iter->curve()"<curve()<children_end()); std::size_t j = cn_index[edge_past_end_child->curve_node()]; std::size_t k = (en_index_table[j])[edge_past_end_child]; writer.write_value(j, ' '); writer.write_value(k); //cout<children_begin()->curve(); //writer.write_index(en_index[edge_iter->children_begin()]); //writer.write_index(en_index[edge_iter->children_end()]); writer.write_comment("Halfedge indices associated with edge nodes"); writer.write_value (h_index[Halfedge_const_iterator(edge_iter->halfedge())]); } else{ writer.write_comment("Halfedge associated with edge nodes"); writer.write_halfedge_verbose(edge_iter->halfedge()); } //writer.skip_line(); writer.write_comment("Edge node curve"); writer.write_edge(edge_iter); } writer.write_comment("finished current level"); //writer.write_edge_nodes_end(); } writer.write_title("End of Arrangement"); } CGAL_END_NAMESPACE #endif