ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/vct_sommet.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_sommet.cpp
File size: 8872 byte(s)
Log Message:

File Contents

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