#ifndef CGAL_MAP_OVERLAY_H #define CGAL_MAP_OVERLAY_H #include #include #include #ifndef CGAL_MAP_OVERLAY_BASE_H #include #endif #ifndef CGAL_MAP_OVERLAY_SWEEP_H #include #endif #ifndef CGAL_MAP_OVERLAY_DEFAULT_NOTIFIER_H #include #endif CGAL_BEGIN_NAMESPACE template > class Map_overlay { public: typedef Arrangement_ Arrangement; typedef Change_notification_ Change_notification; typedef typename Arrangement::Planar_map Planar_map; //typedef typename Arrangement::Pmwx Pmwx; typedef typename Arrangement::Vertex Vertex; typedef typename Arrangement::Face Face; typedef typename Arrangement::Halfedge Halfedge; typedef typename Arrangement::Vertex_handle Vertex_handle; typedef typename Arrangement::Halfedge_handle Halfedge_handle; typedef typename Arrangement::Face_handle Face_handle; typedef typename Arrangement::Vertex_const_handle Vertex_const_handle; typedef typename Arrangement::Halfedge_const_handle Halfedge_const_handle; typedef typename Arrangement::Face_const_handle Face_const_handle; typedef typename Arrangement::Vertex_iterator Vertex_iterator; typedef typename Arrangement::Halfedge_iterator Halfedge_iterator; typedef typename Arrangement::Face_iterator Face_iterator; typedef typename Arrangement::Vertex_const_iterator Vertex_const_iterator; typedef typename Arrangement::Halfedge_const_iterator Halfedge_const_iterator; typedef typename Arrangement::Face_const_iterator Face_const_iterator; typedef typename Arrangement::Ccb_halfedge_circulator Ccb_halfedge_circulator; typedef typename Arrangement::Ccb_halfedge_const_circulator Ccb_halfedge_const_circulator; typedef typename Arrangement::Holes_iterator Holes_iterator; typedef typename Arrangement::Holes_const_iterator Holes_const_iterator; typedef typename Arrangement::Locate_type Locate_type; //typedef typename Arrangement::Point_location_base Point_location_base; typedef Map_overlay_base Map_ovl_base; typedef Map_overlay_sweep Map_ovl_sweep; typedef Pm_point_location_base Point_location_base; private: typedef Map_overlay Self; public: Map_overlay() : sub_division1(0), sub_division2(0), ovl_change_notf(new Change_notification), ovl_alg(new Map_ovl_sweep), use_delete_notf(true), use_delete_ovl(true) { /*ovl = new Map_ovl_sweep; use_delete_ovl = true; ovl_change_notf = new Map_overlay_change_notification; use_delete_notf = true;*/ } Map_overlay(Point_location_base *pl_ptr) : arr_(pl_ptr), sub_division1(0), sub_division2(0), ovl_change_notf(new Change_notification), ovl_alg(new Map_ovl_sweep), use_delete_notf(true), use_delete_ovl(true) { } Map_overlay (const Arrangement &arr) : arr_(arr), sub_division1(0), sub_division2(0), ovl_change_notf(new Change_notification), ovl_alg(new Map_ovl_sweep), use_delete_notf(true), use_delete_ovl(true) { //copy_arr(a, arr); /* ovl = new Map_ovl_sweep; use_delete_ovl = true; ovl_change_notf = new Map_overlay_change_notification; use_delete_notf = true; sub_division1 = sub_division2 = NULL;*/ } Map_overlay (const Arrangement &arr, Change_notification* pmwx_change_notf) : arr_(arr), sub_division1(0), sub_division2(0), ovl_change_notf(pmwx_change_notf), ovl_alg(new Map_ovl_sweep), use_delete_notf(false), use_delete_ovl(true) { // here we can't use copy Constructor since we have to update arr attributres due to the notifier. // An effeicient way doing this is sweeping the original subdivision while using the notifier. //Arrangement empty_subdivision; //ovl->map_overlay(arr, empty_subdivision, ovl_change_notf, arr_); } Map_overlay (const Arrangement &arr, Map_ovl_base *ovl_ptr) : arr_(arr), sub_division1(0), sub_division2(0), ovl_change_notf(new Change_notification), ovl_alg(ovl_ptr), use_delete_notf(true), use_delete_ovl(false) {} Map_overlay (const Arrangement &arr, Change_notification* pmwx_change_notf, Map_ovl_base *ovl_ptr) : arr_(arr), sub_division1(0), sub_division2(0), ovl_change_notf(pmwx_change_notf), ovl_alg(ovl_ptr), use_delete_notf(false), use_delete_ovl(false) {} Map_overlay (const Self &ovl1, const Self &ovl2) : sub_division1(&ovl1), sub_division2(&ovl2), ovl_change_notf(new Change_notification(&(ovl1.subdivision()), &(ovl2.subdivision()) )), ovl_alg(new Map_ovl_sweep), use_delete_notf(true), use_delete_ovl(true) { //ovl = new Map_ovl_sweep; //use_delete_ovl = true; //ovl_change_notf = new Change_notification( &(ovl1.subdivision()), // &(ovl2.subdivision()) ); //use_delete_notf = true; //int c_sweep_t; //c_sweep_t = clock(); ovl_alg->map_overlay(ovl1.subdivision(), ovl2.subdivision(), ovl_change_notf, arr_); //c_sweep_t = clock() - c_sweep_t; //std::cout<<"The time required by sweep line : "<< (double) c_sweep_t / (double) CLOCKS_PER_SEC<map_overlay(ovl1.subdivision(), ovl2.subdivision(), ovl_change_notf, arr_); c_sweep_t = clock() - c_sweep_t; std::cout<<"The time required by sweep line : "<< (double) c_sweep_t / (double) CLOCKS_PER_SEC<map_overlay(ovl1.subdivision(), ovl2.subdivision(), ovl_change_notf, arr_); //sub_division1 = (Self *) &ovl1; //sub_division2 = (Self *) &ovl2; } Map_overlay (const Self &ovl1, const Self &ovl2, Point_location_base* pl_ptr, Change_notification* pmwx_change_notf) : arr_(pl_ptr), sub_division1(&ovl1), sub_division2(&ovl2), ovl_change_notf(pmwx_change_notf), ovl_alg(new Map_ovl_sweep), use_delete_notf(false), use_delete_ovl(true) { // ovl_alg = new Map_ovl_sweep; //use_delete_ovl = true; //use_delete_notf = false; ovl_alg->map_overlay(ovl1.subdivision(), ovl2.subdivision(), ovl_change_notf, arr_); //sub_division1 = (Self *) &ovl1; //sub_division2 = (Self *) &ovl2; } Map_overlay (const Self &ovl1, const Self &ovl2, Map_ovl_base *ovl_ptr) : sub_division1(&ovl1), sub_division2(&ovl2), ovl_change_notf(new Change_notification(&(ovl1.subdivision()), &(ovl2.subdivision()) )), ovl_alg(ovl_ptr), use_delete_notf(true), use_delete_ovl(false) { //ovl_change_notf = new Change_notification( &(ovl1.subdivision()), // &(ovl2.subdivision()) ); //use_delete_notf = true; //use_delete_ovl = false; ovl_alg->map_overlay(ovl1.subdivision(), ovl2.subdivision(), ovl_change_notf, arr_); //sub_division1 = (Self *) &ovl1; //sub_division2 = (Self *) &ovl2; } Map_overlay (const Self &ovl1, const Self &ovl2, Point_location_base* pl_ptr, Map_ovl_base *ovl_ptr) : arr_(pl_ptr), sub_division1(&ovl1), sub_division2(&ovl2), ovl_change_notf(new Change_notification(&(ovl1.subdivision()), &(ovl2.subdivision()) )), ovl_alg(ovl_ptr), use_delete_notf(true), use_delete_ovl(false) { //ovl_change_notf = new Change_notification( &(ovl1.subdivision()), // &(ovl2.subdivision()) ); //use_delete_notf = true; //use_delete_ovl = false; ovl_alg->map_overlay(ovl1.subdivision(), ovl2.subdivision(), ovl_change_notf, arr_); //sub_division1 = (Self *) &ovl1; //sub_division2 = (Self *) &ovl2; } Map_overlay (const Self &ovl1, const Self &ovl2, Change_notification* pmwx_change_notf, Map_ovl_base *ovl_ptr) : sub_division1(&ovl1), sub_division2(&ovl2), ovl_change_notf(pmwx_change_notf), ovl_alg(ovl_ptr), use_delete_notf(false), use_delete_ovl(false) { //use_delete_notf = false; //use_delete_ovl = false; ovl_alg->map_overlay(ovl1.subdivision(), ovl2.subdivision(), ovl_change_notf, arr_); //sub_division1 = (Self *) &ovl1; //sub_division2 = (Self *) &ovl2; } Map_overlay (const Self &ovl1, const Self &ovl2, Point_location_base* pl_ptr, Change_notification* pmwx_change_notf, Map_ovl_base *ovl_ptr) : arr_(pl_ptr), sub_division1(&ovl1), sub_division2(&ovl2), ovl_change_notf(pmwx_change_notf), ovl_alg(ovl_ptr), use_delete_notf(false), use_delete_ovl(false) { //use_delete_notf = false; //use_delete_ovl = false; ovl_alg->map_overlay(ovl1.subdivision(), ovl2.subdivision(), ovl_change_notf, arr_); //sub_division1 = (Self *) &ovl1; //sub_division2 = (Self *) &ovl2; } virtual ~Map_overlay() { if (use_delete_notf) delete ovl_change_notf; if (use_delete_ovl) delete ovl_alg; } // ------------------- Copy contr' Map_overlay (const Self &ovl) : arr_(ovl.arr_), sub_division1(ovl.sub_division1), sub_division2(ovl.sub_division2), ovl_change_notf(new Change_notification(ovl.ovl_change_notf)), ovl_alg(ovl.ovl_alg), use_delete_notf(true), use_delete_ovl(false) {} // -------------------- Assignement operator. const Self& operator=(const Self& ovl) { arr_ = ovl.arr_; sub_division1 = ovl.sub_division1; sub_division2 = ovl.sub_division2; // The notifier and ovl algorithm remain their initial values obtained // in the defualt constructor (or other constructor taken for *this). //ovl_change_notf(new Change_notification(ovl.ovl_change_notf)); //ovl_alg = ovl.ovl_alg; //use_delete_notf=true; use_delete_ovl=false; return *this; } void delete_subtree() { arr_ = Map_overlay(arr_); for (Vertex_iterator v_iter = arr_.vertices_begin(); v_iter != arr_.vertices_end(); v_iter++) v_iter->reset(); for (Halfedge_iterator h_iter = arr_.halfedges_begin(); h_iter != arr_.halfedges_end(); h_iter++) h_iter->reset(); for (Face_iterator f_iter = arr_.faces_begin(); f_iter != arr_.faces_end(); f_iter++) f_iter->reset(); } const Arrangement& subdivision() const { return arr_; } const Self* first_creator () const { return sub_division1; } const Self* second_creator () const { return sub_division2; } const Change_notification* change_notification() const { return ovl_change_notf; } private: // only temporary. //typedef typename Arrangement::PMWXChangeNotification PMWXChangeNotification_Empty; // copy a1 to a2. void copy_arr(const Arrangement &a1, Arrangement &a2 /*, Map_overlay_ChangeNotification* ovl_change_notf*/) { typedef typename Arrangement::Traits Traits; typedef typename Traits::X_curve X_curve; cout<<"copy arrangment\n"; for (Halfedge_const_iterator halfedge_iter = a1.halfedges_begin(); halfedge_iter != a1.halfedges_end(); halfedge_iter++, halfedge_iter++){ //ovl_change_notf.set_curve_attributes(halfedge_iter->curve(), halfedge_iter, halfedge_iter->twin()); //a2.insert(halfedge_iter->curve(), ovl_change_notf); a2.insert(halfedge_iter->curve()); } // copy all attributes of halfedges and faces. Vertex_const_iterator v1_iter = a1.vertices_begin(); Vertex_iterator v2_iter = a2.vertices_begin(); /*for ( ; v1_iter != a1.vertices_end() && v2_iter != a2.vertices_end(); v1_iter++, v2_iter++){ v2_iter->set_bop(v1_iter->bop()); }*/ Halfedge_const_iterator h1_iter = a1.halfedges_begin(); Halfedge_iterator h2_iter = a2.halfedges_begin(); for ( ; h1_iter != a1.halfedges_end() && h2_iter != a2.halfedges_end(); h1_iter++, h2_iter++){ if (ovl_change_notf->get_first_halfedge_above(h1_iter) != h1_iter) ovl_change_notf->set_first_halfedge_above(h2_iter, ovl_change_notf->get_first_halfedge_above(h1_iter)); if (ovl_change_notf->get_second_halfedge_above(h1_iter) != h1_iter) ovl_change_notf->set_second_halfedge_above(h2_iter, ovl_change_notf->get_second_halfedge_above(h1_iter)); if (ovl_change_notf->get_first_face_above(h1_iter) != h1_iter->face()) ovl_change_notf->set_first_face_above(h2_iter, ovl_change_notf->get_first_face_above(h1_iter)); if (ovl_change_notf->get_second_face_above(h1_iter) != h1_iter->face()) ovl_change_notf->set_second_face_above(h2_iter, ovl_change_notf->get_second_face_above(h1_iter)); //h2_iter->set_bop(h1_iter->bop()); // defined only for bop. } Face_const_iterator f1_iter = a1.faces_begin(); Face_iterator f2_iter = a2.faces_begin(); for ( ; f1_iter != a1.faces_end() && f2_iter != a2.faces_end(); f1_iter++, f2_iter++){ if (ovl_change_notf->get_first_face_above(f1_iter) != f1_iter) ovl_change_notf->set_first_face_above(f2_iter, ovl_change_notf->get_first_face_above(f1_iter)); if (ovl_change_notf->get_second_face_above(f1_iter) != f1_iter) ovl_change_notf->set_second_face_above(f2_iter, ovl_change_notf->get_second_face_above(f1_iter)); //f2_iter->set_bop(f1_iter->bop()); } } Arrangement arr_; const Self *sub_division1, *sub_division2; Change_notification *ovl_change_notf; Map_ovl_base *ovl_alg; bool use_delete_notf; bool use_delete_ovl; }; CGAL_END_NAMESPACE #endif