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

stellar.cpp

00001 /*: 00002 ** stellar.cpp - stelalr operations 00003 ** 00004 ** Copyright (C) 2004 Luiz Velho. 00005 */ 00006 00007 #include <algorithm> 00008 #include "a48.h" 00009 00010 using namespace std; 00011 using namespace A48; 00012 00013 00019 Vertex* Mesh::split(Hedge *e) 00020 { 00021 Hedge *el, *er; 00022 if (e->face() == NULL) e = e->mate(); 00023 Face *f = e->face(); 00024 if (f == NULL) throw Error("subdiv edge"); 00025 int lf0 = f->level(); 00026 Face *fm = e->mate()->face(); 00027 int lf1 = (fm)? fm->level() : 0; 00028 Hedge *ef1 = e->next(); 00029 Hedge *ef2 = e->prev(); 00030 Hedge *efm1 = (fm)? e->mate()->next() : NULL; 00031 Hedge *efm2 = (fm)? e->mate()->prev() : NULL; 00032 Vertex *v = bisect(e, &el, &er); 00033 bisect(f, ef1, ef2, e, er); 00034 bisect(fm, efm1, efm2, er->mate(), e->mate()); 00035 v->set_star(e); 00036 v->set_level(max(lf0, lf1) + 1); 00037 return v; 00038 } 00039 00048 Vertex* Mesh::bisect(Hedge* e, Hedge** el, Hedge** er) 00049 { 00050 Vertex *v0 = e->org(); 00051 Vertex *v1 = e->dst(); 00052 Vertex *m = add_vertex(); 00053 m->set_level(e->level() + 1); 00054 surf()->sample(e->edge(), m); 00055 *el = e->reuse(v0, m); 00056 *er = add_edge(m, v1); 00057 if (v1->star_first() == e) 00058 v1->set_star((*er)); 00059 return m; 00060 } 00061 00072 Hedge* Mesh::bisect(Face *f, Hedge *e1, Hedge *e2, Hedge *el, Hedge *er) 00073 { 00074 if (f == NULL) return 0; 00075 Hedge *em = add_edge(e2->org(), er->org()); 00076 f->reuse(e1, em, er); 00077 add_face(new Face(e2, el, em->mate())); 00078 return em; 00079 } 00080 00087 Hedge* Mesh::weld(Vertex *w) 00088 { 00089 int k, n; 00090 Hedge *ee, *e[6]; Face *f[6]; Vertex *v[6]; 00091 if (w->level() == 0) 00092 return NULL; 00093 for (n=0, ee=w->star_first(); ee != NULL; n++, ee=w->star_next(ee)) { 00094 if (n > 4) throw Error("weld"); 00095 e[n] = ee; 00096 v[n] = ee->org(); 00097 f[n] = ee->face(); 00098 } 00099 if (n != 4 && n != 3) 00100 { std::cerr << "can't weld " << n << "\n"; return NULL; } 00101 Hedge *p0 = e[0]->prev(); 00102 Hedge *n2 = e[2]->mate()->next(); 00103 Hedge *n0, *p2; 00104 if (f[2] != NULL) { 00105 n0 = e[0]->mate()->next(); 00106 p2 = e[2]->prev(); 00107 } 00108 Hedge *en = e[0]; e[0]->reuse(v[0], v[2]); 00109 00110 if (v[2]->star_first() == e[2]->mate()) 00111 v[2]->set_star(en); 00112 if (v[1]->star_first() == e[1]->mate()) 00113 v[1]->set_star(n2); 00114 if (n == 4 && (v[3]->star_first() == e[3]->mate())) 00115 v[3]->set_star(n0); 00116 00117 f[0]->reuse(en, n2, p0); 00118 if (f[2] != NULL) 00119 f[1]->reuse(en->mate(), n0, p2); 00120 else 00121 del_face(f[1]); 00122 00123 for (k = 2; k < n; k++) 00124 if (f[k] != NULL) 00125 del_face(f[k]); 00126 for (k = 1; k < n; k++) 00127 del_edge(e[k]->edge()); 00128 del_vertex(w); 00129 return en; 00130 } 00131 00138 Vertex* Mesh::split(Face *f) 00139 { 00140 Hedge *e0 = f->hedge(0); 00141 Hedge *e1 = f->hedge(1); 00142 Hedge *e2 = f->hedge(2); 00143 Vertex *v0 = f->vertex(0); 00144 Vertex *v1 = f->vertex(1); 00145 Vertex *v2 = f->vertex(2); 00146 Vertex *vc = add_vertex(); 00147 vc->set_level(f->level() + 1); 00148 surf()->sample(f, vc); 00149 Hedge *e0c = add_edge(v0, vc); 00150 Hedge *e1c = add_edge(v1, vc); 00151 Hedge *e2c = add_edge(v2, vc); 00152 f->reuse(e0, e2c, e1c->mate()); 00153 add_face(new Face(e1, e0c, e2c->mate())); 00154 add_face(new Face(e2, e1c, e0c->mate())); 00155 vc->set_star(e0c); 00156 return vc; 00157 } 00158 00164 Hedge* Mesh::flip(Hedge *h) 00165 { 00166 Hedge *m = h->mate(); 00167 Face *fl = h->face(); 00168 Face *fr = m->face(); 00169 if (fl == NULL || fr == NULL) 00170 return h; 00171 Hedge *hp = h->prev(); 00172 Hedge *hn = h->next(); 00173 Hedge *mp = m->prev(); 00174 Hedge *mn = m->next(); 00175 Vertex *v0 = h->org(); 00176 Vertex *v1 = h->dst(); 00177 Vertex *vl = hp->org(); 00178 Vertex *vr = mp->org(); 00179 if (v0->star_first() == m) 00180 v0->set_star(hp); 00181 if (v1->star_first() == h) 00182 v1->set_star(mp); 00183 Hedge *o = h->reuse(vl, vr); 00184 fr->reuse(o, mp, hn); 00185 fl->reuse(o->mate(), hp, mn); 00186 return o; 00187 }

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