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 for (elt = doc_first_elt[EL_QUAD]->next (); elt!=NULL; elt = elt->next())
53 if (elt!=NULL && elt->isHere())
55 Quad* quad = static_cast <Quad*> (elt);
59 // ========================================================= makeSkin
60 void makeSkin (Quad* orig)
63 queue <OrientedQuad> queue_quads;
65 orig->setOrientation(); // Q_DIRECT=1, Q_INVERSE=2
66 propagateOrientation (queue_quads, orig);
68 while (NOT queue_quads.empty ())
70 triplet = queue_quads.front ();
72 int n1 = triplet.quad->indexVertex (triplet.v1);
73 int n2 = triplet.quad->indexVertex (triplet.v2);
75 if (n2 == (n1+1) MODULO QUAD4)
77 else if (n1 == (n2+1) MODULO QUAD4)
80 printf (" **************** Orientation face impossible\n");
82 triplet.quad->setOrientation (sens);
83 propagateOrientation (queue_quads, triplet.quad);
86 // ==================================================== propagateOrientation
87 void propagateOrientation (queue <OrientedQuad> &queue_quads, Quad* orig)
90 // Q_DIRECT : le sens des vertex est l'exterieur
91 int sens = orig->getOrientation(); // Q_DIRECT=1, Q_INVERSE=2
93 for (int ned=0; ned<QUAD4 ; ned++)
95 triplet.v1 = orig->getVertex ( ned );
96 triplet.v2 = orig->getVertex ((ned+1) MODULO QUAD4);
99 Vertex* v3 = triplet.v1;
100 triplet.v1 = triplet.v2;
103 Edge* edge = orig->getEdge (ned);
104 int nbp = edge->getNbrParents ();
105 for (int np=0; np<nbp ; np++)
107 triplet.quad = edge->getParent (np);
108 if (triplet.quad->getOrientation ()==Q_UNDEFINED)
110 triplet.quad->setOrientation (Q_WAITING);
111 queue_quads.push (triplet);