BWAPI
SPAR/AIModule/BWTA/vendors/CGAL/CGAL/Straight_skeleton_2/Straight_skeleton_builder_events_2.h
Go to the documentation of this file.
00001 // Copyright (c) 2005, 2006 Fernando Luis Cacciola Carballal. All rights reserved.
00002 //
00003 // This file is part of CGAL (www.cgal.org); you may redistribute it under
00004 // the terms of the Q Public License version 1.0.
00005 // See the file LICENSE.QPL distributed with CGAL.
00006 //
00007 // Licensees holding a valid commercial license may use this file in
00008 // accordance with the commercial license agreement provided with the software.
00009 //
00010 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00011 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00012 //
00013 // $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.5-branch/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_events_2.h $
00014 // $Id: Straight_skeleton_builder_events_2.h 40295 2007-09-10 14:07:00Z fcacciola $
00015 //
00016 // Author(s)     : Fernando Cacciola <fernando_cacciola@ciudad.com.ar>
00017 //
00018 #ifndef CGAL_STRAIGHT_SKELETON_BUILDER_EVENTS_2_H
00019 #define CGAL_STRAIGHT_SKELETON_BUILDER_EVENTS_2_H 1
00020 
00021 #include<ostream>
00022 
00023 #include <CGAL/Straight_skeleton_2/Straight_skeleton_aux.h>
00024 
00025 CGAL_BEGIN_NAMESPACE
00026 
00027 namespace CGAL_SS_i
00028 {
00029 
00030 template<class SSkel_, class Traits_>
00031 class Event_2 : public Ref_counted_base
00032 {
00033   typedef SSkel_  SSkel ;
00034   typedef Traits_ Traits ;
00035   
00036 public:
00037  
00038   typedef Event_2<SSkel,Traits> Self ;
00039 
00040   typedef boost::intrusive_ptr<Self> SelfPtr ;
00041 
00042   typedef typename Traits::Point_2          Point_2 ;
00043   typedef typename Traits::FT               FT ;
00044   typedef typename Traits::Trisegment_2_ptr Trisegment_2_ptr ;
00045   
00046   typedef typename SSkel::Vertex                Vertex ;
00047   typedef typename SSkel::Halfedge_handle       Halfedge_handle ;
00048   typedef typename SSkel::Halfedge_const_handle Halfedge_const_handle ;
00049   typedef typename SSkel::Vertex_handle         Vertex_handle ;
00050   
00051   typedef CGAL_SS_i::Triedge<Halfedge_handle> Triedge ;
00052   
00053   enum Type { cEdgeEvent, cSplitEvent, cPseudoSplitEvent } ;
00054 
00055 public:
00056 
00057   Event_2 ( Triedge const& aTriedge, Trisegment_2_ptr const& aTrisegment )
00058     :
00059      mTriedge   (aTriedge)
00060     ,mTrisegment(aTrisegment)
00061   {}
00062 
00063   virtual ~ Event_2() {}
00064 
00065   virtual Type type() const = 0 ;
00066 
00067   virtual Vertex_handle seed0() const = 0 ;
00068   virtual Vertex_handle seed1() const = 0 ;
00069 
00070   Triedge const&          triedge   () const { return mTriedge   ; }
00071   Trisegment_2_ptr const& trisegment() const { return mTrisegment; }
00072   Point_2 const&          point     () const { return mP         ; }
00073   FT                      time      () const { return mTime      ; }
00074 
00075   void SetTimeAndPoint( FT aTime, Point_2 const& aP ) { mTime = aTime ; mP = aP ; }
00076 
00077   friend std::ostream& operator<< ( std::ostream& ss, Self const& e )
00078   {
00079     ss << "[" ;
00080     e.dump(ss);
00081     ss << " p=(" << e.point().x() << "," << e.point().y() << ") t=" << e.time() << "] " 
00082        << trisegment_collinearity_to_string(e.trisegment()->collinearity()) ;
00083     return ss ;
00084   }
00085 
00086 protected :
00087 
00088   virtual void dump ( std::ostream& ss ) const { ss << mTriedge ; } ;
00089 
00090 private :
00091 
00092   Triedge          mTriedge ;
00093   Trisegment_2_ptr mTrisegment ;
00094   Point_2          mP ;
00095   FT               mTime ;
00096 } ;
00097 
00098 template<class SSkel_, class Traits_>
00099 class Edge_event_2 : public Event_2<SSkel_,Traits_>
00100 {
00101   typedef SSkel_  SSkel ;
00102   typedef Traits_ Traits ;
00103 
00104   typedef Event_2<SSkel,Traits> Base ;
00105 
00106   typedef typename SSkel::Halfedge_handle Halfedge_handle ;
00107   typedef typename SSkel::Vertex_handle   Vertex_handle ;
00108 
00109   typedef typename Base::Type             Type ;
00110   typedef typename Base::Triedge          Triedge ;
00111   typedef typename Base::Trisegment_2_ptr Trisegment_2_ptr ;
00112 
00113 public:
00114 
00115   Edge_event_2 ( Triedge const&          aTriedge
00116                , Trisegment_2_ptr const& aTrisegment 
00117                , Vertex_handle           aLSeed
00118                , Vertex_handle           aRSeed
00119                )
00120     :
00121       Base(aTriedge,aTrisegment)
00122     , mLSeed(aLSeed)
00123     , mRSeed(aRSeed)
00124   {}
00125 
00126   virtual Type type() const { return this->cEdgeEvent ; }
00127 
00128   virtual Vertex_handle seed0() const { return mLSeed ; }
00129   virtual Vertex_handle seed1() const { return mRSeed ; }
00130 
00131 private :
00132 
00133   virtual void dump ( std::ostream& ss ) const
00134   {
00135     this->Base::dump(ss);
00136     ss << " (LSeed=" << mLSeed->id() << " RSeed=" << mRSeed->id() << ')' ;
00137   }
00138 
00139 private :
00140 
00141   Vertex_handle mLSeed ;
00142   Vertex_handle mRSeed ;
00143 } ;
00144 
00145 template<class SSkel_, class Traits_>
00146 class Split_event_2 : public Event_2<SSkel_,Traits_>
00147 {
00148   typedef SSkel_  SSkel ;
00149   typedef Traits_ Traits ;
00150 
00151   typedef Event_2<SSkel,Traits> Base ;
00152 
00153   typedef typename SSkel::Halfedge_handle Halfedge_handle ;
00154   typedef typename SSkel::Vertex_handle   Vertex_handle ;
00155   
00156   typedef typename Base::Type             Type ;
00157   typedef typename Base::Triedge          Triedge ;
00158   typedef typename Base::Trisegment_2_ptr Trisegment_2_ptr ;
00159 
00160 public:
00161 
00162   Split_event_2 ( Triedge const&          aTriedge
00163                 , Trisegment_2_ptr const& aTrisegment 
00164                 , Vertex_handle           aSeed
00165                 )
00166     :
00167       Base(aTriedge,aTrisegment)
00168     , mSeed(aSeed)
00169   {}
00170 
00171   virtual Type type() const { return this->cSplitEvent ; }
00172 
00173   virtual Vertex_handle seed0() const { return mSeed ; }
00174   virtual Vertex_handle seed1() const { return mSeed ; }
00175 
00176   void set_opposite_rnode( Vertex_handle aOppR ) { mOppR = aOppR ; }
00177   
00178   Vertex_handle opposite_rnode() const { return mOppR ; }
00179   
00180 private :
00181 
00182   virtual void dump ( std::ostream& ss ) const
00183   {
00184     this->Base::dump(ss);
00185     ss << " (Seed=" << mSeed->id() << " OppBorder=" << this->triedge().e2()->id() << ')' ;
00186   }
00187 
00188 private :
00189 
00190   Vertex_handle mSeed ;
00191   Vertex_handle mOppR ;
00192 } ;
00193 
00194 template<class SSkel_, class Traits_>
00195 class Pseudo_split_event_2 : public Event_2<SSkel_,Traits_>
00196 {
00197   typedef SSkel_  SSkel ;
00198   typedef Traits_ Traits ;
00199   
00200   typedef Event_2<SSkel,Traits> Base ;
00201 
00202   typedef typename SSkel::Halfedge_handle Halfedge_handle ;
00203   typedef typename SSkel::Vertex_handle   Vertex_handle ;
00204 
00205   typedef typename Base::Type             Type ;
00206   typedef typename Base::Triedge          Triedge ;
00207   typedef typename Base::Trisegment_2_ptr Trisegment_2_ptr ;
00208 
00209 public:
00210 
00211   Pseudo_split_event_2 ( Triedge const&          aTriedge
00212                        , Trisegment_2_ptr const& aTrisegment 
00213                        , Vertex_handle           aSeed0
00214                        , Vertex_handle           aSeed1
00215                        , bool                    aOppositeIs0
00216                        )
00217     :
00218       Base(aTriedge,aTrisegment)
00219     , mSeed0(aSeed0)
00220     , mSeed1(aSeed1)
00221     , mOppositeIs0(aOppositeIs0)
00222   {}
00223 
00224   virtual Type type() const { return this->cPseudoSplitEvent ; }
00225 
00226   virtual Vertex_handle seed0() const { return mSeed0 ; }
00227   virtual Vertex_handle seed1() const { return mSeed1 ; }
00228 
00229   bool opposite_node_is_seed_0() const { return mOppositeIs0 ; }
00230   
00231   bool is_at_source_vertex() const { return opposite_node_is_seed_0() ; }
00232   
00233   Vertex_handle opposite_seed() const { return opposite_node_is_seed_0() ? seed0() : seed1() ; }
00234   
00235 private :
00236 
00237   virtual void dump ( std::ostream& ss ) const
00238   {
00239     this->Base::dump(ss);
00240     
00241     ss << " ("
00242        << "Seed0=" << mSeed0->id() << (  mOppositeIs0 ? " {Opp} " : " " ) 
00243        << "Seed1=" << mSeed1->id() << ( !mOppositeIs0 ? " {Opp}"  : "" ) 
00244        << ")" ;
00245   }
00246 
00247 private :
00248 
00249   Vertex_handle mSeed0  ;
00250   Vertex_handle mSeed1 ;
00251   bool          mOppositeIs0 ;
00252 } ;
00253 
00254 }
00255 
00256 CGAL_END_NAMESPACE
00257 
00258 #endif // CGAL_STRAIGHT_SKELETON_BUILDER_EVENTS_2_H //
00259 // EOF //
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines