BWAPI
|
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 //