00001
00002
00003
00004
00005
00006
00007
#include "a48.h"
00008
#include <map>
00009
00010
using namespace A48;
00011
00016 Mesh::Mesh(
Surface* s) : surf_(s)
00017 {
00018
int np, nf, *fcs;
00019
surf()->
base_mesh(&np, &fcs, &nf);
00020
set_base_mesh(np, fcs, nf);
00021
if (!
is_triquad())
00022
make_triquad();
00023
new_front();
00024 }
00025
00029 Mesh::~Mesh()
00030 {
00031
for (VertexIter p =
vc_.begin(); p !=
vc_.end(); p++)
00032
delete *p;
00033
vc_.clear();
00034
for (EdgeIter e =
ec_.begin(); e !=
ec_.end(); e++)
00035
delete *e;
00036
ec_.clear();
00037
for (FaceIter f =
fc_.begin(); f !=
fc_.end(); f++)
00038
delete *f;
00039
fc_.clear();
00040 }
00041
00049 Face* Mesh::add_face(
Hedge *e0,
Hedge *e1,
Hedge *e2)
00050 {
00051
Face *f =
new Face(e0, e1, e2);
00052
add_face(f);
00053
return f;
00054 }
00055
00062 Hedge* Mesh::add_edge(
Vertex *v0,
Vertex *v1)
00063 {
00064
Edge *e =
new Edge(v0, v1);
00065
add_edge(e);
00066
return e->
hedge(0);
00067 }
00068
00073 Vertex*
Mesh::add_vertex(
void)
00074 {
00075
Vertex *v =
surf()->
new_vertex();
00076
add_vertex(v);
00077
return v;
00078 }
00079
00083 void Mesh::link_mesh()
00084 {
00085
for (FaceIter f =
fc_.begin(); f !=
fc_.end(); f++)
00086 (*f)->link_star_verts();
00087
for (EdgeIter e =
ec_.begin(); e !=
ec_.end(); e++) {
00088
Hedge* h = (*e)->hedge(0);
00089
if (h->
is_bdry())
00090 h->
dst()->
set_star(h);
00091 }
00092 }
00093
00103 Hedge* Mesh::get_hedge(
int i0,
int i1,
Vertex* verts[], HedgeMap *hedges)
00104 {
00105
bool mate =
false;
00106
if (i0 > i1) {
00107 std::swap<int>(i0, i1);
00108 mate =
true;
00109 }
00110
Hedge* he; HedgeMap::iterator ei = hedges->find(
Ipair(i0,i1));
00111
if (ei == hedges->end())
00112 (*hedges)[
Ipair(i0,i1)] = he =
add_edge(verts[i0], verts[i1]);
00113
else
00114 he = (*ei).second;
00115
return (mate)? he->mate() : he ;
00116 }
00117
00127 void Mesh::put_face(
int i0,
int i1,
int i2,
Vertex* verts[], HedgeMap* hedges)
00128 {
00129
Hedge* e0 =
get_hedge(i1, i2, verts, hedges);
00130
Hedge* e1 = get_hedge(i2, i0, verts, hedges);
00131
Hedge* e2 = get_hedge(i0, i1, verts, hedges);
00132
add_face(e0, e1, e2);
00133 }
00134
00141 void Mesh::set_base_mesh(
int np,
int* tris,
int nf)
00142 {
00143
Vertex** verts =
new Vertex*[np];
00144
for (
int i=0; i < np; i++) {
00145 verts[i] =
surf()->
new_vertex();
00146
surf()->
sample(i, verts[i]);
00147
add_vertex(verts[i]);
00148 }
00149 HedgeMap hedges;
00150
for (
int i=0; i < nf; i++, tris += 3)
00151
put_face(tris[2], tris[0],tris[1], verts, &hedges);
00152
link_mesh();
00153
delete(verts);
00154 }