00001 
00002 
00003 
00004 #ifndef CAJUN_GRID_SLOPE_H
00005 #define CAJUN_GRID_SLOPE_H
00006 
00007 #include "data_type.H"
00008 #include "data_queue.H"
00009 #include "data_logger.H"
00010 #include "grid.H"
00011 #include <cmath>
00012 #include <cstdio>
00013 #include <algorithm>
00014 #include <deque>
00015 
00016 # define SCANS_PER_SEC 75
00017 
00018 namespace cajun
00019 {
00020 
00021 # define assign_slope(curr_beam) assign_slope.end_beam[(curr_beam)]
00022 # define scan_gp_beam(scan_num, beam_num) scan_gp_db[(scan_num)].end_beam[(beam_num)]
00023         class grid_slope_t
00024         {
00025 
00026                 scan_analysis_data_t assign_slope;
00027                 data_queue_writer_t<scan_analysis_data_t> *m_dq_writer;
00028                 data_queue_writer_t<scan_analysis_data_t> *m_dq_b_writer;
00029 
00030                 scan_gp_data_t *scan_gp_db;
00031 
00032                 static unsigned const NULL_ENTRY = INT_MAX ;
00033 
00034                 struct beam_chain_t
00035                 {
00036                         beam_chain_t() : next(NULL_ENTRY),
00037                                          previous (NULL_ENTRY) {};
00038                         unsigned next ;
00039                         unsigned previous ;
00040                 };
00041 
00042                 beam_chain_t  *beam_list;
00043 
00044                 struct data_cell_t
00045                 {
00046                         data_cell_t() : head(NULL_ENTRY),
00047                                         tail(NULL_ENTRY) {};
00048                         unsigned head;
00049                         unsigned tail;
00050                 };
00051 
00052                 struct dist_list_t
00053                 {
00054                         unsigned index;
00055                         double dist_sqr;
00056                 };
00057 
00058                 struct dist_sort_t
00059                 {
00060                         bool operator () (dist_list_t const &v1,
00061                                           dist_list_t const &v2)const
00062                                 {return (v1.dist_sqr < v2.dist_sqr) ;}
00063 
00064                 };
00065 
00066                 std::vector<dist_list_t> ver_vec;
00067 
00068                 typedef grid_t<data_cell_t> data_grid_t;
00069                 data_grid_t grid;
00070 
00071                 double data_cell_size;
00072                 double R2D;
00073                 int triangles_per_beam;
00074                 unsigned head_of_db;
00075                 unsigned tail_of_db;
00076                 double MIN_LEN_SQR,MAX_LEN_SQR;
00077                 unsigned VER_PER_CELL;
00078                 unsigned MAX_VEC_LEN;
00079                 unsigned MAX_SEARCH_SCANS;
00080                 double refresh_time;
00081                 unsigned scans_in_repository;
00082 
00083         public:
00084                 grid_slope_t ( data_queue_writer_t<scan_analysis_data_t>
00085                                *scan_analysis_dq_b_writer,
00086                                int triangle_count,
00087                                double min_len, double max_len,
00088                                unsigned ver_per_cell, unsigned max_vec_len,
00089                                unsigned num_search_scans,double REFRESH_TIME )
00090                         {
00091                                 m_dq_b_writer = scan_analysis_dq_b_writer;
00092                                 data_cell_size = 0.32;
00093                                 R2D = 180.0/ M_PI;
00094                                 triangles_per_beam = triangle_count;
00095                                 MIN_LEN_SQR = min_len * min_len;
00096                                 MAX_LEN_SQR = max_len * max_len;
00097                                 VER_PER_CELL = ver_per_cell;
00098                                 MAX_VEC_LEN = max_vec_len;
00099                                 refresh_time = REFRESH_TIME;
00100 
00101                                 scan_gp_db = new scan_gp_data_t[num_search_scans];
00102 
00103                                 for (unsigned i = 0; i < num_search_scans; i++)
00104                                         scan_gp_db[i].num_beams = 0;
00105 
00106                                 beam_list = new beam_chain_t[num_search_scans *
00107                                                              SCAN_GP_MAX_BEAMS];
00108 
00109                                 MAX_SEARCH_SCANS = num_search_scans;
00110                                 head_of_db = 0;
00111                                 tail_of_db = 0;
00112                                 scans_in_repository = 0;
00113                                 grid.lru_limit (num_search_scans + 1);
00114                         };
00115 
00116                 scan_gp_data_t &get_free_db_entry ()
00117                         { return scan_gp_db[head_of_db]; }
00118 
00119                 bool is_db_full()
00120                         {
00121                         if(scans_in_repository == MAX_SEARCH_SCANS)
00122                                 return true;
00123                         return false;
00124                         }
00125 
00126                 void delete_old_data (double curr_time)
00127                 {
00128 
00129                         double diff_time = curr_time - refresh_time;
00130 
00131                         while(scans_in_repository != 0 &&
00132                               scan_gp_db[tail_of_db].tstamp <= diff_time )
00133                         {
00134                                 delete_scan (scan_gp_db[tail_of_db]);
00135                                 scans_in_repository --;
00136                                 tail_of_db = (tail_of_db + 1) % MAX_SEARCH_SCANS;
00137                         }
00138                 }
00139 
00140                 void process_new_db_entry ()
00141                 {
00142                         assert (scans_in_repository <= MAX_SEARCH_SCANS);
00143                         scans_in_repository ++;
00144                         fill_grid (scan_gp_db[head_of_db], head_of_db);
00145                         detect_slope(head_of_db);
00146                         head_of_db = (head_of_db + 1) % MAX_SEARCH_SCANS;
00147                 }
00148 
00149                 void sanity_check ( char * s, unsigned index);
00150 
00151                 void delete_scan ( scan_gp_data_t const &points);
00152 
00153                 void fill_grid ( scan_gp_data_t const &points, unsigned head);
00154 
00155                 void detect_slope (unsigned const &head);
00156 
00157                 void compute_slope (  double x1, double y1, double z1,
00158                                       double x2, double y2, double z2,
00159                                       double x3, double y3, double z3,
00160                                       scan_analysis_data_t &assign_slope);
00161 
00162                 void find_eligible_vertices ( double x1, double y1, double z1 );
00163 
00164                 void make_triangles (     double const & x1, double const & y1,
00165                                           double const & z1,
00166                                           scan_analysis_data_t & assign_slope);
00167 
00168                 bool  test_sec_ver   ( double x1, double y1,
00169                                        double x2, double y2,
00170                                        double z1, double z2,
00171                                        double &dist_sqr );
00172 
00173 
00174         };
00175 };
00176 #endif