2 // C++ : Reordonnancement des faces
4 #include "HexDocument.hxx"
6 #include "HexVertex.hxx"
14 // ----------------------------------------------------------------------
22 void propagateOrientation (queue <OrientedQuad> &queue_quads, Quad* orig);
23 void makeSkin (Quad* orig);
25 // ========================================================= reorderFaces
26 // ==== Ordonner les faces externes
27 void Document::reorderQuads ()
32 for (elt = doc_first_elt[EL_QUAD]->next (); elt!=NULL; elt = elt->next())
33 if (elt!=NULL && elt->isHere())
35 Quad* quad = static_cast <Quad*> (elt);
36 if (quad->getNbrParents()==1) quad->setOrientation (Q_UNDEFINED);
37 else quad->setOrientation (Q_INSIDE);
40 for (elt = doc_first_elt[EL_HEXA]->next (); elt!=NULL; elt = elt->next())
41 if (elt!=NULL && elt->isHere())
43 Hexa* hexa = static_cast <Hexa*> (elt);
44 for (int nq=0; nq<HQ_MAXI ; nq++)
46 Quad* quad = hexa->getQuad (nq);
47 if (quad->getOrientation()==Q_UNDEFINED)
52 // ========================================================= makeSkin
53 void makeSkin (Quad* orig)
56 queue <OrientedQuad> queue_quads;
58 orig->setOrientation(); // Q_DIRECT=1, Q_INVERSE=2
59 propagateOrientation (queue_quads, orig);
61 while (NOT queue_quads.empty ())
63 triplet = queue_quads.front ();
65 int n1 = triplet.quad->indexVertex (triplet.v1);
66 int n2 = triplet.quad->indexVertex (triplet.v2);
68 if (n2 == (n1+1) MODULO QUAD4)
70 else if (n1 == (n2+1) MODULO QUAD4)
73 printf (" **************** Orientation face impossible\n");
75 triplet.quad->setOrientation (sens);
76 propagateOrientation (queue_quads, triplet.quad);
79 // ==================================================== propagateOrientation
80 void propagateOrientation (queue <OrientedQuad> &queue_quads, Quad* orig)
83 // Q_DIRECT : le sens des vertex est l'exterieur
84 int sens = orig->getOrientation(); // Q_DIRECT=1, Q_INVERSE=2
86 for (int ned=0; ned<QUAD4 ; ned++)
88 triplet.v1 = orig->getVertex ( ned );
89 triplet.v2 = orig->getVertex ((ned+1) MODULO QUAD4);
92 Vertex* v3 = triplet.v1;
93 triplet.v1 = triplet.v2;
96 Edge* edge = orig->getEdge (ned);
97 int nbp = edge->getNbrParents ();
98 for (int np=0; np<nbp ; np++)
100 triplet.quad = edge->getParent (np);
101 if (triplet.quad->getOrientation ()==Q_UNDEFINED)
103 triplet.quad->setOrientation (Q_WAITING);
104 queue_quads.push (triplet);