// Copyright (c) 2006,2007,2009,2010,2011 Tel-Aviv University (Israel). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // You can redistribute it and/or modify it under the terms of the GNU // General Public License as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // 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. // // $URL$ // $Id$ // SPDX-License-Identifier: GPL-3.0+ // // // Author(s): Ron Wein // Efi Fogel #ifndef CGAL_ARRANGEMENT_2_H #define CGAL_ARRANGEMENT_2_H #include #include /*! \file * The header file for the Arrangement_2 class. */ #include #include #include namespace CGAL { /*! \class Arrangement_2 * The arrangement class, representing planar subdivisions induced by * a set of arbitrary planar curves. * The GeomTraits parameter corresponds to a geometry-traits class that * defines the Point_2 and X_monotone_curve_2 types and implements the * geometric predicates and constructions for the family of curves it defines. * The Dcel parameter should be a model of the ArrDcel concept and support * the basic topological operations on a doubly-connected edge-list. */ template > class Arrangement_2 : public Arrangement_on_surface_2 ::Traits> { protected: typedef Default_planar_topology Default_topology; public: typedef Arrangement_on_surface_2 Base; typedef GeomTraits_ Geometry_traits_2; typedef Dcel_ Dcel; typedef Arrangement_2 Self; typedef typename Base::Point_2 Point_2; typedef typename Base::X_monotone_curve_2 X_monotone_curve_2; typedef typename Default_topology::Traits Topology_traits; // Type definitions. typedef typename Base::Vertex Vertex; typedef typename Base::Halfedge Halfedge; typedef typename Base::Face Face; typedef typename Base::Size Size; typedef typename Base::Vertex_iterator Vertex_iterator; typedef typename Base::Vertex_const_iterator Vertex_const_iterator; typedef typename Base::Halfedge_iterator Halfedge_iterator; typedef typename Base::Halfedge_const_iterator Halfedge_const_iterator; typedef typename Base::Edge_iterator Edge_iterator; typedef typename Base::Edge_const_iterator Edge_const_iterator; typedef typename Base::Face_iterator Face_iterator; typedef typename Base::Face_const_iterator Face_const_iterator; typedef typename Base::Halfedge_around_vertex_circulator Halfedge_around_vertex_circulator; typedef typename Base::Halfedge_around_vertex_const_circulator Halfedge_around_vertex_const_circulator; typedef typename Base::Ccb_halfedge_circulator Ccb_halfedge_circulator; typedef typename Base::Ccb_halfedge_const_circulator Ccb_halfedge_const_circulator; typedef typename Base::Outer_ccb_iterator Outer_ccb_iterator; typedef typename Base::Outer_ccb_const_iterator Outer_ccb_const_iterator; typedef typename Base::Inner_ccb_iterator Inner_ccb_iterator; typedef typename Base::Inner_ccb_const_iterator Inner_ccb_const_iterator; typedef typename Base::Isolated_vertex_iterator Isolated_vertex_iterator; typedef typename Base::Isolated_vertex_const_iterator Isolated_vertex_const_iterator; typedef typename Base::Vertex_handle Vertex_handle; typedef typename Base::Vertex_const_handle Vertex_const_handle; typedef typename Base::Halfedge_handle Halfedge_handle; typedef typename Base::Halfedge_const_handle Halfedge_const_handle; typedef typename Base::Face_handle Face_handle; typedef typename Base::Face_const_handle Face_const_handle; // These types are defined for backward compatibility: typedef Geometry_traits_2 Traits_2; typedef typename Base::Inner_ccb_iterator Hole_iterator; typedef typename Base::Inner_ccb_const_iterator Hole_const_iterator; private: friend class Arr_observer; friend class Arr_accessor; public: /// \name Constructors. //@{ /*! Default constructor. */ Arrangement_2 () : Base () {} /*! Copy constructor (from a base arrangement). */ Arrangement_2 (const Base& base) : Base (base) {} /*! Constructor given a traits object. */ Arrangement_2 (const Traits_2 *tr) : Base (tr) {} //@} /// \name Assignment functions. //@{ /*! Assignment operator (from a base arrangement). */ Self& operator= (const Base& base) { Base::assign (base); return (*this); } /*! Assign an arrangement. */ void assign (const Base& base) { Base::assign (base); return; } //@} ///! \name Specialized access methods. //@{ /*! Obtain the geometry-traits class. */ const Traits_2* traits () const { return (this->geometry_traits()); } /*! Obtain the number of vertices at infinity. */ Size number_of_vertices_at_infinity () const { // The vertices at infinity are valid, but not concrete: return (this->topology_traits()->number_of_valid_vertices() - this->topology_traits()->number_of_concrete_vertices()); } /*! Obtain the unbounded face (non-const version). */ Face_handle unbounded_face () { // The fictitious un_face contains all other valid faces in a single // hole inside it. We return a handle to one of its neighboring faces, // which is necessarily unbounded. typename Base::DFace *un_face = const_cast(this->topology_traits()-> initial_face()); if (! un_face->is_fictitious()) return (Face_handle (un_face)); typename Base::DHalfedge *p_he = *(un_face->inner_ccbs_begin()); typename Base::DHalfedge *p_opp = p_he->opposite(); typename Base::DOuter_ccb *p_oc = p_opp->outer_ccb(); return (Face_handle (p_oc->face())); } /*! Get the unbounded face (const version). */ Face_const_handle unbounded_face () const { // The fictitious un_face contains all other valid faces in a single // hole inside it. We return a handle to one of its neighboring faces, // which is necessarily unbounded. const typename Base::DFace *un_face = this->topology_traits()->initial_face(); if (! un_face->is_fictitious()) return (Face_const_handle (un_face)); const typename Base::DHalfedge *p_he = *(un_face->inner_ccbs_begin()); const typename Base::DHalfedge *p_opp = p_he->opposite(); const typename Base::DOuter_ccb *p_oc = p_opp->outer_ccb(); return (Face_const_handle (p_oc->face())); } //@} protected: /// \name Managing and notifying the arrangement observers. //@{ typedef Arr_observer Observer; /*! * Register a new observer (so it starts receiving notifications). * \param p_obs A pointer to the observer object. */ void _register_observer (Observer *p_obs) { Base::_register_observer ((typename Base::Observer*)p_obs); return; } /*! * Unregister a new observer (so it stops receiving notifications). * \param p_obs A pointer to the observer object. * \return Whether the observer was successfully unregistered. */ bool _unregister_observer (Observer *p_obs) { return (Base::_unregister_observer ((typename Base::Observer*)p_obs)); } //@} }; } //namespace CGAL #include #endif