ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/vct_arete.cpp
Revision: 79
Committed: Thu Apr 10 15:14:15 2008 UTC (17 years, 1 month ago) by souaissa
Original Path: magic/lib/geometrie/geometrie/src/vct_arete.cpp
File size: 10806 byte(s)
Log Message:

File Contents

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