sphere_map.h

来自「CGAL is a collaborative effort of severa」· C头文件 代码 · 共 579 行 · 第 1/2 页

H
579
字号
// Copyright (c) 1997-2000  Max-Planck-Institute Saarbruecken (Germany).// 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: /CVSROOT/CGAL/Packages/Nef_S2/include/CGAL/Nef_S2/Sphere_map.h,v $// $Revision: 1.23.2.1 $ $Date: 2004/12/08 20:10:23 $// $Name:  $//// Author(s)     : Michael Seel       <seel@mpi-sb.mpg.de>//                 Peter Hachenberger <hachenberger@mpi-sb.mpg.de>#ifndef CGAL_SPHERE_MAP_H#define CGAL_SPHERE_MAP_H#include <CGAL/basic.h>#include <CGAL/Unique_hash_map.h>#include <CGAL/Nef_2/Object_handle.h>#include <CGAL/Nef_S2/SM_items.h>#include <CGAL/Nef_S2/SM_list.h>#include <CGAL/Nef_S2/SM_iteration.h>#include <CGAL/Nef_S2/Generic_handle_map.h>#include <CGAL/Nef_2/iterator_tools.h>#include <list>#undef CGAL_NEF_DEBUG#define CGAL_NEF_DEBUG 109#include <CGAL/Nef_2/debug.h>CGAL_BEGIN_NAMESPACEtemplate <typename HE>class move_edge_around_svertex {public:  void forward(HE& e) const  { e = (e->sprev()->twin()); }  void backward(HE& e) const { e = (e->twin()->snext()); }};template <typename HE>struct move_edge_around_sface {  void forward(HE& e)  const { e = (e->snext()); }  void backward(HE& e) const { e = (e->sprev()); }};/*{\Manpage {Sphere_map}{Kernel}{Sphere Maps}{M}}*/template <typename Kernel_, typename Items_, typename Mark_>class Sphere_map {/*{\Mdefinition selective sphere map container based onthe HDS design of Kettner.}*/public:  /*{\Mtypes 7}*/  typedef Sphere_map<Kernel_, Items_,Mark_>   Self;  typedef Kernel_                             Sphere_kernel;  typedef Items_                              Items;  typedef Mark_                               Mark;  friend class SM_const_decorator<Self>;  friend class SM_decorator<Self>;  typedef typename Sphere_kernel::Sphere_point     Sphere_point;  /*{\Mtypemember points on the unit sphere.}*/  typedef typename Sphere_kernel::Sphere_segment   Sphere_segment;  /*{\Mtypemember segments on the unit sphere.}*/  typedef typename Sphere_kernel::Sphere_circle    Sphere_circle;  /*{\Mtypemember segments on the unit sphere.}*/  typedef typename Sphere_kernel::Sphere_direction Sphere_direction;  /*{\Mtypemember directions on the unit sphere.}*/  //  typedef bool                                     Mark;  /*{\Mtypemember selective attributes of all objects.}*/  typedef size_t   Size_type;  /*{\Mtypemember size type.}*/  /*{\Mtext For all objects |Vertex|, |Halfedge|, |Halfloop|, |Face|  there are handle and iterator types |xxx_handle|, |xxx_iterator|.  There's no type |SLoop_iterator|, as there is  at most one |SLoop| pair per sphere map.}*/  typedef typename Items::template SVertex<Self>        SVertex_base;  typedef SNC_in_place_list_svertex<SVertex_base>       SVertex;  typedef CGAL::In_place_list<SVertex,false>            SVertex_list;  typedef CGAL_ALLOCATOR(SVertex)                       SVertex_alloc;  typedef typename SVertex_list::iterator               SVertex_handle;  typedef typename SVertex_list::const_iterator         SVertex_const_handle;  typedef typename SVertex_list::iterator               SVertex_iterator;  typedef typename SVertex_list::const_iterator         SVertex_const_iterator;  typedef typename Items::template SHalfedge<Self>      SHalfedge_base;  typedef SNC_in_place_list_shalfedge<SHalfedge_base>   SHalfedge;  typedef CGAL::In_place_list<SHalfedge,false>          SHalfedge_list;  typedef CGAL_ALLOCATOR(SHalfedge)                     SHalfedge_alloc;  typedef typename SHalfedge_list::iterator             SHalfedge_handle;  typedef typename SHalfedge_list::const_iterator       SHalfedge_const_handle;  typedef typename SHalfedge_list::iterator             SHalfedge_iterator;  typedef typename SHalfedge_list::const_iterator       SHalfedge_const_iterator;  typedef typename Items::template SFace<Self>          SFace_base;  typedef SNC_in_place_list_sface<SFace_base>           SFace;  typedef CGAL::In_place_list<SFace,false>              SFace_list;  typedef CGAL_ALLOCATOR(SFace)                         SFace_alloc;  typedef typename SFace_list::iterator                 SFace_handle;  typedef typename SFace_list::const_iterator           SFace_const_handle;  typedef typename SFace_list::iterator                 SFace_iterator;  typedef typename SFace_list::const_iterator           SFace_const_iterator;  typedef typename Items::template SHalfloop<Self>      SHalfloop;  typedef SHalfloop*                                    SHalfloop_handle;  typedef const SHalfloop*                              SHalfloop_const_handle;  typedef SHalfloop*                                    SHalfloop_iterator;  typedef const SHalfloop*                              SHalfloop_const_iterator;  typedef CGAL::Object_handle Object_handle;  /*{\Mtypemember a generic handle to an object of |\Mvar|.   The kind of the object can be determined and the object assigned   by the function:\\   |bool assign(xxx_handle& h, Object_handle o)|\\   where the function returns |true| iff the assignment of |o| to   |h| was valid.}*/  typedef std::list<Object_handle>             Object_list;  typedef typename Object_list::iterator       Object_iterator;  typedef typename Object_list::const_iterator Object_const_iterator;  typedef Generic_handle_map<Object_iterator>  Handle_to_iterator_map;  typedef Sphere_map*       Constructor_parameter;  typedef const Sphere_map* Constructor_const_parameter;  class SFace_cycle_iterator : public Object_iterator   /*{\Mtypemember a generic iterator to an object in the boundary  of a facet. Convertible to |Object_handle|.}*/  { typedef Object_iterator Ibase;  public:    SFace_cycle_iterator() : Ibase() {}    SFace_cycle_iterator(const Ibase& b) : Ibase(b) {}    SFace_cycle_iterator(const SFace_cycle_iterator& i) : Ibase(i) {}      bool is_svertex() const     { SVertex_handle v; return CGAL::assign(v,Ibase::operator*()); }    bool is_shalfedge() const    { SHalfedge_handle e; return CGAL::assign(e,Ibase::operator*()); }    bool is_shalfloop() const    { SHalfloop_handle l; return CGAL::assign(l,Ibase::operator*()); }    operator SVertex_handle() const     { SVertex_handle v; CGAL::assign(v,Ibase::operator*()); return v; }    operator SHalfedge_handle() const     { SHalfedge_handle e; CGAL::assign(e,Ibase::operator*()); return e; }    operator SHalfloop_handle() const     { SHalfloop_handle l; CGAL::assign(l,Ibase::operator*()); return l; }    operator Object_handle() const { return Ibase::operator*(); }    Object_handle& operator*() const { return Ibase::operator*(); }    Object_handle  operator->() const     { CGAL_assertion_msg(0,"not impl."); return Object_handle(); }  };  class SFace_cycle_const_iterator : public Object_const_iterator   /*{\Mtypemember a generic iterator to an object in the boundary  of a facet. Convertible to |Object_handle|.}*/  { typedef Object_const_iterator Ibase;  public:    SFace_cycle_const_iterator() : Ibase() {}    SFace_cycle_const_iterator(const Ibase& b) : Ibase(b) {}    SFace_cycle_const_iterator(const SFace_cycle_const_iterator& i)       : Ibase(i) {}      bool is_svertex() const     { SVertex_handle v; return CGAL::assign(v,Ibase::operator*()); }    bool is_shalfedge() const    { SHalfedge_handle e; return CGAL::assign(e,Ibase::operator*()); }    bool is_shalfloop() const    { SHalfloop_handle l; return CGAL::assign(l,Ibase::operator*()); }    operator SVertex_const_handle() const     { SVertex_handle v; CGAL::assign(v,Ibase::operator*());       return SVertex_const_handle(v); }    operator SHalfedge_const_handle() const     { SHalfedge_handle e; CGAL::assign(e,Ibase::operator*());       return SHalfedge_const_handle(e); }    operator SHalfloop_const_handle() const     { SHalfloop_handle l; CGAL::assign(l,Ibase::operator*());       return SHalfloop_const_handle(l); }    operator Object_handle() const { return Ibase::operator*(); }    const Object_handle& operator*() const { return Ibase::operator*(); }    Object_handle  operator->() const     { CGAL_assertion_msg(0,"not impl."); return Object_handle(); }  };  /*{\Mtext Local types are handles, iterators and circulators of the    following kind: |SVertex_handle|, |SVertex_iterator|, |SHalfedge_handle|,    |SHalfedge_iterator|, |SHalfloop_handle|, |SHalfloop_iterator|,    |SFace_handle|, |SFace_iterator|.  Additionally the following    circulators are defined.}*/  typedef CircFromIt<    SHalfedge_const_iterator,     move_edge_around_svertex<SHalfedge_const_iterator> >     SHalfedge_around_svertex_const_circulator;  /*{\Mtypemember circulating the adjacency list of an vertex |v|.}*/    typedef CircFromIt<    SHalfedge_const_iterator,     move_edge_around_sface<SHalfedge_const_iterator> >     SHalfedge_around_sface_const_circulator;  /*{\Mtypemember circulating the face cycle of an face |f|.}*/  typedef CircFromIt<    SHalfedge_iterator,     move_edge_around_svertex<SHalfedge_iterator> >     SHalfedge_around_svertex_circulator;  /*{\Mtypemember circulating the adjacency list of an vertex |v|.}*/    typedef CircFromIt<    SHalfedge_iterator,     move_edge_around_sface<SHalfedge_iterator> >     SHalfedge_around_sface_circulator;  /*{\Mtypemember circulating the face cycle of an face |f|.}*/    /*{\Mcreation 3}*/  /*{\Mtext |\Mname| is default and copy constructible. Note that copy  construction means cloning an isomorphic structure and is thus an  expensive operation.}*/  Sphere_map(bool b=false) : boundary_item_(undef_),     svertices_(), sedges_(), sfaces_(), shalfloop_() {}  ~Sphere_map() { clear(); }  Sphere_map(const Self& D) : boundary_item_(undef_),    svertices_(D.svertices_),     sedges_(D.sedges_),     sfaces_(D.sfaces_),     shalfloop_(0)  { if ( D.shalfloop_ != 0 ) new_shalfloop_pair(*(D.shalfloop_));    pointer_update(D);   }  Self& operator=(const Self& D)   { if ( this == &D ) return *this;     clear();    svertices_ = D.svertices_;     sfaces_ = D.sfaces_;    sedges_ = D.sedges_;    if ( D.shalfloop_ != 0 ) new_shalfloop_pair(*D.shalfloop_);    pointer_update(D);    return *this;  }  void clear()  {     boundary_item_.clear(undef_);    svertices_.destroy();     sfaces_.destroy();    while ( shalfedges_begin() != shalfedges_end() )      delete_shalfedge_pair( shalfedges_begin() );    if ( shalfloop_ != 0 ) { delete_shalfloop_pair(); shalfloop_=0; }  }  template <typename H>  bool is_sm_boundary_object(H h) const  { return boundary_item_[h]!=undef_; }  template <typename H>  Object_iterator& sm_boundary_item(H h)  { return boundary_item_[h]; }  template <typename H>  void store_sm_boundary_item(H h, Object_iterator o)  { boundary_item_[h] = o; }  template <typename H>  void undef_sm_boundary_item(H h)  { CGAL_assertion(boundary_item_[h]!=undef_);    boundary_item_[h] = undef_; }  void reset_sm_iterator_hash(Object_iterator it)  { SVertex_handle sv;    SHalfedge_handle se;    SHalfloop_handle sl;    if ( CGAL::assign(se,*it) ) { undef_sm_boundary_item(se); return; }    if ( CGAL::assign(sl,*it) ) { undef_sm_boundary_item(sl); return; }    if ( CGAL::assign(sv,*it) ) { undef_sm_boundary_item(sv); return; }  }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?