00001
00002
00003
00004
00005 #ifndef CAJUN_GC_ORACLE_H
00006 #define CAJUN_GC_ORACLE_H
00007
00008
00009 #include "map_grid.H"
00010 #include "search_grid.H"
00011
00012
00013 #include <cmath>
00014 #include <vector>
00015
00016
00017 namespace cajun
00018 {
00019
00020
00021 class gc_oracle_t
00022 {
00023 public:
00024 gc_oracle_t (double cell_size_) :
00025 m_cell_size (cell_size_), m_sequence (0),
00026 m_map_grid (0), m_search_grid (0),
00027
00028 m_vehicle_x (0), m_vehicle_y (0)
00029 {}
00030 virtual ~gc_oracle_t () {}
00031
00032 void set_map_grid (map_grid_t *grid_) { m_map_grid = grid_; }
00033 void set_search_grid (search_grid_t *grid_) { m_search_grid = grid_; }
00034
00035 virtual void init (double orient_,
00036 double sx_, double sy_, double gx_, double gy_) = 0;
00037
00038 float cost (search_grid_t::iterator_t const &iter)
00039 {
00040 if (iter->sequence != m_sequence)
00041 update (iter);
00042 return iter->cost;
00043 }
00044
00045 unsigned sequence () const { return m_sequence; }
00046 float max_cost () const { return m_max_cost; }
00047
00048 protected:
00049 double const m_cell_size;
00050
00051 float m_max_cost;
00052 double m_orient;
00053 unsigned m_sequence;
00054 map_grid_t *m_map_grid;
00055 search_grid_t *m_search_grid;
00056
00057 virtual void update (search_grid_t::iterator_t const &dest_iter) = 0;
00058
00059
00060 void split_coord (double c_, int &i_, float &f_) const
00061 {
00062 double v = c_ / m_cell_size;
00063
00064 i_ = (int) floor (v);
00065 f_ = v - i_;
00066 }
00067
00068 public:
00069
00070
00071
00072 virtual void set_vehicle_position (float vx, float vy) = 0;
00073 protected:
00074 float m_vehicle_x;
00075 float m_vehicle_y;
00076
00077
00078 };
00079
00080
00081 };
00082
00083
00084 #endif