00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 # ifndef shape_dualize_hpp
00012 # define shape_dualize_hpp
00013
00014 # include <shape/list.hpp>
00015 # include <shape/kdtree_cell.hpp>
00016 # include <shape/dualize.hpp>
00017
00018 # define TMPL template<class C,class V, class Cell>
00019 # define TMPL1 template<class V>
00020 # define SELF dualize<C,V,Cell>
00021
00022 namespace mmx { namespace shape {
00023
00024 struct dualize_def {};
00025
00026 template<class C,class V=default_env, class Cell=cell<C,V> >
00027 struct dualize: public PROCESS_OF(V)
00028 {
00029
00030 typedef node<Cell*> Node;
00031 typedef kdtree_cell<Cell> Input;
00032
00033
00034 struct graph {
00035
00036 typedef Cell value_type;
00037 typedef node<Cell*> Node;
00038
00039 public:
00040 Seq<Cell*> m_vertices;
00041 Seq<Cell*> m_edges;
00042 Seq<Cell*> m_faces;
00043 Seq<Cell*> m_cells;
00044 };
00045
00046 typedef graph Output;
00047
00048 dualize(void);
00049 dualize(Input*);
00050 ~dualize(void) ;
00051
00052 void set_input (Input* i) { m_input = i; }
00053 Input* get_input (void) { return m_input; }
00054 Output* get_output (void) { return m_output; }
00055
00056 void run();
00057
00058 void get_dual_vertex(Node*);
00059 void get_dual_edge (Node*, Node*);
00060 void get_dual_face (Node*, Node*, Node*, Node*);
00061 void get_dual_cell (Node*, Node*, Node*, Node*, Node*, Node*, Node*, Node*);
00062
00063 void clear(void);
00064
00065 private:
00066 Input* m_input;
00067 Output* m_output;
00068 };
00069
00070 TMPL SELF::dualize() {
00071 m_output = new Output;
00072 }
00073
00074 TMPL SELF::dualize(Input* in) {
00075 m_input = in;
00076 m_output = new Output;
00077 }
00078
00079 TMPL SELF::~dualize(void) {
00080 delete m_output;
00081 }
00082
00083 TMPL void SELF::get_dual_vertex(Node* n) {
00084 if(!n->get_cell()->is_active()) return;
00085
00086 if(!n->is_leaf()) {
00087 this->get_dual_vertex(n->left());
00088 this->get_dual_vertex(n->right());
00089 use<dualize_def,C,V>::dual_edge(this, n->left(), n->right());
00090 return;
00091 }
00092 use<dualize_def,C,V>::insert_vertex(this, n);
00093 }
00094
00095
00096 TMPL void SELF::get_dual_edge(Node* n1, Node* n2) {
00097
00098 if(!is_adjacent(n1,n2)) return;
00099
00100 if(!n1->get_cell()->is_active() && !n2->get_cell()->is_active()) return;
00101
00102 if(!n1->is_leaf()) {
00103 if (is_adjacent(n1->left(), n2)) get_dual_edge(n1->left(), n2);
00104 if (is_adjacent(n1->right(),n2)) get_dual_edge(n1->right(), n2);
00105
00106 return;
00107 }
00108
00109 if(!n2->is_leaf()){
00110 if (is_adjacent(n1,n2->left())) get_dual_edge(n1,n2->left());
00111 if (is_adjacent(n1,n2->right())) get_dual_edge(n1,n2->right());
00112
00113 return;
00114 }
00115
00116 use<dualize_def,C,V>::insert_edge(this, n1,n2);
00117 }
00118
00119
00120 TMPL void SELF::get_dual_face(Node* n1, Node* n2, Node* n3, Node* n4) {
00121 if(!n1->get_cell()->is_active() &&
00122 !n2->get_cell()->is_active() &&
00123 !n3->get_cell()->is_active() &&
00124 !n4->get_cell()->is_active()) return;
00125
00126 if(!is_adjacent(n1,n2) ||
00127 !is_adjacent(n2,n3) ||
00128 !is_adjacent(n3,n4) ||
00129 !is_adjacent(n4,n1) ) return;
00130
00131 if(!n1->is_leaf()) {
00132 if (is_adjacent(n1->left(),n2) && is_adjacent(n1->left(),n4))
00133 get_dual_face(n1->left(),n2,n3,n4);
00134 if (is_adjacent(n1->right(),n2) && is_adjacent(n1->right(),n4))
00135 get_dual_face(n1->right(),n2,n3,n4);
00136
00137 if (is_adjacent(n1->left() ,n2) && is_adjacent(n1->left() ,n4) &&
00138 is_adjacent(n1->right(),n2) && is_adjacent(n1->right(),n4) )
00139 use<dualize_def,C,V>::dual_cell(this, n1->left(), n2,n3,n4, n1->right(),n2,n3,n4);
00140 return;
00141 }
00142
00143 if(!n2->is_leaf()) {
00144 if (is_adjacent(n1,n2->left()) && is_adjacent(n2->left(),n3))
00145 get_dual_face(n1,n2->left(), n3,n4);
00146 if (is_adjacent(n1,n2->right()) && is_adjacent(n2->right(),n3))
00147 get_dual_face(n1,n2->right(),n3,n4);
00148
00149 if (is_adjacent(n1,n2->left() ) && is_adjacent(n2->left() ,n3) &&
00150 is_adjacent(n1,n2->right()) && is_adjacent(n2->right(),n3) )
00151 use<dualize_def,C,V>::dual_cell(this, n1,n2->left(), n3,n4, n1,n2->right(),n3,n4);
00152 return;
00153 }
00154
00155 if(!n3->is_leaf()) {
00156 if (is_adjacent(n2,n3->left()) && is_adjacent(n3->left(),n4))
00157 get_dual_face(n1,n2,n3->left(), n4);
00158 if (is_adjacent(n2,n3->right()) && is_adjacent(n3->right(),n4))
00159 get_dual_face(n1,n2,n3->right(),n4);
00160
00161 if (is_adjacent(n2,n3->left() ) && is_adjacent(n3->left() ,n4) &&
00162 is_adjacent(n2,n3->right()) && is_adjacent(n3->right(),n4) )
00163 use<dualize_def,C,V>::dual_cell(this, n1,n2,n3->left(),n4, n1,n2,n3->right(),n4);
00164 return;
00165 }
00166
00167 if(!n4->is_leaf()) {
00168 if (is_adjacent(n3,n4->left()) && is_adjacent(n4->left(),n1))
00169 get_dual_face(n1,n2,n3,n4->left());
00170 if (is_adjacent(n3,n4->right()) && is_adjacent(n4->right(),n1))
00171 get_dual_face(n1,n2,n3,n4->right());
00172
00173 if (is_adjacent(n3,n4->left() ) && is_adjacent(n4->left() ,n1) &&
00174 is_adjacent(n3,n4->right()) && is_adjacent(n4->right(),n1) )
00175 use<dualize_def,C,V>::dual_cell(this, n1,n2,n3, n4->left(), n1,n2,n3, n4->right());
00176 return;
00177 }
00178
00179 use<dualize_def,C,V>::insert_face(this,n1,n2,n3,n4);
00180 return;
00181 }
00182
00183 TMPL void SELF::get_dual_cell(Node* n1, Node* n2, Node* n3, Node* n4,
00184 Node* n5, Node* n6, Node* n7, Node* n8) {
00185
00186 if(!n1->get_cell()->is_active() &&
00187 !n2->get_cell()->is_active() &&
00188 !n3->get_cell()->is_active() &&
00189 !n4->get_cell()->is_active() &&
00190 !n5->get_cell()->is_active() &&
00191 !n6->get_cell()->is_active() &&
00192 !n7->get_cell()->is_active() &&
00193 !n8->get_cell()->is_active()) return;
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 if(!n1->is_leaf()) {
00209 if (is_adjacent(n1->left(),n2) && is_adjacent(n1->left(),n4) && is_adjacent(n1->left(),n5))
00210 get_dual_cell(n1->left(), n2,n3,n4,n5,n6,n7,n8);
00211 if (is_adjacent(n1->right(),n2) && is_adjacent(n1->right(),n4) && is_adjacent(n1->right(),n5))
00212 get_dual_cell(n1->right(),n2,n3,n4,n5,n6,n7,n8);
00213 return;
00214 }
00215
00216 if(!n2->is_leaf()) {
00217 if (is_adjacent(n1,n2->left()) && is_adjacent(n2->left(),n3) && is_adjacent(n2->left(),n6))
00218 get_dual_cell(n1,n2->left(), n3,n4,n5,n6,n7,n8);
00219 if (is_adjacent(n1,n2->right()) && is_adjacent(n2->right(),n3) && is_adjacent(n2->right(),n6))
00220 get_dual_cell(n1,n2->right(),n3,n4,n5,n6,n7,n8);
00221 return;
00222 }
00223
00224 if(!n3->is_leaf()) {
00225 if (is_adjacent(n2,n3->left()) && is_adjacent(n3->left(),n4) && is_adjacent(n3->left(),n7))
00226 get_dual_cell(n1,n2,n3->left(), n4,n5,n6,n7,n8);
00227 if (is_adjacent(n2,n3->right()) && is_adjacent(n3->right(),n4) && is_adjacent(n3->right(),n7))
00228 get_dual_cell(n1,n2,n3->right(),n4,n5,n6,n7,n8);
00229 return;
00230 }
00231
00232 if(!n4->is_leaf()) {
00233 if (is_adjacent(n3,n4->left()) && is_adjacent(n4->left(),n1) && is_adjacent(n4->left(),n8))
00234 get_dual_cell(n1,n2,n3,n4->left(), n5,n6,n7,n8);
00235 if (is_adjacent(n3,n4->right()) && is_adjacent(n4->right(),n1) && is_adjacent(n4->right(),n8))
00236 get_dual_cell(n1,n2,n3,n4->right(),n5,n6,n7,n8);
00237 return;
00238 }
00239
00240
00241 if(!n8->is_leaf()) {
00242 if (is_adjacent(n4,n8->left()) && is_adjacent(n7,n8->left()) && is_adjacent(n8->left(),n5))
00243 get_dual_cell(n1,n2,n3,n4,n5,n6,n7,n8->left() );
00244 if (is_adjacent(n4,n8->right()) && is_adjacent(n7,n8->right()) && is_adjacent(n8->right(),n5))
00245 get_dual_cell(n1,n2,n3,n4,n5,n6,n7,n8->right());
00246 return;
00247 }
00248
00249 if(!n7->is_leaf()) {
00250 if (is_adjacent(n3,n7->left()) && is_adjacent(n6,n7->left()) && is_adjacent(n7->left(),n8))
00251 get_dual_cell(n1,n2,n3,n4,n5,n6,n7->left(), n8);
00252 if (is_adjacent(n3,n7->right()) && is_adjacent(n6,n7->right()) && is_adjacent(n7->right(),n8))
00253 get_dual_cell(n1,n2,n3,n4,n5,n6,n7->right(),n8);
00254 return;
00255 }
00256
00257 if(!n6->is_leaf()) {
00258 if (is_adjacent(n2,n6->left()) && is_adjacent(n5,n6->left()) && is_adjacent(n6->left(),n7))
00259 get_dual_cell(n1,n2,n3,n4,n5,n6->left(), n7,n8);
00260 if (is_adjacent(n2,n6->right()) && is_adjacent(n5,n6->right()) && is_adjacent(n6->right(),n7))
00261 get_dual_cell(n1,n2,n3,n4,n5,n6->right(),n7,n8);
00262 return;
00263 }
00264
00265 if(!n5->is_leaf()) {
00266 if (is_adjacent(n1,n5->left()) && is_adjacent(n5->left(),n6) && is_adjacent(n8,n5->left()))
00267 get_dual_cell(n1,n2,n3,n4,n5->left(), n6,n7,n8);
00268 if (is_adjacent(n1,n5->right()) && is_adjacent(n5->right(),n6) && is_adjacent(n8,n5->right()))
00269 get_dual_cell(n1,n2,n3,n4,n5->right(),n6,n7,n8);
00270 return;
00271 }
00272
00273 use<dualize_def,C,V >::insert_cell(this, n1,n2,n3,n4, n5,n6,n7,n8);
00274 }
00275
00276
00277 TMPL void SELF::run() {
00278 this->get_dual_vertex(m_input->root());
00279 }
00280
00281 TMPL void SELF::clear(void) {
00282 }
00283
00284
00285 } ;
00286 } ;
00287
00288 # undef TMPL
00289 # undef TMPL1
00290 # undef SELF
00291 # endif