ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/vct_surface.cpp
Revision: 66
Committed: Wed Mar 19 16:45:26 2008 UTC (17 years, 1 month ago) by souaissa
Original Path: magic/lib/geometrie/geometrie/src/vct_surface.cpp
File size: 7677 byte(s)
Log Message:
reorganisation des classes de vectorisation. Situation normalement final pour le doc de khaled

File Contents

# User Rev Content
1 souaissa 66 #include "gestionversion.h"
2    
3     //---------------------------------------------------------------------------
4    
5    
6     #pragma hdrstop
7    
8     #include "vct_surface.h"
9     #include "mg_surface.h"
10     #include <iomanip.h>
11     //---------------------------------------------------------------------------
12    
13     #pragma package(smart_init)
14    
15    
16     VCT_SURFACE::VCT_SURFACE(MG_SURFACE* elemgeo):VCT_ELEMENT_GEOMETRIQUE(elemgeo)
17     {
18     elem_geo->get_param_NURBS(indx_premier_ptctr,nurbs_params);
19     nb_points=1/4.*(nurbs_params.get_nb()-indx_premier_ptctr);
20     nb_u=nurbs_params.get(3);
21     nb_v=nurbs_params.get(4);
22     }
23    
24    
25     VCT_SURFACE::VCT_SURFACE(VCT_SURFACE& mdd):VCT_ELEMENT_GEOMETRIQUE(mdd.elem_geo)
26     {
27     mdd.elem_geo->get_param_NURBS(indx_premier_ptctr,nurbs_params);
28     nb_points=1/4.*(nurbs_params.get_nb()-indx_premier_ptctr);
29     nb_u=nurbs_params.get(3);
30     nb_v=nurbs_params.get(4);
31     }
32    
33    
34     VCT_SURFACE::~VCT_SURFACE()
35     {
36     }
37    
38     void VCT_SURFACE::get_vectorisation(vector<double2>& vct_lst)
39     {
40    
41     double2 ZERO=0.;
42    
43     //TPL_LISTE_ENTITE<double> paramm_surf;
44    
45    
46     double2 X1,Y1,Z1,w1,X2,Y2,Z2,w2,vx,vy,vz,w;
47     /*
48     for(int i=indx_premier_ptctr;i<nurbs_params.get_nb();i++)
49     {
50     double vale=nurbs_params.get(i);
51     paramm_surf.ajouter(vale);
52     }
53     */
54    
55     //nb_v: correspond au vecteurs attachés aux points de controles selon v
56     //nb_u: correspond au vecteurs attachés aux points de controles selon u
57    
58     /* _____________^______________
59     _| nb_u |
60     | ... ... ... ... ... ...
61     nb_v < ... ... ... ... ... ...
62     |_ ... ... ... ... ... ...
63     */
64    
65    
66     for(int r=0;r<nb_v;r++)
67     {
68     for(int s=0;s<nb_u-1;s++)
69     {
70     X1=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * s);
71     Y1=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * s + 1);
72     Z1=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * s + 2);
73     w1=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * s + 3);
74    
75     X2=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * (s + 1));
76     Y2=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * (s + 1) + 1);
77     Z2=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * (s + 1) + 2);
78     w2=nurbs_params.get( indx_premier_ptctr+ r *4 * nb_u + 4 * (s + 1) + 3);
79    
80     vx=X2-X1;
81     vy=Y2-Y1;
82     vz=Z2-Z1;
83     w=w2-w1;
84    
85     double2 norm_au_carre=vx*vx+vy*vy+vz*vz+w*w;
86     double2 norm=norm_au_carre^0.5;
87     /*
88     if(norm==ZERO)
89     {
90     vct_lst.insert(vct_lst.end(),0.);
91     vct_lst.insert(vct_lst.end(),0.);
92     vct_lst.insert(vct_lst.end(),0.);
93     vct_lst.insert(vct_lst.end(),0.);
94     } */
95     if(norm!=ZERO){
96     vct_lst.insert(vct_lst.end(),vx/norm);
97     vct_lst.insert(vct_lst.end(),vy/norm);
98     vct_lst.insert(vct_lst.end(),vz/norm);
99     vct_lst.insert(vct_lst.end(),w/norm);
100     }
101    
102     }
103     }
104    
105     for(int r=0;r<nb_v-1;r++)
106     {
107     for(int s=0;s<nb_u;s++)
108     {
109     X1=nurbs_params.get(indx_premier_ptctr+ r * 4 * nb_u + 4 * s);
110     Y1=nurbs_params.get(indx_premier_ptctr+ r * 4 * nb_u + 4 * s + 1);
111     Z1=nurbs_params.get(indx_premier_ptctr+ r * 4 * nb_u + 4 * s + 2);
112     w1=nurbs_params.get(indx_premier_ptctr+ r * 4 * nb_u + 4 * s + 3);
113    
114     X2=nurbs_params.get(indx_premier_ptctr+ (r+1) *4 * nb_u + 4 * s);
115     Y2=nurbs_params.get(indx_premier_ptctr+ (r+1) *4 * nb_u + 4 * s + 1);
116     Z2=nurbs_params.get(indx_premier_ptctr+ (r+1) *4 * nb_u + 4 * s + 2);
117     w2=nurbs_params.get(indx_premier_ptctr+ (r+1) *4 * nb_u + 4 * s + 3);
118    
119     vx=X2-X1;
120     vy=Y2-Y1;
121     vz=Z2-Z1;
122     w=w2-w1;
123    
124     double2 norm_au_carre=vx*vx+vy*vy+vz*vz;
125     double2 norm=norm_au_carre^0.5;
126    
127     if(norm==ZERO)
128     {
129     vct_lst.insert(vct_lst.end(),0.);
130     vct_lst.insert(vct_lst.end(),0.);
131     vct_lst.insert(vct_lst.end(),0.);
132     vct_lst.insert(vct_lst.end(),0.);
133     }
134     else{
135     vx=vx/norm;
136     vy=vy/norm;
137     vz=vz/norm;
138     w=w/norm;
139     double2 eps=1e-6;
140     if(fabs(vx)<eps) vx=0;
141     if(fabs(vy)<eps) vy=0;
142     if(fabs(vz)<eps) vz=0;
143     if(fabs(w)<eps) w=0;
144     vct_lst.insert(vct_lst.end(),vx);
145     vct_lst.insert(vct_lst.end(),vy);
146     vct_lst.insert(vct_lst.end(),vz);
147     vct_lst.insert(vct_lst.end(),w);
148     }
149     }
150     }
151    
152    
153    
154     }
155    
156    
157    
158     void VCT_SURFACE::get_geo_barycentre(double2* xyz)
159     {
160     xyz[0]=0.;
161     xyz[1]=0.;
162     xyz[2]=0.;
163     xyz[3]=0.;
164    
165    
166     for(int i=0;i<nb_points;i++)
167     {
168     xyz[0]=xyz[0]+nurbs_params.get(4*i+indx_premier_ptctr);
169     xyz[1]=xyz[1]+nurbs_params.get(4*i+indx_premier_ptctr+1);
170     xyz[2]=xyz[2]+nurbs_params.get(4*i+indx_premier_ptctr+2);
171     xyz[3]=xyz[3]+nurbs_params.get(4*i+indx_premier_ptctr+3);
172     }
173    
174     xyz[0]=1./nb_points*xyz[0];
175     xyz[1]=1./nb_points*xyz[1];
176     xyz[2]=1./nb_points*xyz[2];
177     xyz[3]=1./nb_points*xyz[3];
178     }
179    
180    
181    
182     double2 VCT_SURFACE::get_inertie_au_centre_de_masse()
183     {
184     double2 xyz_g[4];
185     double2 xyzi[4];
186     this->get_geo_barycentre(xyz_g);
187    
188     xyzi[0]=0.;
189     xyzi[1]=0.;
190     xyzi[2]=0.;
191     xyzi[3]=0.;
192    
193     double2 moment_inertie=0.;
194     for(int i=0;i<nb_points;i++)
195     {
196     xyzi[0]=xyz_g[0]-nurbs_params.get(4*i+indx_premier_ptctr);
197     xyzi[1]=xyz_g[1]-nurbs_params.get(4*i+indx_premier_ptctr+1);
198     xyzi[2]=xyz_g[2]-nurbs_params.get(4*i+indx_premier_ptctr+2);
199     xyzi[3]=xyz_g[3]-nurbs_params.get(4*i+indx_premier_ptctr+3);
200     moment_inertie=moment_inertie+xyzi[0]*xyzi[0]+xyzi[1]*xyzi[1]+xyzi[2]*xyzi[2]+xyzi[3]*xyzi[3];
201     }
202     return moment_inertie;
203     }
204    
205     int VCT_SURFACE::get_nb_points()
206     {
207     return nb_points;
208     }
209    
210     /*
211     void VCT_SURFACE::enregistrer(std::ostream& o)
212     {
213    
214     /*
215     o<<setfill('=')<<setw(99)<<'='<<endl;
216     o<<"%%=NB_PTS_CTR_SURF,"<< endl;
217     o<<setfill('=')<<setw(99)<<'='<<endl;
218     o<<nb_points<<endl; /
219     o<<setfill('=')<<setw(99)<<'='<<endl;
220     o<<"%%=PTS_CTL_SURFACE,"<< endl;
221     o<<setfill('=')<<setw(99)<<'='<<endl;
222     int compt=0;
223     for(int i=indx_premier_ptctr;i<nurbs_params.get_nb();i++)
224     {
225     o<<setfill(' ')<<setw(15)<<nurbs_params.get(i);
226     compt++;
227     if(compt==4) {
228     o<<endl;
229     compt=0;}
230     }
231     o<<setfill('=')<<setw(99)<<'='<<endl; /*
232     vector<double2> vect_geo;
233     get_vectorisation(vect_geo);
234     o<<"VECTORISATION_SURFACE,"<< endl;
235     o<<setfill('=')<<setw(99)<<'='<<endl;
236     compt=0;
237     for(unsigned int i=0;i<vect_geo.size();i++)
238     {
239     o<<setfill(' ')<<setw(15)<<vect_geo[i];
240     compt++;
241     if(compt==4){
242     o<<endl;
243     compt=0;}
244     } /
245    
246     double2 cmasse[4] ;
247     o<<setfill('=')<<setw(99)<<'='<<endl;
248     get_geo_barycentre(cmasse) ;
249     o<<"(*)=CENTRE DE MASSE SURF: "<<endl;
250     o<<setfill('=')<<setw(99)<<'='<<endl;
251     for(unsigned int i=0;i<4;i++)
252     {
253     o<<setfill(' ')<<setw(15)<<cmasse[i]<<endl;
254     }
255    
256     } */
257    
258    
259     void VCT_SURFACE::enregistrer(std::ostream& o)
260     {
261     o<<"UV_SURFACE "<< nb_u<<","<<nb_v<<endl;
262     o<<"SURFACE__: ";
263     int compt=0;
264     for(int i=indx_premier_ptctr;i<nurbs_params.get_nb();i++)
265     {
266    
267     // if(compt!=3)
268     // {
269     o<<setprecision(9)<<nurbs_params.get(i)<<" ; ";
270     compt++ ;
271     // }
272     // else
273     // compt=0;
274    
275     }
276     o<<endl;
277    
278     }
279