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