stellar.cpp
00001
00002
00003
00004
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
1.3.7