Salome HOME
This commit was generated by cvs2git to track changes on a CVS vendor
[modules/smesh.git] / src / SMDS / SMDS_MeshTetrahedron.cxx
1 using namespace std;
2 // File:        SMDS_MeshTetrahedron.cxx
3 // Created:     Wed Jan 23 17:02:34 2002
4 // Author:      Jean-Michel BOULCOURT
5 //              <jmb@coulox.paris1.matra-dtv.fr>
6
7
8 #include "SMDS_MeshTetrahedron.ixx"
9 #include "Standard_ConstructionError.hxx"
10
11 //=======================================================================
12 //function : SMDS_MeshTetrahedron
13 //purpose  : Tetrahedra
14 //=======================================================================
15
16 SMDS_MeshTetrahedron::SMDS_MeshTetrahedron(const Standard_Integer ID,
17                                            const Standard_Integer idnode1, 
18                                            const Standard_Integer idnode2, 
19                                            const Standard_Integer idnode3,
20                                            const Standard_Integer idnode4):SMDS_MeshVolume(ID,4)
21 {
22   SetConnections(idnode1,idnode2,idnode3,idnode4);
23   ComputeKey();
24 }
25
26
27 //=======================================================================
28 //function : SetConnections
29 //purpose  : Tetrahedra
30 //=======================================================================
31 void SMDS_MeshTetrahedron::SetConnections(const Standard_Integer idnode1, 
32                                           const Standard_Integer idnode2,
33                                           const Standard_Integer idnode3,
34                                           const Standard_Integer idnode4)
35 {
36   Standard_Integer idmin = (idnode1 < idnode2 ? idnode1 : idnode2);
37   idmin = (idmin < idnode3 ? idmin : idnode3);
38   idmin = (idmin < idnode4 ? idmin : idnode4);
39
40   myNodes[0] = idmin;
41   if (idmin == idnode1) {
42     myNodes[1] = idnode2;
43     myNodes[2] = idnode3;
44     myNodes[3] = idnode4;
45   } else if (idmin == idnode2) {
46     myNodes[1] = idnode3;
47     myNodes[2] = idnode4;
48     myNodes[3] = idnode1;
49   } else if (idmin == idnode3) {
50     myNodes[1] = idnode4;
51     myNodes[2] = idnode1;
52     myNodes[3] = idnode2;
53   } else {
54     myNodes[1] = idnode1;
55     myNodes[2] = idnode2;
56     myNodes[3] = idnode3;
57   }
58
59 }
60
61
62 //=======================================================================
63 //function : NodesOfFace
64 //purpose  : returns the rank node in mynodes. Useful to extract faces from volume
65 //=======================================================================
66 Standard_Integer SMDS_MeshTetrahedron::NodesOfFace(const Standard_Integer rankface, 
67                                                    const Standard_Integer ranknode)
68 {
69   static Standard_Integer facenode[4][3] = {
70     {0,1,2},
71     {0,3,1},
72     {1,3,2},
73     {0,2,3}
74   };
75
76   return facenode[rankface-1][ranknode-1];
77 }
78
79
80 //=======================================================================
81 //function : NodesOfEdge
82 //purpose  : returns the rank node in mynodes. Useful to extract edges from volume
83 //=======================================================================
84 Standard_Integer SMDS_MeshTetrahedron::NodesOfEdge(const Standard_Integer rankedge, 
85                                                    const Standard_Integer ranknode) const
86 {
87   static Standard_Integer faceedge[6][2] = {
88     {0,1},
89     {1,2},
90     {0,2},
91     {0,3},
92     {1,3},
93     {2,3}
94   };
95
96   return faceedge[rankedge-1][ranknode-1];
97 }
98
99
100 //=======================================================================
101 //function : GetFaceDefinedByNodes
102 //purpose  : 
103 //=======================================================================
104 void SMDS_MeshTetrahedron::GetFaceDefinedByNodes(const Standard_Integer rank, 
105                                                  const Standard_Address idnode,
106                                                  Standard_Integer& nb) const
107 {
108   Standard_Integer *ptr;
109   nb = 3;
110   ptr = (Standard_Integer *)idnode;
111   ptr[0] = myNodes[NodesOfFace(rank,1)];
112   ptr[1] = myNodes[NodesOfFace(rank,2)];
113   ptr[2] = myNodes[NodesOfFace(rank,3)];
114
115 }
116
117 //=======================================================================
118 //function : GetEdgeDefinedByNodes
119 //purpose  : 
120 //=======================================================================
121 void SMDS_MeshTetrahedron::GetEdgeDefinedByNodes(const Standard_Integer rank, 
122                                             Standard_Integer& idnode1,
123                                             Standard_Integer& idnode2) const
124 {
125   idnode1 = myNodes[NodesOfEdge(rank,1)];
126   idnode2 = myNodes[NodesOfEdge(rank,2)];
127 }
128