BWAPI
|
00001 // Copyright (c) 2005-2009 Tel-Aviv University (Israel). 00002 // All rights reserved. 00003 // 00004 // This file is part of CGAL (www.cgal.org); you may redistribute it under 00005 // the terms of the Q Public License version 1.0. 00006 // See the file LICENSE.QPL distributed with CGAL. 00007 // 00008 // Licensees holding a valid commercial license may use this file in 00009 // accordance with the commercial license agreement provided with the software. 00010 // 00011 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 00012 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00013 // 00014 // $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.5-branch/Arrangement_on_surface_2/include/CGAL/Arrangement_on_surface_2.h $ 00015 // $Id: Arrangement_on_surface_2.h 50781 2009-07-23 12:28:10Z efif $ 00016 // 00017 // 00018 // Author(s): Ron Wein <wein@post.tau.ac.il> 00019 // Efi Fogel <efif@post.tau.ac.il> 00020 // Eric Berberich <ericb@post.tau.ac.il> 00021 // (based on old version by: Iddo Hanniel, 00022 // Eyal Flato, 00023 // Oren Nechushtan, 00024 // Ester Ezra, 00025 // Shai Hirsch, 00026 // and Eugene Lipovetsky) 00027 #ifndef CGAL_ARRANGEMENT_ON_SURFACE_2_H 00028 #define CGAL_ARRANGEMENT_ON_SURFACE_2_H 00029 00034 #include <boost/mpl/assert.hpp> 00035 #include <CGAL/Arr_tags.h> 00036 #include <CGAL/Arr_enums.h> 00037 #include <CGAL/HalfedgeDS_iterator.h> 00038 #include <CGAL/Arrangement_2/Arrangement_2_iterators.h> 00039 #include <CGAL/In_place_list.h> 00040 #include <CGAL/Arr_default_dcel.h> 00041 #include <CGAL/Arr_observer.h> 00042 #include <CGAL/Arr_accessor.h> 00043 #include <CGAL/Arrangement_2/Arr_traits_adaptor_2.h> 00044 #include <CGAL/function_objects.h> 00045 #include <CGAL/Iterator_project.h> 00046 #include <CGAL/Iterator_transform.h> 00047 #include <map> 00048 #include <vector> 00049 #include <algorithm> 00050 00051 CGAL_BEGIN_NAMESPACE 00052 00064 template <class GeomTraits_, class TopTraits_> 00065 class Arrangement_on_surface_2 00066 { 00067 public: 00068 00069 typedef GeomTraits_ Geometry_traits_2; 00070 typedef TopTraits_ Topology_traits; 00071 00072 // first define adaptor ... 00073 typedef Arr_traits_basic_adaptor_2<Geometry_traits_2> Traits_adaptor_2; 00074 00075 // .. as it completes (potentially) missing side tags 00076 typedef typename Traits_adaptor_2::Arr_left_side_tag Arr_left_side_tag; 00077 typedef typename Traits_adaptor_2::Arr_bottom_side_tag Arr_bottom_side_tag; 00078 typedef typename Traits_adaptor_2::Arr_top_side_tag Arr_top_side_tag; 00079 typedef typename Traits_adaptor_2::Arr_right_side_tag Arr_right_side_tag; 00080 00081 BOOST_MPL_ASSERT( 00082 (typename 00083 Arr_sane_identified_tagging< Arr_left_side_tag, Arr_bottom_side_tag, 00084 Arr_top_side_tag, Arr_right_side_tag >::result) 00085 ); 00086 00087 public: 00088 00089 typedef Arrangement_on_surface_2<Geometry_traits_2, 00090 Topology_traits> Self; 00091 00092 typedef typename Geometry_traits_2::Point_2 Point_2; 00093 typedef typename Geometry_traits_2::X_monotone_curve_2 X_monotone_curve_2; 00094 00095 // maybe remove this in a future version (that supports complete handling 00096 // of all sides) 00097 typedef typename Arr_are_all_sides_oblivious_tag< 00098 Arr_left_side_tag, Arr_bottom_side_tag, 00099 Arr_top_side_tag, Arr_right_side_tag >::result 00100 Are_all_sides_oblivious_tag; 00101 00102 public: 00103 00104 typedef typename Topology_traits::Dcel Dcel; 00105 typedef typename Dcel::Size Size; 00106 00107 protected: 00108 00109 friend class Arr_observer<Self>; 00110 friend class Arr_accessor<Self>; 00111 00112 // Internal DCEL types: 00113 typedef typename Dcel::Vertex DVertex; 00114 typedef typename Dcel::Halfedge DHalfedge; 00115 typedef typename Dcel::Face DFace; 00116 typedef typename Dcel::Outer_ccb DOuter_ccb; 00117 typedef typename Dcel::Inner_ccb DInner_ccb; 00118 typedef typename Dcel::Isolated_vertex DIso_vertex; 00119 00120 typedef typename Dcel::difference_type DDifference; 00121 typedef typename Dcel::iterator_category DIterator_category; 00122 00123 typedef typename Dcel::Vertex_iterator DVertex_iter; 00124 typedef typename Dcel::Vertex_const_iterator DVertex_const_iter; 00125 00126 typedef typename Dcel::Halfedge_iterator DHalfedge_iter; 00127 typedef typename Dcel::Halfedge_const_iterator DHalfedge_const_iter; 00128 00129 typedef typename Dcel::Edge_iterator DEdge_iter; 00130 typedef typename Dcel::Edge_const_iterator DEdge_const_iter; 00131 00132 typedef typename Dcel::Face_iterator DFace_iter; 00133 typedef typename Dcel::Face_const_iterator DFace_const_iter; 00134 00135 typedef typename DFace::Outer_ccb_iterator DOuter_ccb_iter; 00136 typedef typename DFace::Outer_ccb_const_iterator DOuter_ccb_const_iter; 00137 00138 typedef typename DFace::Inner_ccb_iterator DInner_ccb_iter; 00139 typedef typename DFace::Inner_ccb_const_iterator DInner_ccb_const_iter; 00140 00141 typedef typename DFace::Isolated_vertex_iterator 00142 DIso_vertex_iter; 00143 typedef typename DFace::Isolated_vertex_const_iterator 00144 DIso_vertex_const_iter; 00145 00146 protected: 00147 00151 class _Is_concrete_vertex 00152 { 00153 private: 00154 00155 const Topology_traits *m_topol_traits; 00156 00157 public: 00158 00159 _Is_concrete_vertex () : 00160 m_topol_traits (NULL) 00161 {} 00162 00163 _Is_concrete_vertex (const Topology_traits * topol_traits) : 00164 m_topol_traits (topol_traits) 00165 {} 00166 00167 bool operator() (const DVertex& v) const 00168 { 00169 if (m_topol_traits == NULL) 00170 return (true); 00171 00172 return (m_topol_traits->is_concrete_vertex (&v)); 00173 } 00174 }; 00175 00179 class _Is_valid_vertex 00180 { 00181 private: 00182 00183 const Topology_traits * m_topol_traits; 00184 00185 public: 00186 00187 _Is_valid_vertex () : 00188 m_topol_traits (NULL) 00189 {} 00190 00191 _Is_valid_vertex (const Topology_traits * topol_traits) : 00192 m_topol_traits (topol_traits) 00193 {} 00194 00195 bool operator() (const DVertex& v) const 00196 { 00197 if (m_topol_traits == NULL) 00198 return (true); 00199 00200 return (m_topol_traits->is_valid_vertex (&v)); 00201 } 00202 }; 00203 00207 class _Is_valid_halfedge 00208 { 00209 private: 00210 00211 const Topology_traits *m_topol_traits; 00212 00213 public: 00214 00215 _Is_valid_halfedge () : 00216 m_topol_traits (NULL) 00217 {} 00218 00219 _Is_valid_halfedge (const Topology_traits * topol_traits) : 00220 m_topol_traits (topol_traits) 00221 {} 00222 00223 bool operator() (const DHalfedge& he) const 00224 { 00225 if (m_topol_traits == NULL) 00226 return (true); 00227 00228 return (m_topol_traits->is_valid_halfedge (&he)); 00229 } 00230 }; 00231 00235 class _Is_valid_face 00236 { 00237 private: 00238 00239 const Topology_traits *m_topol_traits; 00240 00241 public: 00242 00243 _Is_valid_face () : 00244 m_topol_traits (NULL) 00245 {} 00246 00247 _Is_valid_face (const Topology_traits * topol_traits) : 00248 m_topol_traits (topol_traits) 00249 {} 00250 00251 bool operator() (const DFace& f) const 00252 { 00253 if (m_topol_traits == NULL) 00254 return (true); 00255 00256 return (m_topol_traits->is_valid_face (&f)); 00257 } 00258 }; 00259 00263 class _Is_unbounded_face 00264 { 00265 private: 00266 00267 const Topology_traits * m_topol_traits; 00268 00269 public: 00270 00271 _Is_unbounded_face () : 00272 m_topol_traits (NULL) 00273 {} 00274 00275 _Is_unbounded_face (const Topology_traits * topol_traits) : 00276 m_topol_traits (topol_traits) 00277 {} 00278 00279 const Topology_traits * topology_traits() const { return m_topol_traits; } 00280 00281 bool operator() (const DFace& f) const 00282 { 00283 return (m_topol_traits->is_valid_face (&f) && 00284 m_topol_traits->is_unbounded (&f)); 00285 } 00286 }; 00287 00288 public: 00289 00290 // Forward declerations: 00291 class Vertex; 00292 class Halfedge; 00293 class Face; 00294 00295 // Definition of the halfedge data-structure itereators and circulators: 00296 typedef I_Filtered_iterator 00297 <DVertex_iter, _Is_concrete_vertex, 00298 Vertex, DDifference, 00299 DIterator_category> Vertex_iterator; 00300 00301 typedef I_Filtered_const_iterator 00302 <DVertex_const_iter, _Is_concrete_vertex, 00303 DVertex_iter, Vertex, 00304 DDifference, DIterator_category> Vertex_const_iterator; 00305 00306 typedef I_Filtered_iterator 00307 <DHalfedge_iter, _Is_valid_halfedge, 00308 Halfedge, DDifference, 00309 DIterator_category> Halfedge_iterator; 00310 00311 typedef I_Filtered_const_iterator 00312 <DHalfedge_const_iter, _Is_valid_halfedge, 00313 DHalfedge_iter, Halfedge, DDifference, 00314 DIterator_category> Halfedge_const_iterator; 00315 00320 class Edge_iterator : 00321 public I_Filtered_iterator<DEdge_iter, _Is_valid_halfedge, 00322 Halfedge, DDifference, 00323 DIterator_category> 00324 { 00325 typedef I_Filtered_iterator<DEdge_iter, 00326 _Is_valid_halfedge, 00327 Halfedge, DDifference, 00328 DIterator_category> Base; 00329 00330 public: 00331 00332 Edge_iterator () 00333 {} 00334 00335 Edge_iterator (DEdge_iter iter, DEdge_iter iend, 00336 const _Is_valid_halfedge& pred) : 00337 Base (iter, iend, pred) 00338 {} 00339 00340 // Casting to a halfedge iterator. 00341 operator Halfedge_iterator () const 00342 { 00343 return (Halfedge_iterator (DHalfedge_iter (this->current_iterator()))); 00344 } 00345 00346 operator Halfedge_const_iterator () const 00347 { 00348 return (Halfedge_const_iterator 00349 (DHalfedge_const_iter (this->current_iterator()))); 00350 } 00351 }; 00352 00353 class Edge_const_iterator : 00354 public I_Filtered_const_iterator<DEdge_const_iter, 00355 _Is_valid_halfedge, 00356 DEdge_iter, 00357 Halfedge, DDifference, 00358 DIterator_category> 00359 { 00360 typedef I_Filtered_const_iterator<DEdge_const_iter, 00361 _Is_valid_halfedge, 00362 DEdge_iter, 00363 Halfedge, DDifference, 00364 DIterator_category> Base; 00365 00366 public: 00367 00368 Edge_const_iterator () 00369 {} 00370 00371 Edge_const_iterator (Edge_iterator iter) : 00372 Base (iter.current_iterator(), 00373 iter.past_the_end(), 00374 iter.filter()) 00375 {} 00376 00377 Edge_const_iterator (DEdge_const_iter iter, DEdge_const_iter iend, 00378 const _Is_valid_halfedge& pred) : 00379 Base (iter, iend, pred) 00380 {} 00381 00382 // Casting to a halfedge iterator. 00383 operator Halfedge_const_iterator () const 00384 { 00385 return (Halfedge_const_iterator 00386 (DHalfedge_const_iter (this->current_iterator()))); 00387 } 00388 }; 00389 00390 typedef I_Filtered_iterator 00391 <DFace_iter, _Is_valid_face, 00392 Face, DDifference, 00393 DIterator_category> Face_iterator; 00394 00395 typedef I_Filtered_const_iterator 00396 <DFace_const_iter, _Is_valid_face, 00397 DFace_iter, Face, 00398 DDifference, DIterator_category> Face_const_iterator; 00399 00400 typedef _HalfedgeDS_vertex_circ 00401 <Halfedge, Halfedge_iterator, 00402 Bidirectional_circulator_tag> Halfedge_around_vertex_circulator; 00403 00404 typedef _HalfedgeDS_vertex_const_circ 00405 <Halfedge, 00406 Halfedge_const_iterator, 00407 Bidirectional_circulator_tag> Halfedge_around_vertex_const_circulator; 00408 00409 typedef _HalfedgeDS_facet_circ 00410 <Halfedge, 00411 Halfedge_iterator, 00412 Bidirectional_circulator_tag> Ccb_halfedge_circulator; 00413 00414 typedef _HalfedgeDS_facet_const_circ 00415 <Halfedge, 00416 Halfedge_const_iterator, 00417 Bidirectional_circulator_tag> Ccb_halfedge_const_circulator; 00418 00423 class Unbounded_face_iterator : 00424 public I_Filtered_iterator<DFace_iter, _Is_unbounded_face, 00425 Face, DDifference, 00426 DIterator_category> 00427 { 00428 typedef I_Filtered_iterator<DFace_iter, 00429 _Is_unbounded_face, 00430 Face, DDifference, 00431 DIterator_category> Base; 00432 00433 public: 00434 00435 Unbounded_face_iterator () 00436 {} 00437 00438 Unbounded_face_iterator (DFace_iter iter, DFace_iter iend, 00439 const _Is_unbounded_face & is_unbounded) : 00440 Base (iter, iend, is_unbounded) 00441 {} 00442 00443 // Casting to a face iterator. 00444 operator Face_iterator () const 00445 { 00446 return (Face_iterator (DFace_iter (this->current_iterator()), 00447 DFace_iter (this->past_the_end()), 00448 _Is_valid_face(this->filter().topology_traits()))); 00449 } 00450 00451 operator Face_const_iterator () const 00452 { 00453 return (Face_const_iterator 00454 (DFace_const_iter (this->current_iterator()), 00455 DFace_const_iter (this->past_the_end()), 00456 _Is_valid_face(this->filter().topology_traits()))); 00457 } 00458 }; 00459 00460 class Unbounded_face_const_iterator : 00461 public I_Filtered_const_iterator<DFace_const_iter, 00462 _Is_unbounded_face, 00463 DFace_iter, Face, 00464 DDifference, 00465 DIterator_category> 00466 { 00467 typedef I_Filtered_const_iterator<DFace_const_iter, 00468 _Is_unbounded_face, 00469 DFace_iter, Face, 00470 DDifference, 00471 DIterator_category> Base; 00472 00473 public: 00474 00475 Unbounded_face_const_iterator () 00476 {} 00477 00478 Unbounded_face_const_iterator (Unbounded_face_iterator iter) : 00479 Base (iter) 00480 {} 00481 00482 Unbounded_face_const_iterator (DFace_const_iter iter, 00483 DFace_const_iter iend, 00484 const _Is_unbounded_face & is_unbounded) : 00485 Base (iter, iend, is_unbounded) 00486 {} 00487 00488 // Casting to a face iterator. 00489 operator Face_const_iterator () const 00490 { 00491 return (Face_const_iterator (DFace_const_iter(this->current_iterator()), 00492 DFace_const_iter(this->past_the_end()))); 00493 } 00494 }; 00495 00496 protected: 00497 00498 struct _Halfedge_to_ccb_circulator 00499 { 00500 typedef DHalfedge* argument_type; 00501 typedef Ccb_halfedge_circulator result_type; 00502 00503 result_type operator() (argument_type s) const 00504 { 00505 return Ccb_halfedge_circulator (Halfedge_iterator (s)); 00506 } 00507 }; 00508 00509 struct _Const_halfedge_to_ccb_circulator 00510 { 00511 typedef const DHalfedge* argument_type; 00512 typedef Ccb_halfedge_const_circulator result_type; 00513 00514 result_type operator() (argument_type s) const 00515 { 00516 return Ccb_halfedge_const_circulator (Halfedge_const_iterator (s)); 00517 } 00518 }; 00519 00520 typedef Cast_function_object<DVertex, Vertex> _Vertex_to_vertex; 00521 00522 public: 00523 00524 typedef Iterator_transform<DOuter_ccb_iter, 00525 _Halfedge_to_ccb_circulator> 00526 Outer_ccb_iterator; 00527 00528 typedef Iterator_transform<DOuter_ccb_const_iter, 00529 _Const_halfedge_to_ccb_circulator> 00530 Outer_ccb_const_iterator; 00531 00532 typedef Iterator_transform<DInner_ccb_iter, 00533 _Halfedge_to_ccb_circulator> 00534 Inner_ccb_iterator; 00535 00536 typedef Iterator_transform<DInner_ccb_const_iter, 00537 _Const_halfedge_to_ccb_circulator> 00538 Inner_ccb_const_iterator; 00539 00544 class Isolated_vertex_iterator : 00545 public Iterator_project<DIso_vertex_iter, 00546 _Vertex_to_vertex> 00547 { 00548 typedef Iterator_project<DIso_vertex_iter, 00549 _Vertex_to_vertex> Base; 00550 00551 public: 00552 00553 Isolated_vertex_iterator () 00554 {} 00555 00556 Isolated_vertex_iterator (DIso_vertex_iter iter) : 00557 Base (iter) 00558 {} 00559 00560 // Casting to a vertex iterator. 00561 operator Vertex_iterator () const 00562 { 00563 return (Vertex_iterator (DVertex_iter (this->ptr()))); 00564 } 00565 00566 operator Vertex_const_iterator () const 00567 { 00568 return (Vertex_const_iterator (DVertex_const_iter (this->ptr()))); 00569 } 00570 }; 00571 00572 class Isolated_vertex_const_iterator : 00573 public Iterator_project<DIso_vertex_const_iter, 00574 _Vertex_to_vertex> 00575 { 00576 typedef Iterator_project<DIso_vertex_const_iter, 00577 _Vertex_to_vertex> Base; 00578 00579 public: 00580 00581 Isolated_vertex_const_iterator () 00582 {} 00583 00584 Isolated_vertex_const_iterator (Isolated_vertex_iterator iter) : 00585 Base (iter) 00586 {} 00587 00588 Isolated_vertex_const_iterator (DIso_vertex_const_iter iter) : 00589 Base (iter) 00590 {} 00591 00592 // Casting to a vertex iterator. 00593 operator Vertex_const_iterator () const 00594 { 00595 return (Vertex_const_iterator (DVertex_const_iter (this->ptr()))); 00596 } 00597 }; 00598 00599 protected: 00600 00601 class _Valid_vertex_iterator : 00602 public I_Filtered_iterator<DVertex_iter, 00603 _Is_valid_vertex, Vertex, 00604 DDifference, 00605 DIterator_category> 00606 { 00607 typedef I_Filtered_iterator<DVertex_iter, 00608 _Is_valid_vertex, Vertex, 00609 DDifference, 00610 DIterator_category> Base; 00611 00612 public: 00613 00614 _Valid_vertex_iterator () 00615 {} 00616 00617 _Valid_vertex_iterator (DVertex_iter iter, DVertex_iter iend, 00618 const _Is_valid_vertex& pred) : 00619 Base (iter, iend, pred) 00620 {} 00621 00622 // Casting to a vertex iterator. 00623 operator Vertex_iterator () const 00624 { 00625 return (Vertex_iterator (DVertex_iter (this->current_iterator()))); 00626 } 00627 00628 operator Vertex_const_iterator () const 00629 { 00630 return (Vertex_const_iterator (DVertex_const_iter 00631 (this->current_iterator()))); 00632 } 00633 }; 00634 00635 public: 00636 00637 // Definition of handles (equivalent to iterators): 00638 typedef Vertex_iterator Vertex_handle; 00639 typedef Halfedge_iterator Halfedge_handle; 00640 typedef Face_iterator Face_handle; 00641 00642 typedef Vertex_const_iterator Vertex_const_handle; 00643 typedef Halfedge_const_iterator Halfedge_const_handle; 00644 typedef Face_const_iterator Face_const_handle; 00645 00649 class Vertex : public DVertex 00650 { 00651 typedef DVertex Base; 00652 00653 public: 00654 00656 Vertex() 00657 {} 00658 00660 CGAL_DEPRECATED bool is_at_infinity() const 00661 { return (Base::has_null_point()); } 00662 00664 bool is_at_open_boundary () const 00665 { 00666 return (Base::has_null_point()); 00667 } 00668 00670 Size degree () const 00671 { 00672 if (this->is_isolated()) 00673 return (0); 00674 00675 // Go around the vertex and count the incident halfedges. 00676 const DHalfedge *he_first = Base::halfedge(); 00677 const DHalfedge *he_curr = he_first; 00678 Size n = 0; 00679 00680 if (he_curr != NULL) 00681 { 00682 do 00683 { 00684 n++; 00685 he_curr = he_curr->next()->opposite(); 00686 } while (he_curr != he_first); 00687 } 00688 return (n); 00689 } 00690 00695 Halfedge_around_vertex_circulator incident_halfedges() 00696 { 00697 CGAL_precondition (! this->is_isolated()); 00698 00699 return Halfedge_around_vertex_circulator 00700 (DHalfedge_iter (Base::halfedge())); 00701 } 00702 00707 Halfedge_around_vertex_const_circulator incident_halfedges() const 00708 { 00709 CGAL_precondition (! this->is_isolated()); 00710 00711 return Halfedge_around_vertex_const_circulator 00712 (DHalfedge_const_iter (Base::halfedge())); 00713 } 00714 00719 Face_handle face() 00720 { 00721 CGAL_precondition (this->is_isolated()); 00722 00723 return (DFace_iter (Base::isolated_vertex()->face())); 00724 } 00725 00730 Face_const_handle face() const 00731 { 00732 CGAL_precondition (this->is_isolated()); 00733 00734 return (DFace_const_iter (Base::isolated_vertex()->face())); 00735 } 00736 00737 private: 00738 00739 // Blocking access to inherited functions from the Dcel::Vertex. 00740 bool has_null_point () const; 00741 void set_point (Point_2* ); 00742 void set_boundary (Arr_parameter_space , Arr_parameter_space ); 00743 const DHalfedge* halfedge () const; 00744 DHalfedge* halfedge (); 00745 void set_halfedge (DHalfedge* ); 00746 const DIso_vertex* isolated_vertex () const; 00747 DIso_vertex* isolated_vertex (); 00748 void set_isolated_vertex (DIso_vertex* ); 00749 }; 00750 00754 class Halfedge : public DHalfedge 00755 { 00756 typedef DHalfedge Base; 00757 00758 public: 00759 00761 Halfedge () 00762 {} 00763 00765 bool is_fictitious () const 00766 { 00767 return (Base::has_null_curve()); 00768 } 00769 00771 Vertex_handle source () 00772 { 00773 return (DVertex_iter (Base::opposite()->vertex())); 00774 } 00775 00777 Vertex_const_handle source () const 00778 { 00779 return (DVertex_const_iter (Base::opposite()->vertex())); 00780 } 00781 00783 Vertex_handle target () 00784 { 00785 return (DVertex_iter (Base::vertex())); 00786 } 00787 00789 Vertex_const_handle target () const 00790 { 00791 return (DVertex_const_iter (Base::vertex())); 00792 } 00793 00795 Face_handle face() 00796 { 00797 if (! Base::is_on_inner_ccb()) 00798 return (DFace_iter (Base::outer_ccb()->face())); 00799 else 00800 return (DFace_iter (Base::inner_ccb()->face())); 00801 } 00802 00804 Face_const_handle face() const 00805 { 00806 if (! Base::is_on_inner_ccb()) 00807 return (DFace_const_iter (Base::outer_ccb()->face())); 00808 else 00809 return (DFace_const_iter (Base::inner_ccb()->face())); 00810 } 00811 00813 Halfedge_handle twin() 00814 { 00815 return (DHalfedge_iter (Base::opposite())); 00816 } 00817 00819 Halfedge_const_handle twin() const 00820 { 00821 return (DHalfedge_const_iter (Base::opposite())); 00822 } 00823 00825 Halfedge_handle prev () 00826 { 00827 return (DHalfedge_iter (Base::prev())); 00828 } 00829 00831 Halfedge_const_handle prev () const 00832 { 00833 return (DHalfedge_const_iter (Base::prev())); 00834 } 00835 00837 Halfedge_handle next () 00838 { 00839 return (DHalfedge_iter (Base::next())); 00840 } 00841 00843 Halfedge_const_handle next () const 00844 { 00845 return (DHalfedge_const_iter (Base::next())); 00846 } 00847 00849 Ccb_halfedge_circulator ccb () 00850 { 00851 return Ccb_halfedge_circulator (DHalfedge_iter (this)); 00852 } 00853 00855 Ccb_halfedge_const_circulator ccb () const 00856 { 00857 return Ccb_halfedge_const_circulator (DHalfedge_const_iter (this)); 00858 } 00859 00860 private: 00861 00862 // Blocking access to inherited functions from the Dcel::Halfedge. 00863 bool has_null_curve () const; 00864 void set_curve (X_monotone_curve_2* ); 00865 const DHalfedge* opposite () const; 00866 DHalfedge* opposite (); 00867 void set_opposite (DHalfedge* ); 00868 void set_direction (Arr_halfedge_direction ); 00869 void set_prev (DHalfedge* ); 00870 void set_next (DHalfedge* ); 00871 const DVertex* vertex () const ; 00872 DVertex* vertex (); 00873 void set_vertex (DVertex* ); 00874 const DOuter_ccb* outer_ccb () const; 00875 DOuter_ccb* outer_ccb (); 00876 void set_outer_ccb (DOuter_ccb* ); 00877 const DInner_ccb* inner_ccb () const; 00878 DInner_ccb* inner_ccb (); 00879 void set_inner_ccb (DInner_ccb* ); 00880 }; 00881 00885 class Face : public DFace 00886 { 00887 typedef DFace Base; 00888 00889 public: 00890 00892 Face() 00893 {} 00894 00896 Outer_ccb_iterator outer_ccbs_begin() 00897 { 00898 return (DOuter_ccb_iter (Base::outer_ccbs_begin())); 00899 } 00900 00902 Outer_ccb_const_iterator outer_ccbs_begin() const 00903 { 00904 return (DOuter_ccb_const_iter (Base::outer_ccbs_begin())); 00905 } 00906 00908 Outer_ccb_iterator outer_ccbs_end() 00909 { 00910 return (DOuter_ccb_iter (Base::outer_ccbs_end())); 00911 } 00912 00914 Outer_ccb_const_iterator outer_ccbs_end() const 00915 { 00916 return (DOuter_ccb_const_iter (Base::outer_ccbs_end())); 00917 } 00918 00919 00921 Inner_ccb_iterator inner_ccbs_begin() 00922 { 00923 return (DInner_ccb_iter (Base::inner_ccbs_begin())); 00924 } 00925 00927 Inner_ccb_const_iterator inner_ccbs_begin() const 00928 { 00929 return (DInner_ccb_const_iter (Base::inner_ccbs_begin())); 00930 } 00931 00933 Inner_ccb_iterator inner_ccbs_end() 00934 { 00935 return (DInner_ccb_iter (Base::inner_ccbs_end())); 00936 } 00937 00939 Inner_ccb_const_iterator inner_ccbs_end() const 00940 { 00941 return (DInner_ccb_const_iter (Base::inner_ccbs_end())); 00942 } 00943 00944 00947 Isolated_vertex_iterator isolated_vertices_begin () 00948 { 00949 return (DIso_vertex_iter (Base::isolated_vertices_begin())); 00950 } 00951 00954 Isolated_vertex_const_iterator isolated_vertices_begin () const 00955 { 00956 return (DIso_vertex_const_iter (Base::isolated_vertices_begin())); 00957 } 00958 00961 Isolated_vertex_iterator isolated_vertices_end () 00962 { 00963 return (DIso_vertex_iter (Base::isolated_vertices_end())); 00964 } 00965 00968 Isolated_vertex_const_iterator isolated_vertices_end () const 00969 { 00970 return (DIso_vertex_const_iter (Base::isolated_vertices_end())); 00971 } 00972 00974 00975 00980 Ccb_halfedge_circulator outer_ccb () 00981 { 00982 CGAL_precondition (Base::number_of_outer_ccbs() == 1); 00983 00984 DOuter_ccb_iter iter = Base::outer_ccbs_begin(); 00985 DHalfedge *he = *iter; 00986 00987 return Ccb_halfedge_circulator (DHalfedge_iter (he)); 00988 } 00989 00994 Ccb_halfedge_const_circulator outer_ccb () const 00995 { 00996 CGAL_precondition (Base::number_of_outer_ccbs() == 1); 00997 00998 DOuter_ccb_const_iter iter = Base::outer_ccbs_begin(); 00999 const DHalfedge *he = *iter; 01000 01001 return Ccb_halfedge_const_circulator (DHalfedge_const_iter (he)); 01002 } 01003 01005 Size number_of_holes () const 01006 { 01007 return (Base::number_of_inner_ccbs()); 01008 } 01009 01011 Inner_ccb_iterator holes_begin() 01012 { 01013 return (this->inner_ccbs_begin()); 01014 } 01015 01017 Inner_ccb_const_iterator holes_begin() const 01018 { 01019 return (this->inner_ccbs_begin()); 01020 } 01021 01023 Inner_ccb_iterator holes_end() 01024 { 01025 return (this->inner_ccbs_end()); 01026 } 01027 01029 Inner_ccb_const_iterator holes_end() const 01030 { 01031 return (this->inner_ccbs_end()); 01032 } 01034 01035 private: 01036 01037 // Blocking access to inherited functions from the Dcel::Face. 01038 void set_unbounded (bool ); 01039 void set_fictitious (bool ); 01040 void add_outer_ccb (DOuter_ccb*, Halfedge* ); 01041 void erase_outer_ccb (DOuter_ccb* ); 01042 void add_inner_ccb (DInner_ccb*, Halfedge* ); 01043 void erase_inner_ccb (DInner_ccb* ); 01044 void add_isolated_vertex (DIso_vertex*, DVertex* ); 01045 void erase_isolated_vertex (DIso_vertex* ); 01046 }; 01047 01048 protected: 01049 01050 typedef CGAL_ALLOCATOR(Point_2) Points_alloc; 01051 typedef CGAL_ALLOCATOR(X_monotone_curve_2) Curves_alloc; 01052 01053 typedef Arr_observer<Self> Observer; 01054 typedef std::list<Observer*> Observers_container; 01055 typedef typename Observers_container::iterator Observers_iterator; 01056 01057 typedef typename Observers_container::reverse_iterator 01058 Observers_rev_iterator; 01059 01060 // Data members: 01061 Topology_traits m_topol_traits; // the topology traits. 01062 Points_alloc m_points_alloc; // allocator for the points. 01063 Curves_alloc m_curves_alloc; // allocator for the curves. 01064 Observers_container m_observers; // pointers to existing observers. 01065 const Traits_adaptor_2 * m_geom_traits; // the geometry-traits adaptor. 01066 bool m_own_traits; // inidicates whether the geometry 01067 // traits should be freed up. 01068 Arr_boundary_type m_boundary_types[4]; 01069 01070 public: 01071 01073 01074 01076 Arrangement_on_surface_2 (); 01077 01079 Arrangement_on_surface_2 (const Self & arr); 01080 01082 Arrangement_on_surface_2 (const Geometry_traits_2 * geom_traits); 01084 01086 01087 01089 Self& operator= (const Self & arr); 01090 01092 void assign (const Self & arr); 01094 01096 01097 01099 virtual ~Arrangement_on_surface_2 (); 01100 01102 virtual void clear(); 01104 01106 01107 01109 inline const Traits_adaptor_2 * traits_adaptor () const 01110 { 01111 return (m_geom_traits); 01112 } 01113 01115 inline const Geometry_traits_2 * geometry_traits () const 01116 { 01117 return (m_geom_traits); 01118 } 01119 01121 inline Topology_traits * topology_traits () 01122 { 01123 return (&m_topol_traits); 01124 } 01125 01127 inline const Topology_traits * topology_traits () const 01128 { 01129 return (&m_topol_traits); 01130 } 01132 01134 01135 01137 bool is_empty () const 01138 { 01139 return (m_topol_traits.is_empty_dcel()); 01140 } 01141 01147 bool is_valid() const; 01148 01150 Size number_of_vertices () const 01151 { 01152 return (m_topol_traits.number_of_concrete_vertices()); 01153 } 01154 01156 Size number_of_isolated_vertices () const 01157 { 01158 return (_dcel().size_of_isolated_vertices()); 01159 } 01160 01162 Size number_of_halfedges () const 01163 { 01164 return (m_topol_traits.number_of_valid_halfedges()); 01165 } 01166 01168 Size number_of_edges () const 01169 { 01170 return (m_topol_traits.number_of_valid_halfedges() / 2); 01171 } 01172 01174 Size number_of_faces () const 01175 { 01176 return (m_topol_traits.number_of_valid_faces()); 01177 } 01178 01180 Size number_of_unbounded_faces () const 01181 { 01182 Unbounded_face_const_iterator iter = unbounded_faces_begin(); 01183 Unbounded_face_const_iterator end = unbounded_faces_end(); 01184 Size n_unb = 0; 01185 01186 while (iter != end) 01187 { 01188 n_unb++; 01189 ++iter; 01190 } 01191 01192 return (n_unb); 01193 } 01195 01197 01198 01200 Vertex_iterator vertices_begin() 01201 { 01202 return (Vertex_iterator (_dcel().vertices_begin(), 01203 _dcel().vertices_end(), 01204 _Is_concrete_vertex (&m_topol_traits))); 01205 } 01206 01208 Vertex_iterator vertices_end() 01209 { 01210 return (Vertex_iterator (_dcel().vertices_end(), 01211 _dcel().vertices_end(), 01212 _Is_concrete_vertex (&m_topol_traits))); 01213 } 01214 01216 Vertex_const_iterator vertices_begin() const 01217 { 01218 return (Vertex_const_iterator (_dcel().vertices_begin(), 01219 _dcel().vertices_end(), 01220 _Is_concrete_vertex (&m_topol_traits))); 01221 } 01222 01224 Vertex_const_iterator vertices_end() const 01225 { 01226 return (Vertex_const_iterator (_dcel().vertices_end(), 01227 _dcel().vertices_end(), 01228 _Is_concrete_vertex (&m_topol_traits))); 01229 } 01231 01233 01234 01236 Halfedge_iterator halfedges_begin() 01237 { 01238 return (Halfedge_iterator (_dcel().halfedges_begin(), 01239 _dcel().halfedges_end(), 01240 _Is_valid_halfedge (&m_topol_traits))); 01241 } 01242 01244 Halfedge_iterator halfedges_end() 01245 { 01246 return (Halfedge_iterator (_dcel().halfedges_end(), 01247 _dcel().halfedges_end(), 01248 _Is_valid_halfedge (&m_topol_traits))); 01249 } 01250 01252 Halfedge_const_iterator halfedges_begin() const 01253 { 01254 return (Halfedge_const_iterator (_dcel().halfedges_begin(), 01255 _dcel().halfedges_end(), 01256 _Is_valid_halfedge (&m_topol_traits))); 01257 } 01258 01260 Halfedge_const_iterator halfedges_end() const 01261 { 01262 return (Halfedge_const_iterator (_dcel().halfedges_end(), 01263 _dcel().halfedges_end(), 01264 _Is_valid_halfedge (&m_topol_traits))); 01265 } 01267 01269 01270 01272 Edge_iterator edges_begin() 01273 { 01274 return (Edge_iterator (_dcel().edges_begin(), 01275 _dcel().edges_end(), 01276 _Is_valid_halfedge (&m_topol_traits))); 01277 } 01278 01280 Edge_iterator edges_end() 01281 { 01282 return (Edge_iterator (_dcel().edges_end(), 01283 _dcel().edges_end(), 01284 _Is_valid_halfedge (&m_topol_traits))); 01285 } 01286 01288 Edge_const_iterator edges_begin() const 01289 { 01290 return (Edge_const_iterator (_dcel().edges_begin(), 01291 _dcel().edges_end(), 01292 _Is_valid_halfedge (&m_topol_traits))); 01293 } 01294 01296 Edge_const_iterator edges_end() const 01297 { 01298 return (Edge_const_iterator (_dcel().edges_end(), 01299 _dcel().edges_end(), 01300 _Is_valid_halfedge (&m_topol_traits))); 01301 } 01303 01305 01306 01308 Face_iterator faces_begin() 01309 { 01310 return (Face_iterator (_dcel().faces_begin(), 01311 _dcel().faces_end(), 01312 _Is_valid_face (&m_topol_traits))); 01313 } 01314 01316 Face_iterator faces_end() 01317 { 01318 return (Face_iterator (_dcel().faces_end(), 01319 _dcel().faces_end(), 01320 _Is_valid_face (&m_topol_traits))); 01321 } 01322 01324 Face_const_iterator faces_begin() const 01325 { 01326 return (Face_const_iterator (_dcel().faces_begin(), 01327 _dcel().faces_end(), 01328 _Is_valid_face (&m_topol_traits))); 01329 } 01330 01332 Face_const_iterator faces_end() const 01333 { 01334 return (Face_const_iterator (_dcel().faces_end(), 01335 _dcel().faces_end(), 01336 _Is_valid_face (&m_topol_traits))); 01337 } 01338 01340 01345 Face_const_handle reference_face() const 01346 { 01347 return _const_handle_for(this->topology_traits()->reference_face()); 01348 } 01349 01351 01356 Face_handle reference_face() 01357 { 01358 return _handle_for(this->topology_traits()->reference_face()); 01359 } 01360 01362 01364 01365 01367 Unbounded_face_iterator unbounded_faces_begin() 01368 { 01369 return Unbounded_face_iterator(_dcel().faces_begin(), 01370 _dcel().faces_end(), 01371 _Is_unbounded_face (&m_topol_traits)); 01372 } 01373 01375 Unbounded_face_iterator unbounded_faces_end() 01376 { 01377 return Unbounded_face_iterator(_dcel().faces_end(), 01378 _dcel().faces_end(), 01379 _Is_unbounded_face (&m_topol_traits)); 01380 } 01381 01383 Unbounded_face_const_iterator unbounded_faces_begin() const 01384 { 01385 return Unbounded_face_const_iterator(_dcel().faces_begin(), 01386 _dcel().faces_end(), 01387 _Is_unbounded_face (&m_topol_traits)); 01388 } 01389 01391 Unbounded_face_const_iterator unbounded_faces_end() const 01392 { 01393 return Unbounded_face_const_iterator(_dcel().faces_end(), 01394 _dcel().faces_end(), 01395 _Is_unbounded_face (&m_topol_traits)); 01396 } 01398 01400 01401 Vertex_handle non_const_handle (Vertex_const_handle vh) 01402 { 01403 DVertex *p_v = (DVertex*) &(*vh); 01404 return (Vertex_handle (p_v)); 01405 } 01406 01407 Halfedge_handle non_const_handle (Halfedge_const_handle hh) 01408 { 01409 DHalfedge *p_he = (DHalfedge*) &(*hh); 01410 return (Halfedge_handle (p_he)); 01411 } 01412 01413 Face_handle non_const_handle (Face_const_handle fh) 01414 { 01415 DFace *p_f = (DFace*) &(*fh); 01416 return (Face_handle (p_f)); 01417 } 01419 01421 01422 01430 Vertex_handle insert_in_face_interior (const Point_2& p, 01431 Face_handle f); 01432 01441 Halfedge_handle insert_in_face_interior (const X_monotone_curve_2& cv, 01442 Face_handle f); 01443 01454 Halfedge_handle insert_from_left_vertex (const X_monotone_curve_2& cv, 01455 Vertex_handle v, 01456 Face_handle f = Face_handle()); 01457 01469 Halfedge_handle insert_from_left_vertex (const X_monotone_curve_2& cv, 01470 Halfedge_handle prev); 01471 01482 Halfedge_handle insert_from_right_vertex (const X_monotone_curve_2& cv, 01483 Vertex_handle v, 01484 Face_handle f = Face_handle()); 01485 01498 Halfedge_handle insert_from_right_vertex (const X_monotone_curve_2& cv, 01499 Halfedge_handle prev); 01500 01513 Halfedge_handle insert_at_vertices (const X_monotone_curve_2& cv, 01514 Vertex_handle v1, 01515 Vertex_handle v2, 01516 Face_handle f = Face_handle()); 01517 01529 Halfedge_handle insert_at_vertices (const X_monotone_curve_2& cv, 01530 Halfedge_handle h1, 01531 Vertex_handle v2); 01532 01544 Halfedge_handle insert_at_vertices (const X_monotone_curve_2 & cv, 01545 Halfedge_handle prev1, 01546 Halfedge_handle prev2); 01547 01549 01551 01552 01561 Vertex_handle modify_vertex (Vertex_handle v, 01562 const Point_2& p); 01563 01570 Face_handle remove_isolated_vertex (Vertex_handle v); 01571 01573 01575 01576 01585 Halfedge_handle modify_edge (Halfedge_handle e, 01586 const X_monotone_curve_2& cv); 01587 01601 Halfedge_handle split_edge (Halfedge_handle e, 01602 const X_monotone_curve_2& cv1, 01603 const X_monotone_curve_2& cv2); 01604 01613 Halfedge_handle merge_edge (Halfedge_handle e1, 01614 Halfedge_handle e2, 01615 const X_monotone_curve_2& cv); 01616 01626 Face_handle remove_edge (Halfedge_handle e, 01627 bool remove_source = true, 01628 bool remove_target = true); 01629 01631 01632 protected: 01633 01635 01636 01643 inline bool is_open(Arr_parameter_space ps_x, Arr_parameter_space ps_y) 01644 const 01645 { 01646 return 01647 (((ps_x != ARR_INTERIOR) && (m_boundary_types[ps_x] == ARR_OPEN)) || 01648 ((ps_y != ARR_INTERIOR) && (m_boundary_types[ps_y] == ARR_OPEN))); 01649 } 01650 01652 inline void init_boundary_types() 01653 { 01654 init_boundary_side(ARR_LEFT_BOUNDARY, Arr_left_side_tag()); 01655 init_boundary_side(ARR_BOTTOM_BOUNDARY, Arr_bottom_side_tag()); 01656 init_boundary_side(ARR_TOP_BOUNDARY, Arr_top_side_tag()); 01657 init_boundary_side(ARR_RIGHT_BOUNDARY, Arr_right_side_tag()); 01658 } 01659 01661 void init_boundary_side(Arr_parameter_space ps, Arr_oblivious_side_tag) 01662 { 01663 m_boundary_types[ps] = ARR_OBLIVIOUS; 01664 } 01665 01667 void init_boundary_side(Arr_parameter_space ps, Arr_open_side_tag) 01668 { 01669 m_boundary_types[ps] = ARR_OPEN; 01670 } 01671 01673 void init_boundary_side(Arr_parameter_space ps, Arr_closed_side_tag) 01674 { 01675 m_boundary_types[ps] = ARR_CLOSED; 01676 } 01677 01679 void init_boundary_side(Arr_parameter_space ps, Arr_contracted_side_tag) 01680 { 01681 m_boundary_types[ps] = ARR_CONTRACTION; 01682 } 01683 01685 void init_boundary_side(Arr_parameter_space ps, 01686 Arr_identified_side_tag) 01687 { 01688 m_boundary_types[ps] = ARR_IDENTIFICATION; 01689 } 01690 01692 Point_2 *_new_point (const Point_2& pt) 01693 { 01694 Point_2 *p_pt = m_points_alloc.allocate (1); 01695 01696 m_points_alloc.construct (p_pt, pt); 01697 return (p_pt); 01698 } 01699 01701 void _delete_point (Point_2& pt) 01702 { 01703 Point_2 *p_pt = &pt; 01704 01705 m_points_alloc.destroy (p_pt); 01706 m_points_alloc.deallocate (p_pt, 1); 01707 } 01708 01710 X_monotone_curve_2 *_new_curve (const X_monotone_curve_2& cv) 01711 { 01712 X_monotone_curve_2 *p_cv = m_curves_alloc.allocate (1); 01713 01714 m_curves_alloc.construct (p_cv, cv); 01715 return (p_cv); 01716 } 01717 01719 void _delete_curve (X_monotone_curve_2& cv) 01720 { 01721 X_monotone_curve_2 *p_cv = &cv; 01722 01723 m_curves_alloc.destroy (p_cv); 01724 m_curves_alloc.deallocate (p_cv, 1); 01725 } 01727 01729 01730 01732 inline Dcel& _dcel () 01733 { 01734 return (m_topol_traits.dcel()); 01735 } 01736 01738 inline const Dcel& _dcel () const 01739 { 01740 return (m_topol_traits.dcel()); 01741 } 01742 01744 inline DVertex* _vertex (Vertex_handle vh) const 01745 { 01746 return (&(*vh)); 01747 } 01748 01750 inline const DVertex* _vertex (Vertex_const_handle vh) const 01751 { 01752 return (&(*vh)); 01753 } 01754 01756 inline DHalfedge* _halfedge (Halfedge_handle hh) const 01757 { 01758 return (&(*hh)); 01759 } 01760 01762 inline const DHalfedge* _halfedge (Halfedge_const_handle hh) const 01763 { 01764 return (&(*hh)); 01765 } 01766 01768 inline DFace* _face (Face_handle fh) const 01769 { 01770 return (&(*fh)); 01771 } 01772 01774 inline const DFace* _face (Face_const_handle fh) const 01775 { 01776 return (&(*fh)); 01777 } 01779 01781 01782 01784 Vertex_handle _handle_for (DVertex *v) 01785 { 01786 return (Vertex_handle (v)); 01787 } 01788 01790 Vertex_const_handle _const_handle_for (const DVertex *v) const 01791 { 01792 return (Vertex_const_handle (v)); 01793 } 01794 01796 Halfedge_handle _handle_for (DHalfedge *he) 01797 { 01798 return (Halfedge_handle (he)); 01799 } 01800 01801 01803 Halfedge_const_handle _const_handle_for (const DHalfedge *he) const 01804 { 01805 return (Halfedge_const_handle (he)); 01806 } 01807 01809 Face_handle _handle_for (DFace *f) 01810 { 01811 return (Face_handle (f)); 01812 } 01813 01815 Face_const_handle _const_handle_for (const DFace *f) const 01816 { 01817 return (Face_const_handle (f)); 01818 } 01820 01822 01823 01834 DHalfedge* _locate_around_vertex (DVertex *v, 01835 const X_monotone_curve_2& cv, 01836 Arr_curve_end ind) const; 01837 01846 unsigned int _halfedge_distance (const DHalfedge *e1, 01847 const DHalfedge *e2) const; 01848 01857 Comparison_result _compare_vertices_xy (const DVertex *v1, 01858 const DVertex *v2) const 01859 { 01860 return (_compare_vertices_xy_impl(v1, v2, Are_all_sides_oblivious_tag())); 01861 01862 } 01863 01864 Comparison_result 01865 _compare_vertices_xy_impl (const DVertex *v1, 01866 const DVertex *v2, 01867 Arr_all_sides_oblivious_tag) const 01868 { 01869 return (m_geom_traits->compare_xy_2_object() (v1->point(), v2->point())); 01870 } 01871 01872 Comparison_result 01873 _compare_vertices_xy_impl (const DVertex *v1, 01874 const DVertex *v2, 01875 Arr_not_all_sides_oblivious_tag) const; 01876 01892 std::pair <const DVertex*, const DHalfedge*> 01893 _find_leftmost_vertex_on_open_loop (const DHalfedge *he_before, 01894 const DHalfedge *he_after, 01895 const X_monotone_curve_2& cv, 01896 bool& is_perimetric) const; 01897 01909 std::pair<int, const DVertex*> 01910 _find_leftmost_vertex_on_closed_loop (const DHalfedge *he_anchor, 01911 bool& is_perimetric, 01912 bool& at_infinity) const; 01913 01929 bool _is_inside_new_face (const DHalfedge *prev1, 01930 const DHalfedge *prev2, 01931 const X_monotone_curve_2& cv) const; 01932 01939 void _move_outer_ccb (DFace *from_face, DFace *to_face, DHalfedge *he); 01940 01947 void _move_inner_ccb (DFace *from_face, DFace *to_face, DHalfedge *he); 01948 01954 void _insert_isolated_vertex (DFace *f, DVertex *v); 01955 01962 void _move_isolated_vertex (DFace *from_face, DFace *to_face, DVertex *v); 01963 01969 DVertex* _create_vertex (const Point_2& p); 01970 01980 DVertex* _create_boundary_vertex (const X_monotone_curve_2& cv, 01981 Arr_curve_end ind, 01982 Arr_parameter_space bx, 01983 Arr_parameter_space by); 01984 01997 DVertex* _place_and_set_curve_end (DFace *f, 01998 const X_monotone_curve_2& cv, 01999 Arr_curve_end ind, 02000 Arr_parameter_space bx, 02001 Arr_parameter_space by, 02002 DHalfedge **p_pred); 02003 02017 DHalfedge* _insert_in_face_interior (const X_monotone_curve_2& cv, 02018 DFace *f, 02019 DVertex *v1, DVertex *v2, 02020 Comparison_result res); 02021 02037 DHalfedge* _insert_from_vertex (const X_monotone_curve_2& cv, 02038 DHalfedge *prev, 02039 DVertex *v, 02040 Comparison_result res); 02041 02059 DHalfedge* _insert_at_vertices (const X_monotone_curve_2& cv, 02060 DHalfedge *prev1, 02061 DHalfedge *prev2, 02062 Comparison_result res, 02063 bool& new_face); 02064 02071 void _relocate_in_new_face (DHalfedge *new_he); 02072 02079 void _relocate_inner_ccbs_in_new_face (DHalfedge *new_he); 02080 02087 void _relocate_isolated_vertices_in_new_face (DHalfedge *new_he); 02088 02094 void _modify_vertex (DVertex *v, 02095 const Point_2& p); 02096 02102 void _modify_edge (DHalfedge *he, 02103 const X_monotone_curve_2& cv); 02104 02112 bool _are_equal (const DVertex *v, 02113 const X_monotone_curve_2& cv, Arr_curve_end ind) const; 02114 02127 DHalfedge* _split_edge (DHalfedge *e, 02128 const Point_2& p, 02129 const X_monotone_curve_2& cv1, 02130 const X_monotone_curve_2& cv2); 02131 02144 DHalfedge* _split_edge (DHalfedge *e, 02145 DVertex *v, 02146 const X_monotone_curve_2& cv1, 02147 const X_monotone_curve_2& cv2); 02148 02160 DFace *_remove_edge (DHalfedge *e, 02161 bool remove_source, bool remove_target); 02162 02169 void _remove_vertex_if_redundant (DVertex *v, DFace *f); 02170 02176 void _remove_isolated_vertex (DVertex* v); 02178 02180 02181 02183 bool _is_valid (Vertex_const_handle v) const; 02184 02186 bool _is_valid (Halfedge_const_handle he) const; 02187 02189 bool _is_valid (Face_const_handle f) const; 02190 02192 bool _is_outer_ccb_valid (const DOuter_ccb *oc, 02193 const DHalfedge *first) const; 02194 02196 bool _is_inner_ccb_valid (const DInner_ccb *ic, 02197 const DHalfedge *first) const; 02198 02203 bool _are_vertices_unique() const; 02204 02206 bool _are_curves_ordered_cw_around_vertrex (Vertex_const_handle v) const; 02207 02209 02210 protected: 02211 02213 02214 02219 void _register_observer (Observer *p_obs) 02220 { 02221 m_observers.push_back (p_obs); 02222 } 02223 02229 bool _unregister_observer (Observer *p_obs) 02230 { 02231 Observers_iterator iter; 02232 Observers_iterator end = m_observers.end(); 02233 02234 for (iter = m_observers.begin(); iter != end; ++iter) 02235 { 02236 if ((*iter) == p_obs) 02237 { 02238 // Remove the p_ob pointer from the list of observers. 02239 m_observers.erase (iter); 02240 return (true); 02241 } 02242 } 02243 02244 // If we reached here, the observer was not registered. 02245 return (false); 02246 } 02247 02248 protected: 02249 02250 /* Notify the observers on global arrangement operations: */ 02251 02252 void _notify_before_assign (const Self& arr) 02253 { 02254 Observers_iterator iter; 02255 Observers_iterator end = m_observers.end(); 02256 02257 for (iter = m_observers.begin(); iter != end; ++iter) 02258 (*iter)->before_assign (arr); 02259 } 02260 02261 void _notify_after_assign () 02262 { 02263 Observers_rev_iterator iter; 02264 Observers_rev_iterator end = m_observers.rend(); 02265 02266 for (iter = m_observers.rbegin(); iter != end; ++iter) 02267 (*iter)->after_assign(); 02268 } 02269 02270 void _notify_before_clear () 02271 { 02272 Observers_iterator iter; 02273 Observers_iterator end = m_observers.end(); 02274 02275 for (iter = m_observers.begin(); iter != end; ++iter) 02276 (*iter)->before_clear(); 02277 } 02278 02279 void _notify_after_clear () 02280 { 02281 Observers_rev_iterator iter; 02282 Observers_rev_iterator end = m_observers.rend(); 02283 02284 for (iter = m_observers.rbegin(); iter != end; ++iter) 02285 (*iter)->after_clear (); 02286 } 02287 02288 void _notify_before_global_change () 02289 { 02290 Observers_iterator iter; 02291 02292 Observers_iterator end = m_observers.end(); 02293 02294 for (iter = m_observers.begin(); iter != end; ++iter) 02295 (*iter)->before_global_change(); 02296 02297 } 02298 02299 void _notify_after_global_change () 02300 { 02301 Observers_rev_iterator iter; 02302 Observers_rev_iterator end = m_observers.rend(); 02303 02304 for (iter = m_observers.rbegin(); iter != end; ++iter) 02305 (*iter)->after_global_change(); 02306 } 02307 02308 /* Notify the observers on local changes in the arrangement: */ 02309 02310 void _notify_before_create_vertex (const Point_2& p) 02311 { 02312 Observers_iterator iter; 02313 Observers_iterator end = m_observers.end(); 02314 02315 for (iter = m_observers.begin(); iter != end; ++iter) 02316 (*iter)->before_create_vertex (p); 02317 } 02318 02319 void _notify_after_create_vertex (Vertex_handle v) 02320 { 02321 Observers_rev_iterator iter; 02322 Observers_rev_iterator end = m_observers.rend(); 02323 02324 for (iter = m_observers.rbegin(); iter != end; ++iter) 02325 (*iter)->after_create_vertex (v); 02326 } 02327 02328 void _notify_before_create_boundary_vertex (const X_monotone_curve_2& cv, 02329 Arr_curve_end ind, 02330 Arr_parameter_space bx, 02331 Arr_parameter_space by) 02332 { 02333 Observers_iterator iter; 02334 Observers_iterator end = m_observers.end(); 02335 02336 for (iter = m_observers.begin(); iter != end; ++iter) 02337 (*iter)->before_create_boundary_vertex (cv, ind, bx, by); 02338 } 02339 02340 void _notify_after_create_boundary_vertex (Vertex_handle v) 02341 { 02342 Observers_rev_iterator iter; 02343 Observers_rev_iterator end = m_observers.rend(); 02344 02345 for (iter = m_observers.rbegin(); iter != end; ++iter) 02346 (*iter)->after_create_boundary_vertex (v); 02347 } 02348 02349 void _notify_before_create_edge (const X_monotone_curve_2& c, 02350 Vertex_handle v1, Vertex_handle v2) 02351 { 02352 Observers_iterator iter; 02353 Observers_iterator end = m_observers.end(); 02354 02355 for (iter = m_observers.begin(); iter != end; ++iter) 02356 (*iter)->before_create_edge (c, v1, v2); 02357 } 02358 02359 void _notify_after_create_edge (Halfedge_handle e) 02360 { 02361 Observers_rev_iterator iter; 02362 Observers_rev_iterator end = m_observers.rend(); 02363 02364 for (iter = m_observers.rbegin(); iter != end; ++iter) 02365 (*iter)->after_create_edge (e); 02366 } 02367 02368 void _notify_before_modify_vertex (Vertex_handle v, 02369 const Point_2& p) 02370 { 02371 Observers_iterator iter; 02372 Observers_iterator end = m_observers.end(); 02373 02374 for (iter = m_observers.begin(); iter != end; ++iter) 02375 (*iter)->before_modify_vertex (v, p); 02376 } 02377 02378 void _notify_after_modify_vertex (Vertex_handle v) 02379 { 02380 Observers_rev_iterator iter; 02381 Observers_rev_iterator end = m_observers.rend(); 02382 02383 for (iter = m_observers.rbegin(); iter != end; ++iter) 02384 (*iter)->after_modify_vertex (v); 02385 } 02386 02387 void _notify_before_modify_edge (Halfedge_handle e, 02388 const X_monotone_curve_2& c) 02389 { 02390 Observers_iterator iter; 02391 Observers_iterator end = m_observers.end(); 02392 02393 for (iter = m_observers.begin(); iter != end; ++iter) 02394 (*iter)->before_modify_edge (e, c); 02395 } 02396 02397 void _notify_after_modify_edge (Halfedge_handle e) 02398 { 02399 Observers_rev_iterator iter; 02400 Observers_rev_iterator end = m_observers.rend(); 02401 02402 for (iter = m_observers.rbegin(); iter != end; ++iter) 02403 (*iter)->after_modify_edge (e); 02404 } 02405 02406 void _notify_before_split_edge (Halfedge_handle e, 02407 Vertex_handle v, 02408 const X_monotone_curve_2& c1, 02409 const X_monotone_curve_2& c2) 02410 { 02411 Observers_iterator iter; 02412 Observers_iterator end = m_observers.end(); 02413 02414 for (iter = m_observers.begin(); iter != end; ++iter) 02415 (*iter)->before_split_edge (e, v, c1, c2); 02416 } 02417 02418 void _notify_after_split_edge (Halfedge_handle e1, 02419 Halfedge_handle e2) 02420 { 02421 Observers_rev_iterator iter; 02422 Observers_rev_iterator end = m_observers.rend(); 02423 02424 for (iter = m_observers.rbegin(); iter != end; ++iter) 02425 (*iter)->after_split_edge (e1, e2); 02426 } 02427 02428 void _notify_before_split_fictitious_edge (Halfedge_handle e, 02429 Vertex_handle v) 02430 { 02431 Observers_iterator iter; 02432 Observers_iterator end = m_observers.end(); 02433 02434 for (iter = m_observers.begin(); iter != end; ++iter) 02435 (*iter)->before_split_fictitious_edge (e, v); 02436 } 02437 02438 void _notify_after_split_fictitious_edge (Halfedge_handle e1, 02439 Halfedge_handle e2) 02440 { 02441 Observers_rev_iterator iter; 02442 Observers_rev_iterator end = m_observers.rend(); 02443 02444 for (iter = m_observers.rbegin(); iter != end; ++iter) 02445 (*iter)->after_split_fictitious_edge (e1, e2); 02446 } 02447 02448 void _notify_before_split_face (Face_handle f, 02449 Halfedge_handle e) 02450 { 02451 Observers_iterator iter; 02452 Observers_iterator end = m_observers.end(); 02453 02454 for (iter = m_observers.begin(); iter != end; ++iter) 02455 (*iter)->before_split_face (f, e); 02456 } 02457 02458 void _notify_after_split_face (Face_handle f, 02459 Face_handle new_f, 02460 bool is_hole) 02461 { 02462 Observers_rev_iterator iter; 02463 Observers_rev_iterator end = m_observers.rend(); 02464 02465 for (iter = m_observers.rbegin(); iter != end; ++iter) 02466 (*iter)->after_split_face (f, new_f, is_hole); 02467 } 02468 02469 void _notify_before_split_outer_ccb (Face_handle f, 02470 Ccb_halfedge_circulator h, 02471 Halfedge_handle e) 02472 { 02473 Observers_iterator iter; 02474 Observers_iterator end = m_observers.end(); 02475 02476 for (iter = m_observers.begin(); iter != end; ++iter) 02477 (*iter)->before_split_outer_ccb (f, h, e); 02478 } 02479 02480 void _notify_after_split_outer_ccb (Face_handle f, 02481 Ccb_halfedge_circulator h1, 02482 Ccb_halfedge_circulator h2) 02483 { 02484 Observers_rev_iterator iter; 02485 Observers_rev_iterator end = m_observers.rend(); 02486 02487 for (iter = m_observers.rbegin(); iter != end; ++iter) 02488 (*iter)->after_split_outer_ccb (f, h1, h2); 02489 } 02490 02491 void _notify_before_split_inner_ccb (Face_handle f, 02492 Ccb_halfedge_circulator h, 02493 Halfedge_handle e) 02494 { 02495 Observers_iterator iter; 02496 Observers_iterator end = m_observers.end(); 02497 02498 for (iter = m_observers.begin(); iter != end; ++iter) 02499 (*iter)->before_split_inner_ccb (f, h, e); 02500 } 02501 02502 void _notify_after_split_inner_ccb (Face_handle f, 02503 Ccb_halfedge_circulator h1, 02504 Ccb_halfedge_circulator h2) 02505 { 02506 Observers_rev_iterator iter; 02507 Observers_rev_iterator end = m_observers.rend(); 02508 02509 for (iter = m_observers.rbegin(); iter != end; ++iter) 02510 (*iter)->after_split_inner_ccb (f, h1, h2); 02511 } 02512 02513 void _notify_before_add_outer_ccb (Face_handle f, 02514 Halfedge_handle e) 02515 { 02516 Observers_iterator iter; 02517 Observers_iterator end = m_observers.end(); 02518 02519 for (iter = m_observers.begin(); iter != end; ++iter) 02520 (*iter)->before_add_outer_ccb (f, e); 02521 } 02522 02523 void _notify_after_add_outer_ccb (Ccb_halfedge_circulator h) 02524 { 02525 Observers_rev_iterator iter; 02526 Observers_rev_iterator end = m_observers.rend(); 02527 02528 for (iter = m_observers.rbegin(); iter != end; ++iter) 02529 (*iter)->after_add_outer_ccb (h); 02530 } 02531 02532 void _notify_before_add_inner_ccb (Face_handle f, 02533 Halfedge_handle e) 02534 { 02535 Observers_iterator iter; 02536 Observers_iterator end = m_observers.end(); 02537 02538 for (iter = m_observers.begin(); iter != end; ++iter) 02539 (*iter)->before_add_inner_ccb (f, e); 02540 } 02541 02542 void _notify_after_add_inner_ccb (Ccb_halfedge_circulator h) 02543 { 02544 Observers_rev_iterator iter; 02545 Observers_rev_iterator end = m_observers.rend(); 02546 02547 for (iter = m_observers.rbegin(); iter != end; ++iter) 02548 (*iter)->after_add_inner_ccb (h); 02549 } 02550 02551 void _notify_before_add_isolated_vertex (Face_handle f, 02552 Vertex_handle v) 02553 { 02554 Observers_iterator iter; 02555 Observers_iterator end = m_observers.end(); 02556 02557 for (iter = m_observers.begin(); iter != end; ++iter) 02558 (*iter)->before_add_isolated_vertex (f, v); 02559 } 02560 02561 void _notify_after_add_isolated_vertex (Vertex_handle v) 02562 { 02563 Observers_rev_iterator iter; 02564 Observers_rev_iterator end = m_observers.rend(); 02565 02566 for (iter = m_observers.rbegin(); iter != end; ++iter) 02567 (*iter)->after_add_isolated_vertex (v); 02568 } 02569 02570 void _notify_before_merge_edge (Halfedge_handle e1, 02571 Halfedge_handle e2, 02572 const X_monotone_curve_2& c) 02573 { 02574 Observers_iterator iter; 02575 Observers_iterator end = m_observers.end(); 02576 02577 for (iter = m_observers.begin(); iter != end; ++iter) 02578 (*iter)->before_merge_edge (e1, e2, c); 02579 } 02580 02581 void _notify_after_merge_edge (Halfedge_handle e) 02582 { 02583 Observers_rev_iterator iter; 02584 Observers_rev_iterator end = m_observers.rend(); 02585 02586 for (iter = m_observers.rbegin(); iter != end; ++iter) 02587 (*iter)->after_merge_edge (e); 02588 } 02589 02590 void _notify_before_merge_fictitious_edge (Halfedge_handle e1, 02591 Halfedge_handle e2) 02592 { 02593 Observers_iterator iter; 02594 Observers_iterator end = m_observers.end(); 02595 02596 for (iter = m_observers.begin(); iter != end; ++iter) 02597 (*iter)->before_merge_fictitious_edge (e1, e2); 02598 } 02599 02600 void _notify_after_merge_fictitious_edge (Halfedge_handle e) 02601 { 02602 Observers_rev_iterator iter; 02603 Observers_rev_iterator end = m_observers.rend(); 02604 02605 for (iter = m_observers.rbegin(); iter != end; ++iter) 02606 (*iter)->after_merge_fictitious_edge (e); 02607 } 02608 02609 void _notify_before_merge_face (Face_handle f1, 02610 Face_handle f2, 02611 Halfedge_handle e) 02612 { 02613 Observers_iterator iter; 02614 Observers_iterator end = m_observers.end(); 02615 02616 for (iter = m_observers.begin(); iter != end; ++iter) 02617 (*iter)->before_merge_face (f1, f2, e); 02618 } 02619 02620 void _notify_after_merge_face (Face_handle f) 02621 { 02622 Observers_rev_iterator iter; 02623 Observers_rev_iterator end = m_observers.rend(); 02624 02625 for (iter = m_observers.rbegin(); iter != end; ++iter) 02626 (*iter)->after_merge_face (f); 02627 } 02628 02629 void _notify_before_merge_outer_ccb (Face_handle f, 02630 Ccb_halfedge_circulator h1, 02631 Ccb_halfedge_circulator h2, 02632 Halfedge_handle e) 02633 { 02634 Observers_iterator iter; 02635 Observers_iterator end = m_observers.end(); 02636 02637 for (iter = m_observers.begin(); iter != end; ++iter) 02638 (*iter)->before_merge_outer_ccb (f, h1, h2, e); 02639 } 02640 02641 void _notify_after_merge_outer_ccb (Face_handle f, 02642 Ccb_halfedge_circulator h) 02643 { 02644 Observers_rev_iterator iter; 02645 Observers_rev_iterator end = m_observers.rend(); 02646 02647 for (iter = m_observers.rbegin(); iter != end; ++iter) 02648 (*iter)->after_merge_outer_ccb (f, h); 02649 } 02650 02651 void _notify_before_merge_inner_ccb (Face_handle f, 02652 Ccb_halfedge_circulator h1, 02653 Ccb_halfedge_circulator h2, 02654 Halfedge_handle e) 02655 { 02656 Observers_iterator iter; 02657 Observers_iterator end = m_observers.end(); 02658 02659 for (iter = m_observers.begin(); iter != end; ++iter) 02660 (*iter)->before_merge_inner_ccb (f, h1, h2, e); 02661 } 02662 02663 void _notify_after_merge_inner_ccb (Face_handle f, 02664 Ccb_halfedge_circulator h) 02665 { 02666 Observers_rev_iterator iter; 02667 Observers_rev_iterator end = m_observers.rend(); 02668 02669 for (iter = m_observers.rbegin(); iter != end; ++iter) 02670 (*iter)->after_merge_inner_ccb (f, h); 02671 } 02672 02673 void _notify_before_move_outer_ccb (Face_handle from_f, 02674 Face_handle to_f, 02675 Ccb_halfedge_circulator h) 02676 { 02677 Observers_iterator iter; 02678 Observers_iterator end = m_observers.end(); 02679 02680 for (iter = m_observers.begin(); iter != end; ++iter) 02681 (*iter)->before_move_outer_ccb (from_f, to_f, h); 02682 } 02683 02684 void _notify_after_move_outer_ccb (Ccb_halfedge_circulator h) 02685 { 02686 Observers_rev_iterator iter; 02687 Observers_rev_iterator end = m_observers.rend(); 02688 02689 for (iter = m_observers.rbegin(); iter != end; ++iter) 02690 (*iter)->after_move_outer_ccb (h); 02691 } 02692 02693 void _notify_before_move_inner_ccb (Face_handle from_f, 02694 Face_handle to_f, 02695 Ccb_halfedge_circulator h) 02696 { 02697 Observers_iterator iter; 02698 Observers_iterator end = m_observers.end(); 02699 02700 for (iter = m_observers.begin(); iter != end; ++iter) 02701 (*iter)->before_move_inner_ccb (from_f, to_f, h); 02702 } 02703 02704 void _notify_after_move_inner_ccb (Ccb_halfedge_circulator h) 02705 { 02706 Observers_rev_iterator iter; 02707 Observers_rev_iterator end = m_observers.rend(); 02708 02709 for (iter = m_observers.rbegin(); iter != end; ++iter) 02710 (*iter)->after_move_inner_ccb (h); 02711 } 02712 02713 void _notify_before_move_isolated_vertex (Face_handle from_f, 02714 Face_handle to_f, 02715 Vertex_handle v) 02716 { 02717 Observers_iterator iter; 02718 Observers_iterator end = m_observers.end(); 02719 02720 for (iter = m_observers.begin(); iter != end; ++iter) 02721 (*iter)->before_move_isolated_vertex (from_f, to_f, v); 02722 } 02723 02724 02725 void _notify_after_move_isolated_vertex (Vertex_handle v) 02726 { 02727 Observers_rev_iterator iter; 02728 Observers_rev_iterator end = m_observers.rend(); 02729 02730 for (iter = m_observers.rbegin(); iter != end; ++iter) 02731 (*iter)->after_move_isolated_vertex (v); 02732 } 02733 02734 void _notify_before_remove_vertex (Vertex_handle v) 02735 { 02736 Observers_iterator iter; 02737 Observers_iterator end = m_observers.end(); 02738 02739 for (iter = m_observers.begin(); iter != end; ++iter) 02740 (*iter)->before_remove_vertex (v); 02741 } 02742 02743 void _notify_after_remove_vertex () 02744 { 02745 Observers_rev_iterator iter; 02746 Observers_rev_iterator end = m_observers.rend(); 02747 02748 for (iter = m_observers.rbegin(); iter != end; ++iter) 02749 (*iter)->after_remove_vertex (); 02750 } 02751 02752 void _notify_before_remove_edge (Halfedge_handle e) 02753 { 02754 Observers_iterator iter; 02755 Observers_iterator end = m_observers.end(); 02756 02757 for (iter = m_observers.begin(); iter != end; ++iter) 02758 (*iter)->before_remove_edge (e); 02759 } 02760 02761 void _notify_after_remove_edge () 02762 { 02763 Observers_rev_iterator iter; 02764 Observers_rev_iterator end = m_observers.rend(); 02765 02766 for (iter = m_observers.rbegin(); iter != end; ++iter) 02767 (*iter)->after_remove_edge (); 02768 } 02769 02770 void _notify_before_remove_outer_ccb (Face_handle f, 02771 Ccb_halfedge_circulator h) 02772 { 02773 Observers_iterator iter; 02774 Observers_iterator end = m_observers.end(); 02775 02776 for (iter = m_observers.begin(); iter != end; ++iter) 02777 (*iter)->before_remove_outer_ccb (f, h); 02778 } 02779 02780 void _notify_after_remove_outer_ccb (Face_handle f) 02781 { 02782 Observers_rev_iterator iter; 02783 Observers_rev_iterator end = m_observers.rend(); 02784 02785 for (iter = m_observers.rbegin(); iter != end; ++iter) 02786 (*iter)->after_remove_outer_ccb (f); 02787 } 02788 02789 void _notify_before_remove_inner_ccb (Face_handle f, 02790 Ccb_halfedge_circulator h) 02791 { 02792 Observers_iterator iter; 02793 Observers_iterator end = m_observers.end(); 02794 02795 for (iter = m_observers.begin(); iter != end; ++iter) 02796 (*iter)->before_remove_inner_ccb (f, h); 02797 } 02798 02799 void _notify_after_remove_inner_ccb (Face_handle f) 02800 { 02801 Observers_rev_iterator iter; 02802 Observers_rev_iterator end = m_observers.rend(); 02803 02804 for (iter = m_observers.rbegin(); iter != end; ++iter) 02805 (*iter)->after_remove_inner_ccb (f); 02806 } 02808 02809 }; 02810 02811 //----------------------------------------------------------------------------- 02812 // Declarations of the various global insertion and removal functions. 02813 //----------------------------------------------------------------------------- 02814 02815 // In some compilers there is a template deduction disambiguity between this 02816 // function and the following function receiving two InputIterator. 02817 // For now the solution is to add a dummy variable at the end (referring 02818 // to point-location). Maybe the proper solution is to use boost::enable_if 02819 // together with appropriate tag. 02829 template <class GeomTraits, class TopTraits, class Curve, class PointLocation> 02830 void insert (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 02831 const Curve& c, const PointLocation& pl, 02832 typename PointLocation::Point_2* = 0); 02833 02843 template <class GeomTraits, class TopTraits, class Curve> 02844 void insert (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 02845 const Curve& c); 02846 02857 template <class GeomTraits, class TopTraits, class InputIterator> 02858 void insert (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 02859 InputIterator begin, InputIterator end); 02860 02872 template <class GeomTraits, class TopTraits> 02873 void insert (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 02874 const typename GeomTraits::X_monotone_curve_2& c, 02875 const Object& obj); 02876 02888 template <class GeomTraits, class TopTraits, class PointLocation> 02889 typename Arrangement_on_surface_2<GeomTraits, TopTraits>::Halfedge_handle 02890 insert_non_intersecting_curve 02891 (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 02892 const typename GeomTraits::X_monotone_curve_2& c, 02893 const PointLocation& pl); 02894 02907 template <class GeomTraits, class TopTraits> 02908 typename Arrangement_on_surface_2<GeomTraits, TopTraits>::Halfedge_handle 02909 insert_non_intersecting_curve 02910 (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 02911 const typename GeomTraits::X_monotone_curve_2& c); 02912 02924 template <class GeomTraits, class TopTraits, class InputIterator> 02925 void insert_non_intersecting_curves 02926 (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 02927 InputIterator begin, InputIterator end); 02928 02937 template <class GeomTraits, class TopTraits> 02938 typename Arrangement_on_surface_2<GeomTraits, TopTraits>::Face_handle 02939 remove_edge (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 02940 typename Arrangement_on_surface_2<GeomTraits, 02941 TopTraits>::Halfedge_handle e); 02942 02951 template <class GeomTraits, class TopTraits, class PointLocation> 02952 typename Arrangement_on_surface_2<GeomTraits, TopTraits>::Vertex_handle 02953 insert_point (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 02954 const typename GeomTraits::Point_2& p, 02955 const PointLocation& pl); 02956 02964 template <class GeomTraits, class TopTraits> 02965 typename Arrangement_on_surface_2<GeomTraits, TopTraits>::Vertex_handle 02966 insert_point (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 02967 const typename GeomTraits::Point_2& p); 02968 02975 template <class GeomTraits, class TopTraits> 02976 bool 02977 remove_vertex (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 02978 typename Arrangement_on_surface_2<GeomTraits, 02979 TopTraits>::Vertex_handle v); 02980 02981 02989 template <class GeomTraits, class TopTraits> 02990 bool is_valid (const Arrangement_on_surface_2<GeomTraits, TopTraits>& arr); 02991 03003 template <class GeomTraits, class TopTraits, 03004 class OutputIterator, class PointLocation> 03005 OutputIterator zone (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 03006 const typename GeomTraits::X_monotone_curve_2& c, 03007 OutputIterator oi, 03008 const PointLocation& pl); 03009 03019 template <class GeomTraits, class TopTraits, class OutputIterator> 03020 OutputIterator zone (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 03021 const typename GeomTraits::X_monotone_curve_2& c, 03022 OutputIterator oi); 03023 03032 template <class GeomTraits, class TopTraits, class Curve, class PointLocation> 03033 bool do_intersect (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 03034 const Curve& c, const PointLocation& pl); 03035 03044 template <class GeomTraits, class TopTraits, class Curve> 03045 bool do_intersect (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 03046 const Curve& c); 03047 03048 03049 CGAL_END_NAMESPACE 03050 03051 // The function definitions can be found under: 03052 #include <CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h> 03053 #include <CGAL/Arrangement_2/Arrangement_on_surface_2_global.h> 03054 03055 #endif 03056