+// ====================================================== perpendicularQuad
+Quad* Hexa::perpendicularQuad (Quad* quad, Edge* edge)
+{
+ if (BadElement (quad) || BadElement (edge))
+ return NULL;
+
+ int qed = quad->indexEdge (edge);
+ int ned = findEdge (edge);
+ int nq = findQuad (quad);
+ if (qed <0 || ned<0 || nq<0)
+ return NULL;
+
+ for (int nro=0 ; nro<HQ_MAXI ; nro++)
+ {
+ if (nro != nq)
+ {
+ Quad* face = h_quad[nro];
+ if (EltIsValid(face) && face->indexEdge (edge)>=0)
+ return face;
+ }
+ }
+ return NULL;
+}
+// ============================================================ getQuad
+Quad* Hexa::getQuad (int nro)
+{
+ Quad* elt = NULL;
+ if (nro >=0 && nro < HQ_MAXI && el_status == HOK && h_quad [nro]->isValid())
+ elt = h_quad [nro];
+
+ return elt;
+}
+// ============================================================ getEdge
+Edge* Hexa::getEdge (int nro)
+{
+ Edge* elt = NULL;
+ if (nro >=0 && nro < HE_MAXI && el_status == HOK && h_edge [nro]->isValid())
+ elt = h_edge [nro];
+
+ return elt;
+}
+// ============================================================ getVertex
+Vertex* Hexa::getVertex (int nro)
+{
+ Vertex* elt = NULL;
+ if (nro >=0 && nro < HV_MAXI && el_status == HOK && h_vertex [nro]->isValid())
+ elt = h_vertex [nro];
+
+ return elt;
+}
+// ============================================================ getCenter
+double* Hexa::getCenter (double centre[])
+{
+ centre [dir_x] = centre [dir_y] = centre [dir_z] = 0;
+
+ for (int nv=0 ; nv<HV_MAXI ; nv++)
+ {
+ centre [dir_x] += h_vertex[nv]->getX ();
+ centre [dir_y] += h_vertex[nv]->getY ();
+ centre [dir_z] += h_vertex[nv]->getZ ();
+ }
+
+ centre [dir_x] /= HV_MAXI;
+ centre [dir_y] /= HV_MAXI;
+ centre [dir_z] /= HV_MAXI;
+ return centre;
+}
+// =============================================================== definedBy
+bool Hexa::definedBy (Vertex* v1, Vertex* v2)
+{
+ for (int n1=0 ; n1< HV_MAXI ; n1++)
+ {
+// ( Diagonale ) Dessus
+ int n2 = (n1 + 2) MODULO HV_MAXI + HV_MAXI;
+ if ( (v1 == h_vertex[n1] && v2 == h_vertex[n2])
+ || (v1 == h_vertex[n2] && v2 == h_vertex[n1])) return true;
+ }
+ return false;
+}
+// =============================================================== definedBy
+bool Hexa::definedBy (Quad* qa, Quad* qb)
+{
+ if (qa==qb || BadElement (qa) || BadElement (qb))
+ return false;
+
+ bool p1 = false, p2 = false;
+ for (int nq=0 ; nq< HQ_MAXI ; nq++)
+ {
+ if (qa == h_quad[nq])
+ p1 = true;
+ else if (qb == h_quad[nq])
+ p2 = true;
+ }
+ return p1 && p2;
+}
+// =============================================================== setColor
+void Hexa::setColor (double val)
+{
+ for (int nc=0 ; nc< HV_MAXI ; nc++)
+ h_vertex[nc] -> setColor (val);
+}
+// ============================================================== markElements
+void Hexa::markElements (int marque)
+{
+ for (int nc=0 ; nc< HQ_MAXI ; nc++) h_quad [nc] -> setMark (marque);
+ for (int nc=0 ; nc< HE_MAXI ; nc++) h_edge [nc] -> setMark (marque);
+ for (int nc=0 ; nc< HV_MAXI ; nc++) h_vertex[nc] -> setMark (marque);
+}
+// =============================================================== duplicate
+void Hexa::duplicate ()
+{
+ h_clone = new Hexa (GetClone (h_quad [Q_A]),
+ GetClone (h_quad [Q_B]),
+ GetClone (h_quad [Q_C]),
+ GetClone (h_quad [Q_D]),
+ GetClone (h_quad [Q_E]),
+ GetClone (h_quad [Q_F]));
+}