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

adapt.cpp

00001 /*: 00002 ** adapt.cpp - Adaptation scheme 00003 ** 00004 ** Copyright (C) 2004 Luiz Velho. 00005 */ 00006 00007 #include "a48.h" 00008 00009 using namespace A48; 00010 00016 Vertex* Mesh::refine(Hedge *e) 00017 { 00018 Face *f; Hedge *r[2]; int n = 0; 00019 if ((f = e->face()) != NULL && f->subd_edge() != e) 00020 r[n++] = f->subd_edge(); 00021 if ((f = e->mate()->face()) != NULL && f->subd_edge() != e->mate()) 00022 r[n++] = f->subd_edge(); 00023 for (int k=0; k < n; k++) 00024 refine(r[k]); 00025 update_ref_front(e->edge()); 00026 Vertex* w = split(e); 00027 update_ref_front(w); 00028 return w; 00029 } 00030 00036 Hedge* Mesh::simplify(Vertex *w) 00037 { 00038 int n = 0, weld_deg = (w->is_bdry()) ? 3 : 4; 00039 do { 00040 int lmax = w->level(); Hedge *e; Vertex *u, *v; 00041 for (e = w->star_first(), n = 0; e != NULL; e = w->star_next(e), n++) { 00042 u = e->org(); 00043 if (u->level() > lmax) { 00044 lmax = u->level(); v = u; 00045 } 00046 } 00047 if (lmax > w->level()) 00048 simplify(v); 00049 } while (n > weld_deg); 00050 update_simpl_front(w); 00051 Hedge* e = weld(w); 00052 update_simpl_front(e->edge()); 00053 return e; 00054 } 00055 00061 void Mesh::adapt_refine(double t) 00062 { 00063 for (EdgeIter ei = ec_.begin(); ei != ec_.end(); ei++) 00064 if ((*ei)->is_in_heap()) 00065 rf_.update((MxHeapable*)(*ei), surf()->ref_rank(*ei)); 00066 Edge *e; 00067 while ((e = (Edge*) rf_.extract()) != NULL) { 00068 if (e->heap_key() < t) { 00069 rf_.insert((MxHeapable*)e, surf()->ref_rank(e)); 00070 return; 00071 } 00072 refine(e->hedge(0)); 00073 } 00074 } 00075 00076 00082 void Mesh::adapt_simplify(double t) 00083 { 00084 for (VertexIter vi = vc_.begin(); vi != vc_.end(); vi++) 00085 if ((*vi)->is_in_heap()) 00086 sf_.update((MxHeapable*)(*vi), surf()->simpl_rank(*vi)); 00087 Vertex *v; 00088 while ((v = (Vertex*) sf_.extract()) != NULL) { 00089 if (v->heap_key() < t) { 00090 sf_.insert((MxHeapable*)v, surf()->simpl_rank(v)); 00091 return; 00092 } 00093 simplify(v); 00094 } 00095 }

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