00001
00004 #ifndef __COMBINATORIAL_MAP__
00005 #define __COMBINATORIAL_MAP__
00006
00007 #include <point.hh>
00008 #include <tab_sym_bool.hh>
00009 #include "level_set.hh"
00010 #include "image.hh"
00011 #include "combi_map_gen.hh"
00012
00013
00015 class combinatorial_map: protected combi_map_gen
00016 {
00017 typedef enum {cm_draw_single,cm_draw_both,cm_draw_all_single,cm_draw_all_both} draw_type;
00018 friend class pyramid;
00019 private:
00021 int level;
00022
00023 tab_sym_bool open_parenthesis;
00024
00025 public:
00026
00027
00029 combinatorial_map():combi_map_gen(NULL),level(0)
00030 {}
00032 combinatorial_map(pyramid &P):combi_map_gen(&P),level(0)
00033 {}
00035 virtual ~combinatorial_map()
00036 {}
00038 dart &sigma(dart d)
00039 {
00040 return sig[d];
00041 }
00043 dart &alpha(dart d)
00044 {
00045 return alph[d];
00046 }
00048 vertex mu(dart d) const
00049 {
00050 return m(d);
00051 }
00053 dart mu_1(vertex v) const
00054 {
00055 return m_1(v);
00056 }
00058 bool is_open_parenthesis(dart d) const
00059 {
00060 return open_parenthesis(d);
00061 }
00063 dart give_level()
00064 {
00065 return level;
00066 }
00068 unsigned int give_background()
00069 {
00070 return background;
00071 }
00072
00074 int give_level(dart d);
00075
00077 int give_width();
00079 int give_height();
00081 dart give_alpha_base(dart d);
00083 dart give_sigma_base(dart d);
00085 void give_point(dart d,point &p);
00087 void give_pixel(dart d,point &p);
00089 move_type give_move(dart d);
00090
00092 vertex_iterator &give_vertex_first();
00094 vertex_iterator &give_vertex_last();
00096 vertex_iterator &give_vertex_end();
00097
00099 dart_iterator &give_dart_first();
00101 dart_iterator &give_dart_begin();
00103 dart_iterator &give_dart_last();
00105 dart_iterator &give_dart_end();
00106
00108 void give_all_neighbors(vertex,list_label&,list_label&);
00110 void give_neighbors(vertex,list_label&);
00112 void give_included(vertex,list_label&);
00114 void display();
00116 void draw_border(image&,unsigned char*,draw_type=cm_draw_single);
00118 void draw_vertex_border(vertex,image&,unsigned char*,draw_type=cm_draw_single);
00120 dart give_neighbor_dart(vertex);
00121
00122
00124 class segment{
00125 private:
00126
00127 pyramid *pyr;
00128
00129 int level;
00130
00131 dart b_first;
00132
00133 dart b_last;
00134 public:
00136 segment();
00138 segment(dart,dart,int,pyramid *);
00139
00140 typedef enum {first_dart,last_dart,end_dart} position;
00141 class iterator
00142 {
00143 private:
00144
00145 segment *seg;
00146
00147 dart b_current;
00148 public:
00150 iterator():seg(NULL), b_current(0)
00151 {}
00153 iterator(segment *,position p=first_dart);
00155 iterator &operator=(const iterator &);
00157 dart operator *()
00158 {
00159 return b_current;
00160 }
00162 iterator &operator++();
00164 iterator &operator++(int);
00166 iterator &operator--();
00168 iterator &operator--(int);
00170 move_type give_move();
00172 void give_point(point &);
00176 bool give_pixel(point &,point &);
00177
00179 bool operator==(const iterator &) const;
00181 bool operator!=(const iterator &) const;
00182 };
00183
00185 iterator & first();
00187 iterator & end();
00189 iterator & last();
00190 };
00191
00193 segment give_segment(dart d)
00194 {
00195 return segment(d,alph(d),level,pyr);
00196 }
00197 };
00198
00199
00200 typedef combinatorial_map::segment segment;
00201 typedef combinatorial_map::segment::iterator segment_iterator;
00202
00203 #endif // __COMBINATORIAL_MAP__