2 // C++ : Gestion des Quadrangles
6 #include "HexDocument.hxx"
8 #include "HexElements.hxx"
10 #include "HexXmlWriter.hxx"
11 #include "HexShape.hxx"
15 // ======================================================== Constructeur
16 Quad::Quad (Vertex* va, Vertex* vb, Vertex* vc, Vertex* vd)
17 : EltBase (va->dad(), EL_QUAD)
24 for (int nro=0 ; nro<QUAD4 ; nro++)
26 q_edge [nro] = new Edge (q_vertex[nro],
27 q_vertex[(nro+1) MODULO QUAD4]);
32 // ======================================================== Constructeur bis
33 Quad::Quad (Edge* ea, Edge* eb, Edge* ec, Edge* ed)
34 : EltBase (ea->dad(), EL_QUAD)
41 for (int nro=0 ; nro<QUAD4 ; nro++)
43 int ns = (nro+1) MODULO QUAD4;
45 int nc = q_edge[nro] -> inter (q_edge[ns]);
47 node = q_edge[nro]->getVertex (nc);
55 printf (" +++++++++++++++++++++++++++++++++++++++++++ \n");
56 printf (" +++ Quadrangle impossible \n");
57 printf (" +++++++++++++++++++++++++++++++++++++++++++ \n");
59 printf (" +++++++++++++++++++++++++++++++++++++++++++ \n");
61 for (int ned=0; ned<QUAD4; ned++)
63 q_edge[ned]->dumpPlus ();
65 HexDump (q_vertex[0]);
66 HexDump (q_vertex[1]);
67 HexDump (q_vertex[2]);
68 HexDump (q_vertex[3]);
70 printf (" +++++++++++++++++++++++++++++++++++++++++++ \n");
76 // ======================================================== Constructeur bis
77 Quad::Quad (Quad* other)
78 : EltBase (other->dad(), EL_QUAD)
80 for (int nro=0 ; nro<QUAD4 ; nro++)
83 q_vertex [nro] = NULL;
86 // ========================================================= getParent
87 void Quad::majReferences ()
89 for (int nro=0 ; nro<QUAD4 ; nro++)
90 q_edge [nro] -> addParent (this);
92 // ========================================================= getParent
93 Hexa* Quad::getParent (int nro)
95 return static_cast <Hexa*> (getFather (nro));
97 // ======================================================== anaMerge
98 int Quad::anaMerge (Vertex* v1, Vertex* v2, Vertex* tv1[], Edge* te1[])
101 for (int nro=0 ; orig == NOTHING && nro < QUAD4 ; nro++)
102 if (q_vertex [nro] == v1)
108 int nsp1 = (orig+1) MODULO QUAD4;
109 int nsm1 = (orig+QUAD4-1) MODULO QUAD4;
111 if (q_vertex [nsp1] == v2)
113 for (int nro=0 ; nro < QUAD4 ; nro++)
115 tv1 [nro] = q_vertex [(orig+nro) MODULO QUAD4];
116 te1 [nro] = q_edge [(orig+nro) MODULO QUAD4];
119 else if (q_vertex [nsm1] == v2)
121 for (int nro=0 ; nro < QUAD4 ; nro++)
123 tv1 [nro] = q_vertex [(orig+QUAD4-nro) MODULO QUAD4];
124 te1 [nro] = q_edge [(orig+QUAD4-nro) MODULO QUAD4];
132 // ======================================================== ordoVertex
133 int Quad::ordoVertex (Vertex* v1, Vertex* v2, Vertex* tv1[])
136 for (int nro=0 ; orig == NOTHING && nro < QUAD4 ; nro++)
137 if (q_vertex [nro] == v1)
143 int nsp1 = (orig+1) MODULO QUAD4;
144 int nsm1 = (orig+QUAD4-1) MODULO QUAD4;
146 if (q_vertex [nsp1] == v2)
148 for (int nro=0 ; nro < QUAD4 ; nro++)
149 tv1 [nro] = q_vertex [(orig+nro) MODULO QUAD4];
151 else if (q_vertex [nsm1] == v2)
153 for (int nro=0 ; nro < QUAD4 ; nro++)
154 tv1 [nro] = q_vertex [(orig+QUAD4-nro) MODULO QUAD4];
161 // ======================================================== getBrother
162 Quad* Quad::getBrother (StrOrient* orient)
164 /* *****************************
165 printf (" getBrother ");
167 printf (" .. Base : ");
168 orient->v21->printName();
169 orient->v22->printName();
170 printf ("dir=%d, arete=", orient->dir);
171 ***************************** */
173 int n21 = indexVertex (orient->v21);
174 int n22 = indexVertex (orient->v22);
176 int sens = n22 - n21;
177 if (sens > 1) sens -= QUAD4;
178 if (sens < -1) sens += QUAD4;
179 if (sens*sens !=1) return NULL;
183 case OR_LEFT : n22 = n21 - sens;
185 case OR_RIGHT : n21 = n22 + sens;
187 case OR_FRONT : n21 += 2;
193 n21 = (n21 + QUAD4) MODULO QUAD4;
194 n22 = (n22 + QUAD4) MODULO QUAD4;
196 orient->v21 = q_vertex [n21];
197 orient->v22 = q_vertex [n22];
199 Edge* arete = findEdge (orient->v21, orient->v22);
200 arete->printName("\n");
202 int nbfreres = arete->getNbrParents ();
204 for (int nq = 0 ; nq < nbfreres ; nq++)
206 Quad* next = arete->getParent (nq);
207 if (next!=NULL && next != this )
209 int nbp = next->getNbrParents();
210 Hexa* dad = next->getParent(0);
211 int mark = next->getMark();
212 int mark2 = dad ? dad->getMark() : IS_NONE;
214 if (nbp <= 1 && mark2 != IS_MARRIED && mark == IS_NONE)
216 // if (nbp <= 1 && mark == IS_NONE)
222 // ======================================================== coupler
223 int Quad::coupler (Quad* other, StrOrient* orient, Elements* table)
228 Hexa* hexa = other->getParent(0);
230 setMark (IS_MARRIED);
231 other->setMark (IS_MARRIED);
233 hexa->setMark (IS_MARRIED);
235 for (int ned = 0 ; ned < QUAD4 ; ned++)
237 Edge* arete = q_edge[ned];
238 int nbfreres = arete ->getNbrParents ();
239 for (int nq = 0 ; nq < nbfreres ; nq++)
241 Quad* next = arete->getParent (nq);
242 if (next!=NULL && next != this && next->getMark() > 0)
244 StrOrient new_ori (orient);
245 new_ori.dir = OR_FRONT;
246 Vertex* va = arete->getVertex (V_AMONT);
247 Vertex* vb = arete->getVertex (V_AVAL);
249 // On voit si un point de repere est conserve
250 if (va == orient->v11)
253 new_ori.dir += OR_LEFT;
255 else if (vb == orient->v11)
258 new_ori.dir += OR_LEFT;
261 if (va == orient->v12)
264 new_ori.dir += OR_RIGHT;
266 else if (vb == orient->v12)
269 new_ori.dir += OR_RIGHT;
272 if (new_ori.dir == OR_FRONT)
274 if (definedBy (va, orient->v11))
286 int nro = next->getMark ();
287 Quad* beauf = other->getBrother (&new_ori);
288 table->coupler (nro, beauf, &new_ori);
289 next->coupler (beauf, &new_ori, table);
295 // ======================================================== getOpposEdge
296 Edge* Quad::getOpposEdge (Edge* start, int& sens)
299 int na = indexVertex (start->getVertex (V_AMONT));
300 int nb = indexVertex (start->getVertex (V_AVAL));
302 Vertex* vaprim = q_vertex [(nb+2) MODULO QUAD4];
303 Vertex* vbprim = q_vertex [(na+2) MODULO QUAD4];
305 for (int ned = 0 ; ned < QUAD4 ; ned++)
307 if ( q_edge[ned]->getVertex(V_AMONT) == vaprim
308 && q_edge[ned]->getVertex(V_AVAL ) == vbprim)
313 else if ( q_edge[ned]->getVertex(V_AMONT) == vbprim
314 && q_edge[ned]->getVertex(V_AVAL ) == vaprim)
320 // TODO : traiter l'erreur
322 for (int ned = 0 ; ned < QUAD4 ; ned++)
327 // ========================================================= getParent
328 void Quad::saveXml (XmlWriter& xml)
333 for (int nro=0 ; nro<QUAD4 ; nro++)
335 if (nro>0) edges += " ";
336 edges += q_edge[nro]->getName(buffer);
339 xml.openMark ("Quad");
340 xml.addAttribute ("id", getName (buffer));
341 xml.addAttribute ("edges", edges);
343 xml.addAttribute ("shape", el_assoc->getBrep().c_str());
346 // ======================================================== replaceEdge
347 void Quad::replaceEdge (Edge* old, Edge* par)
349 for (int nro=0 ; nro<QUAD4 ; nro++)
351 if (q_edge[nro]==old)
358 printf (" [%d], ", nro);
359 old->printName (" est remplace par ");
360 par->printName ("\n");
365 // ======================================================== replaceVertex
366 void Quad::replaceVertex (Vertex* old, Vertex* par)
368 for (int nro=0 ; nro<QUAD4 ; nro++)
370 if (q_vertex [nro]==old)
372 q_vertex [nro] = par;
377 printf (" [%d], ", nro);
378 old->printName (" est remplace par ");
379 par->printName ("\n");
384 // ======================================================== dump
390 printf ("*** deleted ***)\n");
394 for (int nro=0 ; nro<QUAD4 ; nro++)
395 PrintName (q_edge[nro]);
399 for (int nro=0 ; nro<QUAD4 ; nro++)
400 PrintName (q_vertex[nro]);
405 // ======================================================== dumpPlus
406 void Quad::dumpPlus ()
412 for (int nro=0 ; nro < QUAD4 ; nro++)
414 Vertex* pv = q_vertex[nro];
419 printf ( " (%g, %g, %g)\n", pv->getX(), pv->getY(), pv->getZ());