00001 #ifndef NMWR_GB_BOUNDARY_REG2D_H 00002 #define NMWR_GB_BOUNDARY_REG2D_H 00003 00004 00005 /* ------------------------------------------------------------ 00006 00007 Copyright (C) 1997 - 2009 Guntram Berti 00008 00009 This file is part of the Grid Algorithms Library (GrAL), 00010 available at http://gral.berti-cmm.de 00011 00012 GrAL is distributed under the MIT license, 00013 see the file LICENSE or http://gral.berti-cmm.de/license 00014 00015 --------------------------------------------------------------- */ 00016 00017 00021 #include "Gral/Base/boundary.h" 00022 #include "Gral/Base/grid-functors.h" 00023 00024 #include "Gral/Iterators/boundary-iterator.h" 00025 00026 #include "Gral/Grids/Cartesian2D/cartesian-grid2d.h" 00027 00028 namespace GrAL { 00029 00041 template<> 00042 class BoundaryRange<cartesian2d::RegGrid2D> { 00043 public: 00044 00045 typedef cartesian2d::RegGrid2D grid_type; 00046 typedef grid_types<grid_type> gt; 00047 typedef gt::Edge Edge; 00048 typedef gt::Vertex Vertex; 00049 00050 typedef iscellinside_pred<grid_type> inside_p; 00051 typedef BoundaryComponentVertexIterator2D<grid_type,inside_p> VertexIterator; 00052 typedef BoundaryComponentEdgeIterator2D <grid_type,inside_p> EdgeIterator; 00053 typedef BoundaryComponentEdgeIterator2D <grid_type,inside_p> FacetIterator; 00054 private: 00055 grid_type const* g; 00056 Edge seed_edge; 00057 public: 00058 BoundaryRange() : g(0) {} 00059 BoundaryRange(grid_type const& gg) : g(&gg) 00060 { 00061 // get edge on boundary (should be the first edge) 00062 gt::EdgeIterator e = TheGrid().FirstEdge(); 00063 while(! TheGrid().IsOnBoundary(*e)) 00064 ++e; 00065 seed_edge = *e; 00066 } 00067 00068 00069 // VertexIterator FirstVertex() const { return VertexIterator(seed_edge,IsEdgeOnBoundary(*g));} 00070 // EdgeIterator FirstEdge() const { return EdgeIterator (seed_edge,IsEdgeOnBoundary(*g));} 00071 // FacetIterator FirstFacet() const { return FacetIterator (seed_edge,IsEdgeOnBoundary(*g));} 00072 VertexIterator FirstVertex() const { return VertexIterator(seed_edge,IsCellInside(*g));} 00073 EdgeIterator FirstEdge() const { return EdgeIterator (seed_edge,IsCellInside(*g));} 00074 FacetIterator FirstFacet() const { return FacetIterator (seed_edge,IsCellInside(*g));} 00075 00076 // unsigned NumOfVertices() const; 00077 // unsigned NumOfEdges() const; 00078 // unsigned NumOfFacets() const; 00079 grid_type const& TheGrid() const { return *g;} 00080 00081 }; 00082 00083 00088 template<> 00089 struct grid_types<BoundaryRange<cartesian2d::RegGrid2D> > 00090 { 00091 typedef grid_types<cartesian2d::RegGrid2D> gt; 00092 typedef BoundaryRange<cartesian2d::RegGrid2D> BrC; 00093 00094 typedef gt::Vertex Vertex; 00095 typedef gt::Edge Edge; 00096 typedef gt::Facet Facet; 00097 // typedef gt::Cell Cell; 00098 00099 typedef BrC::VertexIterator VertexIterator; 00100 typedef BrC::EdgeIterator EdgeIterator; 00101 typedef BrC::FacetIterator FacetIterator; 00102 // typedef BrC::CellIterator CellIterator; 00103 00104 // typedef gt::VertexOnCellIterator VertexOnCellIterator; 00105 // typedef gt::EdgeOnCellIterator EdgeOnCellIterator; 00106 // typedef gt::FacetOnCellIterator FacetOnCellIterator; 00107 // typedef gt::CellOnCellIterator CellOnCellIterator; 00108 }; 00109 00110 } // namespace GrAL 00111 00112 #endif 00113
1.5.8