00001
00002
00003
00004
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 }