00001
00002
00003
00004 #include "point_collector.H"
00005 #include "wall.H"
00006 #include "data_type.H"
00007 #include "mesh_queue_writer.H"
00008 #include "mesh_split_file_writer.H"
00009 #include "mesh_cell_queue_writer.H"
00010
00011 namespace cajun
00012 {
00013 class mesh_extractor_t
00014 {
00015 public:
00016 enum writer_type_t { QUEUE, SPLIT_FILE };
00017
00018 mesh_extractor_t (access_data_t *ad_, wall_t *wall_,
00019 unsigned triangle_qid_, writer_type_t type_):
00020 m_wall (wall_), m_start_stp_id (0), m_end_stp_id (0)
00021 {
00022 m_match_closest_pts = false;
00023
00024 switch (type_)
00025 {
00026 case QUEUE:
00027 m_mesh_writer =
00028 new mesh_queue_writer_t (ad_, triangle_qid_);
00029 break;
00030 case SPLIT_FILE:
00031 {
00032 size_t max_cells = wall_->max_cells (0) * 5;
00033 m_mesh_writer =
00034 new mesh_split_file_writer_t (triangle_qid_,
00035 max_cells);
00036 }
00037 break;
00038 default:
00039 printf ("default mesh writing method used\n");
00040 m_mesh_writer =
00041 new mesh_queue_writer_t (ad_, triangle_qid_);
00042 break;
00043 };
00044
00045 m_cell_writer = new mesh_cell_queue_writer_t (ad_,
00046 triangle_qid_);
00047 }
00048
00049 void extract (unsigned counter);
00050 void publish ();
00051 private:
00052 #define MAX_DEPTH_DIFF 1.0
00053
00054 mesh_writer_interface_t *m_mesh_writer;
00055 mesh_cell_queue_writer_t *m_cell_writer;
00056
00057 wall_t *m_wall;
00058
00059 bool m_match_closest_pts;
00060
00061
00062 unsigned m_start_stp_id;
00063
00064
00065 unsigned m_end_stp_id;
00066
00067 void publish_stripe (unsigned stripe_id_);
00068 void update_end_stp_id (unsigned counter);
00069 bool triangle_at (unsigned r1, unsigned c1,
00070 unsigned r2, unsigned c2,
00071 unsigned r3, unsigned c3);
00072
00073 bool form_triangle (cell_t &cell1_, cell_t &cell2_, cell_t &cell3_,
00074 point_3d_t &pt_);
00075 bool match_first_point (point_3d_t &p1_, cell_t &cell_,
00076 unsigned point_index_,
00077 bool closest_, point_3d_t *&pt_);
00078 point_3d_t& match_closest_point (double delta_depth_,
00079 point_3d_t &p1_, cell_t &cell_,
00080 unsigned point_index_);
00081
00082 };
00083 };
00084