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

mesh.cpp

00001 /*: 00002 ** mesh.cpp - mesh ops 00003 ** 00004 ** Copyright (C) 2004 Luiz Velho. 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 }

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