stellar.cpp

Go to the documentation of this file.
00001 /*:
00002 **     stellar.cpp - stellar operations
00003 **
00004 **   Copyright (C) 2004 Luiz Velho, Hélio Lopes, Esdras Medeiros.
00005 */
00006 
00007 #include "mesh.h"
00008 
00009 using namespace Mesh;
00010 
00016 Vertex* Surf::split(Hedge *e)
00017 {
00018   Hedge *el, *er;
00019   Face *f = e->face();
00020   if (f == NULL) throw Error("subdiv edge");
00021   Face *fm = e->mate()->face();
00022   Hedge *ef1 = e->next();
00023   Hedge *ef2 = e->prev();
00024   Hedge *efm1 = (fm)? e->mate()->next() : NULL;
00025   Hedge *efm2 = (fm)? e->mate()->prev() : NULL;
00026   Vertex *v = bisect(e, &el, &er);
00027   bisect(f, ef1, ef2, e, er);
00028   bisect(fm, efm1, efm2, er->mate(), e->mate());
00029   v->set_star(e);
00030   return v;
00031 }
00040 Vertex* Surf::bisect(Hedge* e, Hedge** el, Hedge** er)
00041 {
00042   Edge *bd = NULL; Hedge *epb= NULL;
00043   Vertex *v0 = e->org();
00044   Vertex *v1 = e->dst();
00045   Vertex *m = add_new_vertex(new Point());
00046   if (e->edge()->is_bdry()) {
00047     bd = e->get_bdry();
00048     epb = e->prev_on_bdry();
00049   }
00050   *el = e->reuse(v0, m);
00051   *er = add_new_edge(m, v1);
00052   if (v1->star_first() == e)
00053     v1->set_star((*er));
00054   if (bd != NULL) {
00055     (*el)->edge()->set_bdry(bd);
00056     (*er)->edge()->set_bdry(bd);
00057     (*el)->set_prev_on_bdry(*er); 
00058     (*er)->set_prev_on_bdry(epb); 
00059   }
00060   return m;
00061 }
00062 
00073 Hedge* Surf::bisect(Face *f, Hedge *e1, Hedge *e2, Hedge *el, Hedge *er)
00074 {
00075   if (f == NULL) return 0;
00076   Hedge *em = add_new_edge(e2->org(), er->org());
00077   f->reuse(e1, em, er);
00078   add_face(new Face(this, e2, el, em->mate()));
00079   return em;
00080 }
00081 
00088 Hedge* Surf::weld(Vertex *w)
00089 {
00090   int k, n;
00091   Hedge *ee, *e[6]; Face *f[6]; Vertex *v[6]; 
00092   for (n=0, ee=w->star_first(); ee != NULL; n++, ee=w->star_next(ee)) {
00093     if (n > 4) throw Error("weld");
00094     e[n] = ee;
00095     v[n] = ee->org();
00096     f[n] = ee->face();
00097   }
00098   if (n != 4 && n != 3) 
00099     { std::cerr << "can't weld " << n << "\n"; return NULL; }
00100   Hedge *p0 = e[0]->prev();
00101   Hedge *n2 = e[2]->mate()->next();
00102   Hedge *n0, *p2;
00103   if (f[2] != NULL) {
00104     n0 = e[0]->mate()->next();
00105     p2 = e[2]->prev();
00106   }
00107   Hedge *en = e[0]; e[0]->reuse(v[0], v[2]);
00108 
00109   if (v[2]->star_first() == e[2]->mate())
00110     v[2]->set_star(en);
00111   if (v[1]->star_first() == e[1]->mate())
00112     v[1]->set_star(n2);
00113   if (n == 4 && (v[3]->star_first() == e[3]->mate()))
00114     v[3]->set_star(n0);
00115 
00116   f[0]->reuse(en, n2, p0);
00117   if (f[2] != NULL)
00118     f[1]->reuse(en->mate(), n0, p2);
00119   else
00120     del_face(f[1]);
00121 
00122   for (k = 2; k < n; k++) 
00123     if (f[k] != NULL)
00124       del_face(f[k]);
00125   for (k = 1; k < n; k++)
00126     del_edge(e[k]->edge());
00127   del_vertex(w);
00128   return en;
00129 }
00130 
00137 Vertex* Surf::split(Face *f)
00138 {
00139   Hedge *e0 = f->hedge(0);
00140   Hedge *e1 = f->hedge(1);
00141   Hedge *e2 = f->hedge(2);
00142   Vertex *v0 = f->vertex(0);
00143   Vertex *v1 = f->vertex(1);
00144   Vertex *v2 = f->vertex(2);
00145   Vertex *vc = add_new_vertex(new Point());
00146   Hedge *e0c = add_new_edge(v0, vc);
00147   Hedge *e1c = add_new_edge(v1, vc);
00148   Hedge *e2c = add_new_edge(v2, vc);
00149   f->reuse(e0, e2c, e1c->mate());
00150   add_face(new Face(this, e1, e0c, e2c->mate()));
00151   add_face(new Face(this, e2, e1c, e0c->mate()));
00152   vc->set_star(e0c);
00153   return vc;
00154 }
00155 
00161 Hedge* Surf::flip(Hedge *h)
00162 {
00163   Hedge *m = h->mate();
00164   Face *fl = h->face();
00165   Face *fr = m->face();
00166   if (fl == NULL || fr == NULL)
00167     return h;
00168   Hedge *hp = h->prev(); 
00169   Hedge *hn = h->next();
00170   Hedge *mp = m->prev();
00171   Hedge *mn = m->next();
00172   Vertex *v0 = h->org();
00173   Vertex *v1 = h->dst();
00174   Vertex *vl = hp->org();
00175   Vertex *vr = mp->org();
00176   if (v0->star_first() == m)
00177     v0->set_star(hp);
00178   if (v1->star_first() == h)
00179     v1->set_star(mp);
00180   Hedge *o = h->reuse(vl, vr);
00181   fr->reuse(o, mp, hn);
00182   fl->reuse(o->mate(), hp, mn);
00183   return o;
00184 }
00185 

Generated on Fri Feb 24 12:23:21 2006 for TOPs by  doxygen 1.4.6-NO