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

triquad.cpp

00001 /* 00002 ** triquad.cpp - Make triquad mesh 00003 ** 00004 ** Copyright (C) 2004 Luiz Velho. 00005 */ 00006 00007 #include <vector> 00008 #include <stack> 00009 #include <queue> 00010 00011 #include "a48.h" 00012 00013 using namespace A48; 00014 00022 struct node { 00023 double lenght; 00024 Edge *edge; 00025 00029 node( Edge *e, Mesh *m ) { 00030 edge = e; 00031 lenght = m->surf()->elenght(e); 00032 } 00033 00037 bool operator<( const node &a ) const { 00038 return lenght < a.lenght; 00039 } 00040 }; 00041 00046 void mark_link(Edge *e) 00047 { 00048 Hedge *h0 = e->hedge(0); 00049 Hedge *h1 = e->hedge(1); 00050 if (h0->face() != NULL) { 00051 h0->next()->edge()->set_mark(true); 00052 h0->prev()->edge()->set_mark(true); 00053 } 00054 if (h1->face() != NULL) { 00055 h1->next()->edge()->set_mark(true); 00056 h1->prev()->edge()->set_mark(true); 00057 } 00058 } 00059 00063 void Mesh::make_triquad(void) 00064 { 00065 std::priority_queue< node, std::vector< node >, std::less<node> > q; 00066 00067 for (VertexIter p = vc_.begin(); p != vc_.end(); p++) 00068 (*p)->set_level(0); 00069 for (EdgeIter e = ec_.begin(); e != ec_.end(); e++) { 00070 (*e)->set_mark(false); 00071 q.push(node(*e, this)); 00072 } 00073 while ( !q.empty() ) { 00074 node n = q.top(); q.pop(); 00075 if (!n.edge->is_marked()) { 00076 mark_link(n.edge); 00077 if (n.edge->hedge(0)->face() != NULL) 00078 split(n.edge->hedge(0)); 00079 else 00080 split(n.edge->hedge(1)); 00081 } 00082 } 00083 for (FaceIter f = fc_.begin(); f != fc_.end(); f++) 00084 if ((*f)->level() == 0) 00085 split(*f); 00086 for (VertexIter p = vc_.begin(); p != vc_.end(); p++) 00087 (*p)->set_level(0); 00088 } 00089 00090 00094 bool Mesh::is_triquad(void) 00095 { 00096 for (EdgeIter ei = ec_.begin(); ei != ec_.end(); ei++) { 00097 Edge *e = *ei; 00098 if (!e->is_bdry()) { 00099 bool f0s = (e->hedge(0)->face()->subd_edge() == e->hedge(0)); 00100 bool f1s = (e->hedge(1)->face()->subd_edge() == e->hedge(1)); 00101 if ((f0s && !f1s) || (!f0s && f1s)) 00102 return false; 00103 } 00104 } 00105 return true; 00106 } 00107

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