Salome HOME
update from the MedMemory V1.0.1
[modules/med.git] / src / MEDMEM / INTERPOLATION / MEDMEM_MappingTools.hxx
1 #ifndef COORDONNEES_BARYCENTRIQUES_HPP
2 #define COORDONNEES_BARYCENTRIQUES_HPP
3
4 // DECLARATIONS
5
6 #define _TEMPL_SPE_ template <class NUAGEMAILLE, class NUAGENOEUD, class NOEUD>
7 #define _COORDBARYC_ Coordonnees_Barycentriques<NUAGEMAILLE,NUAGENOEUD,NOEUD,DIMENSION>
8 #define _COORDBARY_2D_ Coordonnees_Barycentriques<NUAGEMAILLE,NUAGENOEUD,NOEUD,2>
9 #define _COORDBARY_3D_ Coordonnees_Barycentriques<NUAGEMAILLE,NUAGENOEUD,NOEUD,3>
10
11 template <class NUAGEMAILLE, class NUAGENOEUD, class NOEUD, int DIMENSION> class Coordonnees_Barycentriques
12 {
13 // TEMPLATE GENERIQUE VIDE OBLIGE DE PASSER PAR UNE SPECIALISATION
14 };
15
16 _TEMPL_SPE_ class _COORDBARY_2D_
17 {
18 protected :
19         NUAGEMAILLE * mailles;
20         NUAGENOEUD * sommets;
21         
22         vector<int> etat_coord_baryc;
23         vector< vector< vector<double> > > coord_baryc;
24         
25 public :
26         
27         Coordonnees_Barycentriques():mailles(NULL),sommets(NULL) {}
28         Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGENOEUD *n);
29         ~Coordonnees_Barycentriques() {}
30         vector<double> Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M);
31         vector<double> Calcule_Base_Coord_Baryc(const vector<int> &simplexe_base);      
32         vector<double> Calcule_Coord_Baryc(int num_maille, const NOEUD & M);
33 };
34
35 _TEMPL_SPE_ class _COORDBARY_3D_
36 {
37 protected :
38         NUAGEMAILLE * mailles;
39         NUAGENOEUD * sommets;
40         
41         vector<int> etat_coord_baryc;
42         vector< vector< vector<double> > > coord_baryc;
43         
44 public :
45         
46         Coordonnees_Barycentriques():mailles(NULL),sommets(NULL) {}
47         Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGENOEUD *n);
48         ~Coordonnees_Barycentriques() {}
49         vector<double> Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M);
50         vector<double> Calcule_Base_Coord_Baryc(const vector<int> &simplexe_base);      
51         vector<double> Calcule_Coord_Baryc(int num_maille, const NOEUD & M);
52 };
53
54 // CODE
55
56 _TEMPL_SPE_ _COORDBARY_2D_::Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGENOEUD *n):mailles(m),sommets(n)
57                 {
58                 cout<<"Creation des Coordonnées Barycentriques : "<<flush;
59                 int nbr_mailles=mailles->SIZE();
60                 etat_coord_baryc=vector<int>(nbr_mailles,FAUX);
61                 coord_baryc=vector< vector< vector<double> > >(nbr_mailles);
62                 cout<<"OK ! "<<endl;
63                 }
64
65 _TEMPL_SPE_ vector<double> _COORDBARY_2D_::Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M)
66         {
67         int i,j,nbr_faces;
68         if (etat_coord_baryc[num_maille]==FAUX) 
69                 {
70                 nbr_faces=mailles->DONNE_NBR_FACES(num_maille);
71                 
72                 coord_baryc[num_maille]=vector< vector<double> >(nbr_faces);
73                 
74                 for (i=0;i<nbr_faces;i++)
75                         {
76                         vector<int> simplexe_base=mailles->DONNE_SIMPLEXE_BASE(num_maille,i);
77                         coord_baryc[num_maille][i]=Calcule_Base_Coord_Baryc(simplexe_base);
78                         etat_coord_baryc[num_maille]=VRAI;
79                         }
80                 }       
81         return Calcule_Coord_Baryc(num_maille,M);
82         }
83
84 _TEMPL_SPE_ vector<double> _COORDBARY_2D_::Calcule_Base_Coord_Baryc(const vector<int> &simplexe_base)
85         {
86         const vector<int> &ref=simplexe_base;
87         vector<double> retour(3);
88         int i,j;
89                 
90         double x0=(*sommets)[ref[0]][0];
91         double y0=(*sommets)[ref[0]][1];
92         double x1=(*sommets)[ref[1]][0];
93         double y1=(*sommets)[ref[1]][1];
94         double x2=(*sommets)[ref[2]][0];
95         double y2=(*sommets)[ref[2]][1];
96                 
97         double delta=(x1*y2-x2*y1)+(x2*y0-x0*y2)+(x0*y1-x1*y0);
98
99         retour[0]=(y1-y2)/delta;
100         retour[1]=(x2-x1)/delta;
101         retour[2]=(x1*y2-x2*y1)/delta;
102         
103         return retour;
104         }
105
106 _TEMPL_SPE_ vector<double> _COORDBARY_2D_::Calcule_Coord_Baryc(int num_maille, const NOEUD & M)
107         {
108         int i,j;
109         vector<double> coord_baryc_M(3,0);
110         for (i=0;i<3;i++) 
111                 {
112                 for (j=0;j<2;j++) coord_baryc_M[i]+=coord_baryc[num_maille][i][j]*M[j];
113                 coord_baryc_M[i]+=coord_baryc[num_maille][i][2];
114                 }
115         return coord_baryc_M;
116         }
117
118 _TEMPL_SPE_ _COORDBARY_3D_::Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGENOEUD *n):mailles(m),sommets(n)
119                 {
120                 cout<<"Creation des Coordonnées Barycentriques : "<<flush;
121                 int nbr_mailles=mailles->SIZE();
122                 etat_coord_baryc=vector<int>(nbr_mailles,FAUX);
123                 coord_baryc=vector< vector< vector<double> > >(nbr_mailles);
124                 cout<<"OK ! "<<endl;
125                 }
126         
127 _TEMPL_SPE_ vector<double> _COORDBARY_3D_::Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M)
128         {
129         int i,j,nbr_faces;
130         if (etat_coord_baryc[num_maille]==FAUX) 
131                 {
132                 nbr_faces=mailles->DONNE_NBR_FACES(num_maille);
133                 
134                 coord_baryc[num_maille]=vector< vector<double> >(nbr_faces);
135                 
136                 for (i=0;i<nbr_faces;i++)
137                         {
138                         vector<int> simplexe_base=mailles->DONNE_SIMPLEXE_BASE(num_maille,i);
139                         coord_baryc[num_maille][i]=Calcule_Base_Coord_Baryc(simplexe_base);
140                         etat_coord_baryc[num_maille]=VRAI;
141                         }
142                 }       
143         return Calcule_Coord_Baryc(num_maille,M);
144         }
145
146
147 _TEMPL_SPE_ vector<double> _COORDBARY_3D_::Calcule_Base_Coord_Baryc(const vector<int> &simplexe_base)
148         {
149         const vector<int> &ref=simplexe_base;
150         vector<double> retour(4);
151         int i,j;
152                 
153         double x0=(*sommets)[ref[0]][0];
154         double y0=(*sommets)[ref[0]][1];
155         double z0=(*sommets)[ref[0]][2];
156         double x1=(*sommets)[ref[1]][0];
157         double y1=(*sommets)[ref[1]][1];
158         double z1=(*sommets)[ref[1]][2];
159         double x2=(*sommets)[ref[2]][0];
160         double y2=(*sommets)[ref[2]][1];
161         double z2=(*sommets)[ref[2]][2];
162         double x3=(*sommets)[ref[3]][0];
163         double y3=(*sommets)[ref[3]][1];
164         double z3=(*sommets)[ref[3]][2];
165                 
166         double delta1=((y2-y1)*(z3-z1)-(z2-z1)*(y3-y1));
167         double delta2=((x3-x1)*(z2-z1)-(x2-x1)*(z3-z1));
168         double delta3=((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1));
169         
170         double delta=delta1*(x0-x1)+delta2*(y0-y1)+delta3*(z0-z1);
171
172         retour[0]=delta1/delta;
173         retour[1]=delta2/delta;
174         retour[2]=delta3/delta;
175         retour[3]=-(delta1*x1+delta2*y1+delta3*z1)/delta;
176         
177         return retour;
178         }
179
180 _TEMPL_SPE_ vector<double> _COORDBARY_3D_::Calcule_Coord_Baryc(int num_maille, const NOEUD & M)
181         {
182         int i,j;
183         int nbr_faces=coord_baryc[num_maille].size();
184         vector<double> coord_baryc_M(nbr_faces,0);
185         for (i=0;i<nbr_faces;i++) 
186                 {
187                 for (j=0;j<3;j++) coord_baryc_M[i]+=coord_baryc[num_maille][i][j]*M[j];
188                 coord_baryc_M[i]+=coord_baryc[num_maille][i][3];
189                 }
190         return coord_baryc_M;
191         }
192
193 //*/
194
195 #undef _TEMPLATE_SPE_ template <class NUAGEMAILLE, class NUAGENOEUD, class NOEUD, int DIMENSION>
196 #undef _COORDBARYC_2D_ Coordonnees_Barycentriques<NUAGEMAILLE,NUAGENOEUD,NOEUD,2>
197 #undef _COORDBARYC_3D_ Coordonnees_Barycentriques<NUAGEMAILLE,NUAGENOEUD,NOEUD,3>
198
199 #endif