00001
00002
00003
00004 #ifndef CAJUN_OBSTACLE_FREE_H
00005 #define CAJUN_OBSTACLE_FREE_H
00006
00007
00008 #include "map_grid.H"
00009 #include "rect_filler.H"
00010 #include <math.h>
00011
00012 #include "rndf.H"
00013
00014
00015 #include <vector>
00016 #include <cmath>
00017
00018
00019 namespace cajun
00020 {
00021
00022 class obstacle_free_t
00023 {
00024 public:
00025 obstacle_free_t (map_grid_t *map_grid_,
00026 double cell_size_, rndf_t const *rndf_,
00027 unsigned zone_id_):
00028
00029 m_cell_size (cell_size_),
00030 m_filler (map_grid_), m_rndf (rndf_), m_zone_id (zone_id_)
00031
00032 { }
00033 private:
00034 class filler_t
00035 {
00036 public:
00037 filler_t (map_grid_t *map_grid_) :
00038 m_map_grid (map_grid_), m_blocked (false) {}
00039
00040 void reset_blocked () { m_blocked = false; }
00041
00042 void fill (int x_, int y_, unsigned w_)
00043 {
00044 map_grid_t::iterator_t iter =
00045 m_map_grid->find (x_, y_);
00046
00047 static float max_ob_cost = 0;
00048
00049 while (w_--)
00050 {
00051 max_ob_cost = std::max (max_ob_cost, iter->obstacle);
00052
00053 m_blocked = m_blocked ||
00054
00055
00056 iter->obstacle == FLT_MAX;
00057
00058 iter.neighbor (1, 0);
00059 }
00060 }
00061
00062 bool is_blocked () { return m_blocked; }
00063
00064 protected:
00065 map_grid_t * const m_map_grid;
00066
00067 bool m_blocked;
00068
00069 };
00070
00071 double m_cell_size;
00072
00073 filler_t m_filler;
00074 rect_filler_t m_rect_filler;
00075
00076 rndf_t const *m_rndf;
00077 unsigned m_zone_id;
00078 public:
00079
00080 bool obstacle_in_region (double x0_, double y0_,
00081 double x1_, double y1_, double size_)
00082 {
00083 double orient = atan2 (y1_ - y0_, x1_ - x0_);
00084 double dx = size_ * cos (orient);
00085 double dy = size_ * sin (orient);
00086
00087 x0_ -= dx;
00088 y0_ -= dy;
00089 x1_ += dx;
00090 y1_ += dy;
00091
00092 m_filler.reset_blocked ();
00093
00094 m_rect_filler.fill (m_filler,
00095 x0_ / m_cell_size, y0_ / m_cell_size,
00096 x1_ / m_cell_size, y1_ / m_cell_size,
00097 size_ / m_cell_size);
00098
00099 return m_filler.is_blocked ();
00100 }
00101 };
00102
00103
00104 };
00105
00106
00107 #endif