1 #ifndef COORDONNEES_BARYCENTRIQUES_HPP
2 #define COORDONNEES_BARYCENTRIQUES_HPP
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>
11 template <class NUAGEMAILLE, class NUAGENOEUD, class NOEUD, int DIMENSION> class Coordonnees_Barycentriques
13 // TEMPLATE GENERIQUE VIDE OBLIGE DE PASSER PAR UNE SPECIALISATION
16 _TEMPL_SPE_ class _COORDBARY_2D_
19 NUAGEMAILLE * mailles;
22 vector<int> etat_coord_baryc;
23 vector< vector< vector<double> > > coord_baryc;
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);
35 _TEMPL_SPE_ class _COORDBARY_3D_
38 NUAGEMAILLE * mailles;
41 vector<int> etat_coord_baryc;
42 vector< vector< vector<double> > > coord_baryc;
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);
56 _TEMPL_SPE_ _COORDBARY_2D_::Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGENOEUD *n):mailles(m),sommets(n)
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);
65 _TEMPL_SPE_ vector<double> _COORDBARY_2D_::Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M)
68 if (etat_coord_baryc[num_maille]==FAUX)
70 nbr_faces=mailles->DONNE_NBR_FACES(num_maille);
72 coord_baryc[num_maille]=vector< vector<double> >(nbr_faces);
74 for (i=0;i<nbr_faces;i++)
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;
81 return Calcule_Coord_Baryc(num_maille,M);
84 _TEMPL_SPE_ vector<double> _COORDBARY_2D_::Calcule_Base_Coord_Baryc(const vector<int> &simplexe_base)
86 const vector<int> &ref=simplexe_base;
87 vector<double> retour(3);
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];
97 double delta=(x1*y2-x2*y1)+(x2*y0-x0*y2)+(x0*y1-x1*y0);
99 retour[0]=(y1-y2)/delta;
100 retour[1]=(x2-x1)/delta;
101 retour[2]=(x1*y2-x2*y1)/delta;
106 _TEMPL_SPE_ vector<double> _COORDBARY_2D_::Calcule_Coord_Baryc(int num_maille, const NOEUD & M)
109 vector<double> coord_baryc_M(3,0);
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];
115 return coord_baryc_M;
118 _TEMPL_SPE_ _COORDBARY_3D_::Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGENOEUD *n):mailles(m),sommets(n)
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);
127 _TEMPL_SPE_ vector<double> _COORDBARY_3D_::Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M)
130 if (etat_coord_baryc[num_maille]==FAUX)
132 nbr_faces=mailles->DONNE_NBR_FACES(num_maille);
134 coord_baryc[num_maille]=vector< vector<double> >(nbr_faces);
136 for (i=0;i<nbr_faces;i++)
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;
143 return Calcule_Coord_Baryc(num_maille,M);
147 _TEMPL_SPE_ vector<double> _COORDBARY_3D_::Calcule_Base_Coord_Baryc(const vector<int> &simplexe_base)
149 const vector<int> &ref=simplexe_base;
150 vector<double> retour(4);
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];
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));
170 double delta=delta1*(x0-x1)+delta2*(y0-y1)+delta3*(z0-z1);
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;
180 _TEMPL_SPE_ vector<double> _COORDBARY_3D_::Calcule_Coord_Baryc(int num_maille, const NOEUD & M)
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++)
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];
190 return coord_baryc_M;
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>