00001 #ifndef NMWR_GB_STORED_FOR_CARTESIAN2D_H
00002 #define NMWR_GB_STORED_FOR_CARTESIAN2D_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00021 #include "Geometry/point-traits.h"
00022 #include "Geometry/algebraic-primitives.h"
00023 #include "Gral/Base/common-grid-basics.h"
00024 #include "Gral/Geometries/geometric-types-2d.h"
00025
00026 #include "Gral/Grids/Cartesian2D/cartesian-grid2d.h"
00027 #include "Gral/Grids/Cartesian2D/grid-functions.h"
00028 #include "Gral/Grids/Cartesian2D/geometry-extensions2d.h"
00029
00034 namespace GrAL {
00035
00036 namespace cartesian2d {
00037
00038 template<class Coord2D>
00039 class stored_geometry_base : public grid_types<RegGrid2D>,
00040 public algebraic_primitives<Coord2D>
00041 {
00042 public:
00043 typedef grid_geometry_category category;
00044 typedef Coord2D coord_type;
00045 typedef RegGrid2D grid_type;
00046
00047 stored_geometry_base() : g(0) {}
00048
00049 stored_geometry_base(const RegGrid2D& gg)
00050 : g(&gg), coords_(gg) {}
00051
00052 void init(RegGrid2D const& gg)
00053 {
00054 g = ≫
00055 coords_.set_grid(gg);
00056 }
00057
00058 void set_grid(const RegGrid2D& gg) { g = ≫ coords_.set_grid(gg);}
00059 void rebind (const RegGrid2D& gg) { g = ≫ coords_.rebind (gg);}
00060 bool bound() const { return (g != 0);}
00061
00062 const grid_type& TheGrid() const { return *g;}
00063
00064
00065 unsigned space_dimension() const { return Dim(coord(*(TheGrid().FirstVertex())));}
00066
00067 const coord_type& coord(const Vertex& v) const { return coords_(v); }
00068 coord_type& coord(const Vertex& v) { return coords_[v]; }
00069
00070 void read(std::istream& in) {
00071 for(typename grid_function<Vertex,coord_type>::iterator ii = coords_.begin(); ii != coords_.end(); ++ii)
00072 in >> *ii;
00073 }
00074
00075 private:
00076 const grid_type* g;
00077 grid_function<Vertex,coord_type> coords_;
00078 };
00079
00080
00081
00096 template<class COORD>
00097 class stored_geometry
00098 : public dimension_dependend_extensions2d<stored_geometry_base<COORD>,
00099 stored_geometry<COORD>,
00100 point_traits<COORD>::dimension>
00101
00102 {
00103
00104 public:
00105 typedef stored_geometry_base<COORD> base;
00106 typedef stored_geometry<COORD> self;
00107
00108 typedef point_traits<COORD> pt;
00109 typedef algebraic_primitives<COORD> ap;
00110
00111 typedef typename base::Vertex Vertex;
00112 typedef typename base::Edge Edge;
00113 typedef typename base::Face Face;
00114 typedef typename base::Facet Facet;
00115 typedef typename base::Cell Cell;
00116
00117 typedef typename base::CellIterator CellIterator;
00118 typedef typename base::CellOnCellIterator CellOnCellIterator;
00119 typedef typename base::FacetOnCellIterator FacetOnCellIterator;
00120
00121 typedef typename base::coord_type coord_type;
00122
00123
00125
00126
00128 stored_geometry() {}
00130 stored_geometry(const RegGrid2D& gg)
00131 { base::init(gg); }
00133
00134 friend std::istream& operator>>(std::istream& in, self& rs) { rs.read(in); return in;}
00135
00138 typedef Segment<Edge,base> segment_type;
00139
00142 typedef Polygon2d<Face,base> polygon_type;
00143
00145 segment_type segment(const Edge& e) const { return segment_type(e,basic_geom());}
00147 polygon_type polygon(const Face& f) const { return polygon_type(f,basic_geom());}
00148
00150 double volume(const Edge& e) const { return (segment_type(e,basic_geom()).length());}
00152 double length(const Edge& e) const { return (segment_type(e,basic_geom()).length());}
00153
00155 double volume(const Cell& c) const { return (polygon_type(c,basic_geom()).area());}
00156
00158 coord_type center(const Edge& e) const {return(segment_type(e,basic_geom()).center());}
00159
00161 coord_type center(const Cell& c) const {return(polygon_type(c,basic_geom()).center());}
00162
00163 private:
00164 const base& basic_geom() const { return *this;}
00165 };
00166
00167 }
00168 }
00169
00170 #endif
00171