Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

mesh.h

Go to the documentation of this file.
00001 00006 /* Copyright (C) 2004 Luiz Velho. */ 00007 00008 #ifndef MESH_H 00009 #define MESH_H 00010 00011 namespace A48 { 00012 00021 class Surface { 00022 public: 00027 virtual void base_mesh(int *np, int **fcs, int *nf) = 0; 00028 00032 virtual void sample(int i, Vertex* v) = 0; 00033 00037 virtual void sample(Edge* e, Vertex* v) = 0; 00038 00042 virtual void sample(Face* f, Vertex* v) = 0; 00043 00047 virtual float elenght(Edge* e) = 0; 00048 00052 virtual float ref_rank(Edge* e) = 0; 00053 00057 virtual float simpl_rank(Vertex* v) = 0; 00058 00061 virtual Vertex* new_vertex(void) = 0; 00062 00065 virtual void del_vertex(Vertex *v) = 0; 00066 }; 00067 00068 00074 class Mesh { 00075 Surface *surf_; 00076 FaceContainer fc_; 00077 EdgeContainer ec_; 00078 VertexContainer vc_; 00079 MxHeap sf_; 00080 MxHeap rf_; 00081 00082 public: 00084 Mesh(Surface *s); 00085 00087 ~Mesh(); 00088 00091 Surface* surf() { return surf_; }; 00092 00095 VertexIter verts_begin(){ return vc_.begin(); }; 00096 00099 VertexIter verts_end(){ return vc_.end(); }; 00100 00103 int num_verts() { return vc_.size(); }; 00104 00107 EdgeIter edges_begin() { return ec_.begin(); }; 00108 00111 EdgeIter edges_end() { return ec_.end(); }; 00112 00115 int num_edges() { return ec_.size(); }; 00116 00119 FaceIter faces_begin() { return fc_.begin(); }; 00120 00123 FaceIter faces_end() { return fc_.end(); }; 00124 00127 int num_faces() { return fc_.size(); }; 00128 00130 void adapt_refine(double t); 00131 00133 void adapt_simplify(double t); 00134 00136 Vertex* refine(Hedge* e); 00137 00139 Hedge* simplify(Vertex* w); 00140 00142 Vertex* split(Face* f); 00143 00145 Vertex* split(Hedge* e); 00146 00148 Hedge* weld(Vertex* w); 00149 00151 Hedge* flip(Hedge *h); 00152 00153 private: 00154 00156 Vertex *add_vertex(void); 00157 00161 bool add_vertex(Vertex *v) 00162 { std::pair<VertexIter, bool> r = vc_.insert(v); return r.second; }; 00163 00166 void del_vertex(Vertex* v) { vc_.erase(v); surf()->del_vertex(v); }; 00167 00169 Hedge *add_edge(Vertex *v0, Vertex *v1); 00170 00174 bool add_edge(Edge *e) 00175 { std::pair<EdgeIter, bool> r = ec_.insert(e); return r.second;}; 00176 00179 void del_edge(Edge* e) { ec_.erase(e); delete(e); } 00180 00182 Face* add_face(Hedge* e0, Hedge* e1, Hedge* e2); 00183 00187 bool add_face(Face* f) 00188 { std::pair<FaceIter, bool> r = fc_.insert(f); return r.second;} 00189 00191 void del_face(Face* f) { fc_.erase(f); delete(f); } 00192 00194 void link_mesh(); 00195 00197 Vertex* bisect(Hedge* e, Hedge** el, Hedge** er); 00198 00200 Hedge* bisect(Face *f, Hedge *e1, Hedge *e2, Hedge *el, Hedge *er); 00201 00203 void new_front(); 00204 00206 void update_ref_front(Edge* e); 00207 00209 void update_ref_front(Vertex* v); 00210 00212 void update_simpl_front(Vertex* v); 00213 00215 void update_simpl_front(Edge* e); 00216 00218 bool is_triquad(void); 00219 00221 void make_triquad(void); 00222 00224 void set_base_mesh(int np, int* tris, int nf); 00225 00227 Hedge* get_hedge(int i0, int i1, Vertex* verts[], HedgeMap* edges); 00228 00230 void put_face(int i0, int i1, int i2, Vertex* verts[], HedgeMap* edges); 00231 }; 00232 00233 00234 } 00235 00236 #endif

Generated on Mon Oct 11 19:32:07 2004 for A48 by doxygen 1.3.7