00001
00008
00009
00010
00011
00012 #ifndef ECL_MAPS_GRID_MAP_FIXED_HPP_
00013 #define ECL_MAPS_GRID_MAP_FIXED_HPP_
00014
00015
00016
00017
00018
00019 #include "grid_map_commons.hpp"
00020
00021
00022
00023
00024
00025 namespace ecl {
00026
00027
00028
00029
00049 template <typename CellType, int Rows = DynamicGridMapStorage, int Cols = Rows>
00050 class GridMap {
00051 public:
00052
00053
00054
00055 typedef CellType value_type;
00056 typedef CellType* iterator;
00057 typedef const CellType* const_iterator;
00058 typedef CellType& reference;
00059 typedef const CellType& const_reference;
00060 typedef int size_type;
00062
00063
00064
00065 GridMap(const double &origin_x = 0.0, const double &origin_y = 0.0, const double &scale = 1.0);
00066 void init(const CellType & initialValue= CellType() );
00067
00068
00069
00070
00071 CellType& operator()(const int& x, const int& y) ecl_assert_throw_decl(StandardException);
00072 CellType& operator()(const double& x, const double& y) ecl_assert_throw_decl(StandardException);
00073
00074
00075
00076
00077 size_type size() const { return Rows*Cols; }
00078 iterator begin() { return cells; }
00079 const_iterator begin() const { return cells; }
00080 iterator end() { return cells+Rows*Cols; }
00081 const_iterator end() const { return cells+Rows*Cols; }
00082 reference front() { return cells[0]; }
00083 const_reference front() const { return cells[0]; }
00084 reference back() { return cells[Rows*Cols-1]; }
00085 const_reference back() const { return cells[Rows*Cols-1]; }
00087
00088
00089
00090 linear_algebra::Vector2i cellCoordinates(const double &x, const double &y ) const ecl_assert_throw_decl(StandardException);
00091 linear_algebra::Vector2d worldCoordinates(const int &x, const int &y ) const ecl_assert_throw_decl(StandardException);
00092
00093
00094
00095
00096 double cellWidth() const { return scale_multiplier; }
00097 size_type rows() const { return Rows; }
00098 size_type cols() const { return Cols; }
00100 private:
00101 double scale_multiplier;
00102 linear_algebra::Vector2d origin;
00103 linear_algebra::Vector2d limits;
00104 CellType cells[Rows*Cols];
00105 };
00106
00107
00108
00109
00129 template <typename CellType, int Rows, int Cols>
00130 GridMap<CellType,Rows,Cols>::GridMap(const double &origin_x, const double &origin_y, const double &scale) :
00131 scale_multiplier(scale)
00132 {
00133 ecl_compile_time_assert( (Rows >= 0) && (Cols >= 0) );
00134
00135 origin << origin_x, origin_y;
00136 limits << origin[0] + scale_multiplier*Cols, origin[1] + scale_multiplier*Rows;
00137 }
00138
00144 template <typename CellType, int Rows, int Cols>
00145 void GridMap<CellType,Rows,Cols>::init(const CellType & initialValue ) {
00146 for ( int i = 0; i < Rows*Cols; ++i ) {
00147 cells[i] = initialValue;
00148 }
00149 }
00150
00151
00152
00153
00154
00155 template <typename CellType, int Rows, int Cols>
00156 CellType& GridMap<CellType,Rows,Cols>::operator() (const int& x, const int& y) ecl_assert_throw_decl(StandardException) {
00157 ecl_assert_throw( ( ( x >= 0 ) && (x <= Cols) ), StandardException(LOC,OutOfRangeError) );
00158 ecl_assert_throw( ( ( y >= 0 ) && (y <= Rows) ), StandardException(LOC,OutOfRangeError) );
00159
00160 return cells[Cols*y+x];
00161 }
00162
00163 template <typename CellType, int Rows, int Cols>
00164 CellType& GridMap<CellType,Rows,Cols>::operator() (const double& x, const double& y) ecl_assert_throw_decl(StandardException) {
00165
00166 ecl_assert_throw( ( ( x >= origin[0] ) && (x <= limits[0]) ), StandardException(LOC,OutOfRangeError) );
00167 ecl_assert_throw( ( ( y >= origin[1] ) && (y <= limits[1]) ), StandardException(LOC,OutOfRangeError) );
00168
00169 int cell_x = static_cast<int>( ( x - origin[0] )/scale_multiplier );
00170 int cell_y = static_cast<int>( ( y - origin[1] )/scale_multiplier );
00171 return cells[Cols*cell_y+cell_x];
00172 }
00173
00174
00175
00176
00177
00178 template <typename CellType, int Rows, int Cols>
00179 linear_algebra::Vector2i GridMap<CellType,Rows,Cols>::cellCoordinates (const double& x, const double& y) const ecl_assert_throw_decl(StandardException) {
00180
00181 ecl_assert_throw( ( ( x >= origin[0] ) && (x <= limits[0]) ), StandardException(LOC,OutOfRangeError) );
00182 ecl_assert_throw( ( ( y >= origin[1] ) && (y <= limits[1]) ), StandardException(LOC,OutOfRangeError) );
00183
00184 linear_algebra::Vector2i cell_coordinates;
00185 cell_coordinates << static_cast<int>( ( x - origin[0] )/scale_multiplier ),
00186 static_cast<int>( ( y - origin[1] )/scale_multiplier );
00187 return cell_coordinates;
00188 }
00189
00190 template <typename CellType, int Rows, int Cols>
00191 ecl::linear_algebra::Vector2d GridMap<CellType,Rows,Cols>::worldCoordinates (const int& x, const int& y) const ecl_assert_throw_decl(StandardException) {
00192
00193 ecl_assert_throw( ( ( x >= 0 ) && (x <= Cols) ), StandardException(LOC,OutOfRangeError) );
00194 ecl_assert_throw( ( ( y >= 0 ) && (y <= Rows) ), StandardException(LOC,OutOfRangeError) );
00195
00196 linear_algebra::Vector2d world_coordinates;
00197 world_coordinates << origin[0] + scale_multiplier*static_cast<double>(x),
00198 origin[1] + scale_multiplier*static_cast<double>(y);
00199 return world_coordinates;
00200 }
00201
00202
00203 }
00204
00205 #endif
00206
00207