ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/vct_point.cpp
Revision: 150
Committed: Tue Sep 9 18:41:41 2008 UTC (16 years, 8 months ago) by souaissa
Original Path: magic/lib/geometrie/geometrie/src/vct_point.cpp
File size: 10550 byte(s)
Log Message:
mise a jour des classes vct

File Contents

# User Rev Content
1 souaissa 66 #include "gestionversion.h"
2     //---------------------------------------------------------------------------
3    
4    
5     #pragma hdrstop
6 souaissa 85 #include<math.h>
7 souaissa 66 #include "vct_point.h"
8     #include "mg_point.h"
9     //---------------------------------------------------------------------------
10     #include <iomanip.h>
11     #pragma package(smart_init)
12    
13    
14     VCT_POINT::VCT_POINT(MG_POINT* elemgeo):VCT_ELEMENT_GEOMETRIQUE(elemgeo)
15     {
16 souaissa 69 int indx_premier_ptctr;
17    
18     TPL_LISTE_ENTITE<double> nurbs_params;
19 souaissa 66 elem_geo->get_param_NURBS(indx_premier_ptctr,nurbs_params);
20    
21 souaissa 69 OT_VECTEUR_4DD V;
22     V[0]=nurbs_params.get(indx_premier_ptctr+ 0);
23     V[1]=nurbs_params.get(indx_premier_ptctr+ 1);
24     V[2]=nurbs_params.get(indx_premier_ptctr+ 2);
25     V[3]=nurbs_params.get(indx_premier_ptctr+ 3);
26     lst_points.insert(lst_points.end(),V);
27     OT_VECTEUR_4DD VCT_NUL(0.,0.,0.,0.);
28     lst_vecteurs.insert(lst_vecteurs.end(), VCT_NUL);
29 souaissa 66
30 souaissa 69 nb_points=1;
31 souaissa 66 }
32    
33    
34 souaissa 69 VCT_POINT::VCT_POINT(VCT_POINT& mdd):VCT_ELEMENT_GEOMETRIQUE(mdd.elem_geo)
35 souaissa 66 {
36 souaissa 69 lst_vecteurs=mdd.lst_vecteurs;
37     lst_points=mdd.lst_points;
38     nb_points=mdd.nb_points ;
39 souaissa 66 }
40    
41    
42 souaissa 69 VCT_POINT::~ VCT_POINT()
43 souaissa 66 {
44    
45 souaissa 69 }
46 souaissa 66
47    
48 francois 72 std::vector<OT_VECTEUR_4DD>& VCT_POINT::get_points_controle(void)
49 souaissa 71 {
50     return lst_points;
51     }
52 souaissa 66
53 souaissa 71 std::vector<OT_VECTEUR_4DD> & VCT_POINT::get_vecteurs()
54 souaissa 69 {
55     return lst_vecteurs;
56 souaissa 66 }
57    
58    
59 souaissa 69 OT_TENSEUR VCT_POINT:: calcule_tenseur_metrique()
60 souaissa 66 {
61 souaissa 69 OT_TENSEUR tns(lst_vecteurs);
62     return tns;
63     }
64 souaissa 66
65 souaissa 150 OT_VECTEUR_4DD VCT_POINT::calcule_barycentre(OT_TENSEUR& TT)
66 souaissa 69 {
67 souaissa 150 T=TT;
68 souaissa 69 OT_VECTEUR_4DD barycentre(0,0,0,0);
69    
70 souaissa 66 for(int i=0;i<nb_points;i++)
71     {
72 souaissa 150 OT_VECTEUR_4DD pt=get_nouveau_pt(T,lst_points[i]);
73     barycentre+=pt;
74 souaissa 66 }
75    
76 souaissa 69 barycentre*=1./nb_points;
77     return barycentre;
78 souaissa 66 }
79    
80    
81 souaissa 69
82     int VCT_POINT::get_nb_points()
83     {
84     return nb_points ;
85     }
86    
87    
88 souaissa 150 OT_TENSEUR VCT_POINT::calcule_covariance(OT_TENSEUR& T)
89 souaissa 66 {
90 souaissa 71 OT_TENSEUR COVARIANCE(4);
91 souaissa 66
92 souaissa 150 OT_VECTEUR_4DD barycentre=calcule_barycentre(T);
93 souaissa 66
94    
95 souaissa 85 OT_TENSEUR PT_CENTRE(nb_points,4),PT_CENTRE_TRANSPOSE;
96 souaissa 66
97 souaissa 85 for( int i=0;i<nb_points;i++)
98     {
99 souaissa 150 OT_VECTEUR_4DD pt=get_nouveau_pt(T,lst_points[i]);
100     OT_VECTEUR_4DD ptcent=pt-barycentre;
101 souaissa 85 PT_CENTRE(i,0)= ptcent[0];
102     PT_CENTRE(i,1)= ptcent[1];
103     PT_CENTRE(i,2)= ptcent[2];
104     PT_CENTRE(i,3)= ptcent[3];
105     }
106     PT_CENTRE_TRANSPOSE =PT_CENTRE.transpose();
107    
108     COVARIANCE=PT_CENTRE_TRANSPOSE*PT_CENTRE;
109     double2 COEF= 1./nb_points;
110     COVARIANCE=COVARIANCE*COEF;
111    
112     for(int i=0;i<4;i++)
113     for(int j=0;j<4;j++)
114     {
115     if(fabs(COVARIANCE(i,j).get_x())<=1e-8)
116     COVARIANCE(i,j).set_x(0.);
117    
118     }
119     return COVARIANCE;
120 souaissa 69 }
121    
122    
123 souaissa 150 void VCT_POINT::calcule_axes_dinertie(OT_TENSEUR& T,OT_VECTEUR_4DD& D,OT_TENSEUR& V)
124 souaissa 69 {
125     int n=4;
126     int nrot;
127    
128 souaissa 150 OT_TENSEUR COV=calcule_covariance(T);
129 souaissa 71
130    
131 souaissa 69 double2 zro=0.0;
132    
133 souaissa 71 if(COV(0,0)==zro&&COV(1,0)==zro&&COV(2,0)==zro&&COV(3,0)==zro)
134 souaissa 69 {
135 souaissa 71 COV(0,0)=1.0;
136     COV(1,0)=zro;
137     COV(2,0)=zro;
138     COV(3,0)=zro;
139 souaissa 69 }
140 souaissa 71 if(COV(0,1)==zro&&COV(1,1)==zro&&COV(2,1)==zro&&COV(3,1)==zro)
141 souaissa 69 {
142 souaissa 71 COV(0,1)=zro;
143     COV(1,1)=1.0;
144     COV(2,1)=zro;
145     COV(3,1)=zro;
146 souaissa 69 }
147 souaissa 71 if(COV(0,2)==zro&&COV(1,2)==zro&&COV(2,2)==zro&&COV(3,2)==zro)
148 souaissa 69 {
149 souaissa 71 COV(0,2)=zro;
150     COV(1,2)=zro;
151     COV(2,2)=1.0;
152     COV(3,2)=zro;
153 souaissa 69 }
154 souaissa 71 if(COV(0,3)==zro&&COV(1,3)==zro&&COV(2,3)==zro&&COV(3,3)==zro)
155 souaissa 69 {
156 souaissa 71 COV(0,3)=zro;
157     COV(1,3)=zro;
158     COV(2,3)=zro;
159     COV(3,3)=1.0;
160 souaissa 69 }
161    
162    
163 souaissa 71 COV.get_orthogonalisation(COV,D,V,n,nrot);
164 souaissa 69
165     }
166    
167    
168 souaissa 150 OT_TENSEUR VCT_POINT:: calcule_tenseur_inertie_au_barycentre(OT_TENSEUR& T) //repere globale
169 souaissa 85 {
170     OT_TENSEUR INERTIE(4);
171 souaissa 150 OT_TENSEUR cov=calcule_covariance(T);
172 souaissa 85 double2 nb_pts=nb_points;
173     double2 MOINS_UN=-1.0;
174     INERTIE=cov*MOINS_UN;
175     INERTIE=INERTIE*nb_pts;
176    
177     INERTIE(0,0)=(cov(1,1)+cov(2,2)+cov(3,3))*nb_pts;
178     INERTIE(1,1)=(cov(0,0)+cov(2,2)+cov(3,3))*nb_pts;
179     INERTIE(2,2)=(cov(1,1)+cov(0,0)+cov(3,3))*nb_pts;
180     INERTIE(3,3)=(cov(1,1)+cov(2,2)+cov(0,0))*nb_pts;
181     for(int i=0;i<4;i++)
182     for(int j=0;j<4;j++)
183     {
184     if(fabs(INERTIE(i,j).get_x())<=1e-12) INERTIE(i,j).set_x(0.);
185    
186     }
187     return INERTIE;
188     }
189    
190    
191 souaissa 150 OT_TENSEUR VCT_POINT:: calcule_tenseur_inertie_au_pt(OT_TENSEUR& T,OT_VECTEUR_4DD& POINT)
192 souaissa 69 {
193    
194 souaissa 150 OT_VECTEUR_4DD BARYCENTRE=calcule_barycentre(T);
195     OT_TENSEUR TENS=calcule_tenseur_inertie_au_barycentre(T);
196 souaissa 69
197     OT_VECTEUR_4DD ABC=POINT-BARYCENTRE;
198    
199     double2 a=ABC[0] ;
200     double2 b=ABC[1] ;
201     double2 c=ABC[2] ;
202     double2 d=ABC[3] ;
203    
204     TENS(0,0)=TENS(0,0)+b*b+c*c+d*d;
205     TENS(1,1)=TENS(1,1)+a*a+c*c+d*d;
206     TENS(2,2)=TENS(2,2)+a*a+b*b+d*d;
207 souaissa 71 TENS(3,3)=TENS(3,3)+a*a+b*b+c*c;
208 souaissa 69
209     TENS(0,1)=TENS(0,1)-nb_points*a*b;
210     TENS(0,2)=TENS(0,2)-nb_points*a*c;
211     TENS(0,3)=TENS(0,3)-nb_points*a*d;
212    
213     TENS(1,0)=TENS(1,0)-nb_points*b*a;
214     TENS(1,2)=TENS(1,2)-nb_points*b*c;
215     TENS(1,3)=TENS(1,3)-nb_points*b*d;
216    
217     TENS(2,0)=TENS(2,0)-nb_points*c*a;
218     TENS(2,1)=TENS(2,1)-nb_points*c*b;
219     TENS(2,3)=TENS(2,3)-nb_points*c*d;
220    
221     TENS(3,0)=TENS(3,0)-nb_points*d*a;
222     TENS(3,1)=TENS(3,1)-nb_points*d*b;
223     TENS(3,2)=TENS(3,2)-nb_points*d*c;
224    
225     return TENS;
226     }
227    
228    
229 souaissa 150 OT_TENSEUR VCT_POINT::calcule_tenseur_inertie_base_locale(OT_TENSEUR& T)
230 souaissa 69 {
231 souaissa 71
232 souaissa 69 OT_VECTEUR_4DD v1,v2,v3,v4;
233     OT_TENSEUR INERTIE;
234     OT_TENSEUR I_GLOBALE;
235 souaissa 71 OT_VECTEUR_4DD D;
236     OT_TENSEUR V(4);
237 souaissa 150 this->calcule_axes_dinertie(T,D,V);
238     INERTIE=this->calcule_tenseur_inertie_au_barycentre(T);
239 souaissa 69
240     I_GLOBALE= INERTIE;
241    
242     OT_TENSEUR P(4);
243     OT_TENSEUR I=I_GLOBALE;
244     OT_TENSEUR P_TRSPOSE;
245     OT_TENSEUR I_LOCALE;
246 souaissa 71 P=V;
247 souaissa 69 P_TRSPOSE=P.transpose();
248    
249     I_LOCALE=P_TRSPOSE*I;
250     I_LOCALE=I_LOCALE*P;
251 souaissa 85 for(int i=0;i<4;i++)
252     for(int j=0;j<4;j++)
253     {
254     if(fabs(I_LOCALE(i,j).get_x())<=1e-12) I_LOCALE(i,j).set_x(0.);
255     }
256 souaissa 71 return I_LOCALE;
257    
258 souaissa 66 }
259    
260    
261    
262    
263 souaissa 150 OT_TENSEUR VCT_POINT::calcule_tenseur_inertie_base_entite(OT_TENSEUR& T,VCT& vct_f)
264 souaissa 69 {
265 souaissa 71 OT_VECTEUR_4DD Dv,Dw,G1,G2,G1G2;
266 souaissa 69 OT_TENSEUR P(4);
267     OT_TENSEUR pt;
268     OT_TENSEUR IV;
269 souaissa 71 OT_TENSEUR Q(4);
270 souaissa 69 OT_TENSEUR qt;
271     OT_TENSEUR R;
272     OT_TENSEUR Rt;
273     OT_TENSEUR IW;
274 souaissa 71 OT_TENSEUR MASSE_CONCENTRE(4);
275     OT_TENSEUR V(4),W(4);
276 souaissa 150 this->calcule_axes_dinertie(T,Dv,V);
277     vct_f.calcule_axes_dinertie(T,Dw,W);
278 souaissa 69
279 souaissa 71 P=V;
280     Q=W;
281 souaissa 69
282 souaissa 150 IW=vct_f.calcule_tenseur_inertie_base_locale(T);
283 souaissa 69
284     pt=P.transpose();
285     qt=Q.transpose();
286     R=pt*Q;
287     Rt=qt*P;
288     IV=R*IW;
289     IV=IV*Rt;
290    
291    
292 souaissa 150 G1=this->calcule_barycentre(T);
293     G2=vct_f.calcule_barycentre(T);
294 souaissa 69
295     G1G2=G2-G1;
296    
297     OT_VECTEUR_4DD G1G2_LOC; //Calcul du vecteur G1G2 dans la base locale;
298     for(int i=0;i<4;i++)
299     {
300     for(int j=0;j<4;j++)
301     {
302     G1G2_LOC[i]= G1G2_LOC[i]+pt(i,j)*G1G2[j];
303     }
304     }
305    
306     MASSE_CONCENTRE(0,0)=nb_points*(G1G2_LOC[1]*G1G2_LOC[1]+G1G2_LOC[2]*G1G2_LOC[2]+G1G2_LOC[3]*G1G2_LOC[3]);
307     MASSE_CONCENTRE(0,1)=-1*nb_points*(G1G2_LOC[0]*G1G2_LOC[1]);
308     MASSE_CONCENTRE(0,2)=-1*nb_points*(G1G2_LOC[0]*G1G2_LOC[2]);
309     MASSE_CONCENTRE(0,3)=-1*nb_points*(G1G2_LOC[0]*G1G2_LOC[3]);
310    
311     MASSE_CONCENTRE(1,0)=-1*nb_points*(G1G2_LOC[1]*G1G2_LOC[0]);
312     MASSE_CONCENTRE(1,1)= nb_points*(G1G2_LOC[0]*G1G2_LOC[0]+G1G2_LOC[2]*G1G2_LOC[2]+G1G2_LOC[3]*G1G2_LOC[3]);
313     MASSE_CONCENTRE(1,2)=-1*nb_points*(G1G2_LOC[1]*G1G2_LOC[2]);
314     MASSE_CONCENTRE(1,3)=-1*nb_points*(G1G2_LOC[1]*G1G2_LOC[3]);
315    
316     MASSE_CONCENTRE(2,0)=-1*nb_points*(G1G2_LOC[2]*G1G2_LOC[0]);
317     MASSE_CONCENTRE(2,1)=-1*nb_points*(G1G2_LOC[2]*G1G2_LOC[1]);
318     MASSE_CONCENTRE(2,2)=nb_points*(G1G2_LOC[0]*G1G2_LOC[0]+G1G2_LOC[1]*G1G2_LOC[1]+G1G2_LOC[3]*G1G2_LOC[3]);
319 souaissa 79 MASSE_CONCENTRE(2,3)=-1*nb_points*(G1G2_LOC[3]*G1G2_LOC[2]);
320 souaissa 69
321     MASSE_CONCENTRE(3,0)=-1*nb_points*(G1G2_LOC[0]*G1G2_LOC[3]);
322     MASSE_CONCENTRE(3,1)=-1*nb_points*(G1G2_LOC[1]*G1G2_LOC[3]);
323     MASSE_CONCENTRE(3,2)=-1*nb_points*(G1G2_LOC[2]*G1G2_LOC[3]);
324     MASSE_CONCENTRE(3,3)=nb_points*(G1G2_LOC[0]*G1G2_LOC[0]+G1G2_LOC[1]*G1G2_LOC[1]+G1G2_LOC[2]*G1G2_LOC[2]);
325    
326     IV=IV+MASSE_CONCENTRE;
327 souaissa 85
328    
329 souaissa 79 return IV;
330 souaissa 85
331 souaissa 69 }
332    
333 souaissa 150 OT_VECTEUR_4DD VCT_POINT::get_nouveau_pt(OT_TENSEUR& T,OT_VECTEUR_4DD& v)
334     {
335     OT_VECTEUR_4DD temp;
336 souaissa 69
337 souaissa 150 for( int i=0;i<4;i++)
338     { temp[i]=0.;
339     for(int j=0;j<4;j++)
340     temp[i]= temp[i]+T(i,j)*v[j];
341     }
342     return temp;
343    
344     }
345    
346    
347 souaissa 71 ostream& operator <<(ostream& os, VCT_POINT& vct_f)
348     {
349    
350     vct_f.enregistrer(os) ;
351     return os;
352 souaissa 69 }
353 souaissa 66
354 souaissa 71 //==========================================================================
355     //Visualisation
356     //==========================================================================
357    
358    
359    
360    
361     void VCT_POINT::enregistrer(std::ostream& ost)
362     {
363    
364     ost<<"========================================"<<endl;
365     ost<<"% FACE: "<<endl;
366     ost<<"========================================"<<endl;
367     ost<<"POINTS_DE_CONTROLS: "<<endl;
368     ost<<"========================================"<<endl;
369    
370     for (unsigned int i=0;i< lst_points.size();i++)
371     {
372     OT_VECTEUR_4DD v= lst_points[i]; // Rmq: la precision nèest pas affocher, il faut rajouter l'affichage
373     ost<< v<<endl; // de la precision dans la classe doubleprecision
374     }
375    
376     ost<<endl;
377     ost<<"VECTORISATION: "<<endl;
378     ost<<"========================================"<<endl;
379     for (unsigned int i=0;i< lst_vecteurs.size();i++)
380     {
381     OT_VECTEUR_4DD v= lst_vecteurs[i];
382     ost<< v<<endl;
383     }
384    
385     ost<<endl<<endl;
386     ost<<"BARYCENTRE: "<<endl;
387     ost<<"========================================"<<endl;
388 souaissa 150 OT_VECTEUR_4DD BARY= calcule_barycentre(T);
389 souaissa 71 ost<<BARY<<endl;
390     ost<<endl<<endl;
391     ost<<"TENSEUR_METRIQUE: "<<endl;
392     ost<<"========================================"<<endl;
393     OT_TENSEUR TNS_MT= calcule_tenseur_metrique() ;
394     ost<< TNS_MT<<endl;
395     ost<<endl<<endl;
396     ost<<"TENSEUR_DE_COVARIANCE: "<<endl;
397     ost<<"========================================"<<endl;
398 souaissa 150 OT_TENSEUR TNS_CV= calcule_covariance(T);
399 souaissa 71 ost<< TNS_CV<<endl;
400     ost<<endl<<endl;
401     ost<<"AXES_D'INERTIE: "<<endl;
402     ost<<"========================================"<<endl;
403     OT_VECTEUR_4DD D;
404     OT_TENSEUR V(4);
405 souaissa 150 calcule_axes_dinertie(T,D,V);
406 souaissa 71 ost<< V<<endl;
407     ost<<endl<<endl;
408     ost<<"INERTIE_CALCULÉE_AU_BARYCENTRE: "<<endl;
409     ost<<"========================================"<<endl;
410 souaissa 150 OT_TENSEUR I_BARY=calcule_tenseur_inertie_au_barycentre(T);
411 souaissa 71 ost<<I_BARY<<endl;
412    
413     ost<<endl<<endl;
414     ost<<"INERTIE_TRANSPORTÉE_EN_UN_POINT: "<<endl;
415     ost<<"========================================"<<endl;
416 souaissa 150 OT_TENSEUR I_TRANSP=calcule_tenseur_inertie_au_pt(T,BARY);
417 souaissa 71 ost<<I_TRANSP<<endl;
418     ost<<endl<<endl;
419    
420     ost<<"INERTIE_CALCULÉ_DANS_LA_BASE_LOCALE: "<<endl;
421     ost<<"========================================"<<endl;
422 souaissa 150 OT_TENSEUR I_BASE=calcule_tenseur_inertie_base_locale(T);
423 souaissa 71 ost<<I_BASE<<endl;
424     ost<<endl<<endl;
425    
426    
427     // void calcule_tenseur_inertie_base_entite(OT_VECTEUR_4DD& G1G2, OT_TENSEUR& tens,VCT& vct_f) ;
428    
429     }