ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/step/src/sttoroidal.cpp
Revision: 283
Committed: Tue Sep 13 21:11:20 2011 UTC (13 years, 8 months ago) by francois
File size: 12118 byte(s)
Log Message:
structure de l'écriture

File Contents

# User Rev Content
1 foucault 27 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4 francois 283 // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6 foucault 27 //------------------------------------------------------------
7 francois 283 // Le projet MAGIC est un projet de recherche du d�partement
8     // de g�nie m�canique de l'Universit� du Qu�bec �
9     // Trois Rivi�res
10     // Les librairies ne peuvent �tre utilis�es sans l'accord
11 foucault 27 // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // sttoroidal.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20 francois 283 // Version du 02/03/2006 � 11H24
21 foucault 27 //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26    
27     #include "sttoroidal.h"
28     #include "st_gestionnaire.h"
29     #include "constantegeo.h"
30     #include <math.h>
31    
32    
33    
34    
35    
36     ST_TOROIDAL::ST_TOROIDAL(long LigneCourante,std::string idori,long axis2,double grand,double petit):ST_SURFACE(LigneCourante,idori),id_axis2_placement_3d(axis2),grandray(grand),petitray(petit)
37     {
38     }
39    
40     ST_TOROIDAL::ST_TOROIDAL(double *xyz, double *dirz,double grand,double petit):ST_SURFACE(),grandray(grand),petitray(petit)
41     {
42 francois 283 initialiser(xyz,dirz);
43 foucault 27 }
44    
45    
46     long ST_TOROIDAL::get_id_axis2_placement_3d(void)
47     {
48 francois 283 return id_axis2_placement_3d;
49 foucault 27 }
50     double ST_TOROIDAL::get_grandray(void)
51     {
52 francois 283 return grandray;
53 foucault 27 }
54     double ST_TOROIDAL::get_petitray(void)
55     {
56 francois 283 return petitray;
57 foucault 27 }
58    
59     void ST_TOROIDAL::evaluer(double *uv,double *xyz)
60     {
61 francois 283 OT_VECTEUR_3D local((grandray+petitray*cos(uv[1]))*cos(uv[0]),(grandray+petitray*cos(uv[1]))*sin(uv[0]),petitray*sin(uv[1]));
62     OT_VECTEUR_3D global=origine+repere*local;
63     xyz[0]=global.get_x();
64     xyz[1]=global.get_y();
65     xyz[2]=global.get_z();
66 foucault 27 }
67     void ST_TOROIDAL::deriver(double *uv,double *xyzdu, double *xyzdv)
68     {
69 francois 283 OT_VECTEUR_3D localu(-(grandray+petitray*cos(uv[1]))*sin(uv[0]),(grandray+petitray*cos(uv[1]))*cos(uv[0]),0.);
70     OT_VECTEUR_3D localv(-petitray*sin(uv[1])*cos(uv[0]),-petitray*sin(uv[1])*sin(uv[0]),petitray*cos(uv[1]));
71     OT_VECTEUR_3D globalu=repere*localu;
72     OT_VECTEUR_3D globalv=repere*localv;
73     xyzdu[0]=globalu.get_x();
74     xyzdu[1]=globalu.get_y();
75     xyzdu[2]=globalu.get_z();
76     xyzdv[0]=globalv.get_x();
77     xyzdv[1]=globalv.get_y();
78     xyzdv[2]=globalv.get_z();
79 foucault 27 }
80     void ST_TOROIDAL::deriver_seconde(double *uv,double* xyzduu,double* xyzduv,double* xyzdvv,double *xyz , double *xyzdu , double *xyzdv )
81     {
82 francois 283 OT_VECTEUR_3D localuu(-(grandray+petitray*cos(uv[1]))*cos(uv[0]),-(grandray+petitray*cos(uv[1]))*sin(uv[0]),0.);
83     OT_VECTEUR_3D localuv(petitray*sin(uv[1])*sin(uv[0]),-petitray*sin(uv[1])*cos(uv[0]),0.);
84     OT_VECTEUR_3D localvv(-petitray*cos(uv[1])*cos(uv[0]),-petitray*cos(uv[1])*sin(uv[0]),-petitray*sin(uv[1]));
85     OT_VECTEUR_3D globaluu=repere*localuu;
86     OT_VECTEUR_3D globaluv=repere*localuv;
87     OT_VECTEUR_3D globalvv=repere*localvv;
88     xyzduu[0]=globaluu.get_x();
89     xyzduu[1]=globaluu.get_y();
90     xyzduu[2]=globaluu.get_z();
91     xyzduv[0]=globaluv.get_x();
92     xyzduv[1]=globaluv.get_y();
93     xyzduv[2]=globaluv.get_z();
94     xyzdvv[0]=globalvv.get_x();
95     xyzdvv[1]=globalvv.get_y();
96     xyzdvv[2]=globalvv.get_z();
97     if ((xyzdu!=NULL) && (xyzdv!=NULL ) ) deriver(uv,xyzdu,xyzdv);
98     if (xyz!=NULL) evaluer(uv,xyz);
99 foucault 27 }
100     void ST_TOROIDAL::inverser(double *uv,double *xyz,double precision)
101     {
102 francois 283 double sign;
103     double valeur1;
104     double valeur3;
105     double variable;
106     OT_VECTEUR_3D global(xyz[0],xyz[1],xyz[2]);
107     OT_MATRICE_3D transpose_repere;
108     repere.transpose(transpose_repere);
109     OT_VECTEUR_3D vecteur=transpose_repere*(global-origine);
110     valeur1=vecteur.get_z()/petitray;
111     if (valeur1>1) valeur1=1;
112     if (valeur1<-1) valeur1=-1;
113     uv[1]=asin(valeur1);
114     double cosv=cos(uv[1]);
115     double cosv1=(-grandray+sqrt(vecteur.get_x()*vecteur.get_x()+vecteur.get_y()*vecteur.get_y()))/petitray;
116     if ( cosv*cosv1 < -0.000001 ) uv[1]= M_PI-uv[1];
117     valeur3=vecteur.get_x()/(grandray+petitray*cos(uv[1]));
118     if (valeur3>1) valeur3=1;
119     if (valeur3<-1) valeur3=-1;
120     uv[0]=acos(valeur3);
121     sign=vecteur.get_y()/(grandray+petitray*cos(uv[1]));
122     if (sign<-0.000001) uv[0]= 2.*M_PI-uv[0];
123 foucault 27 }
124     int ST_TOROIDAL::est_periodique_u(void)
125     {
126 francois 283 return 1;
127 foucault 27 }
128     int ST_TOROIDAL::est_periodique_v(void)
129     {
130 francois 283 return 1;
131 foucault 27 }
132     double ST_TOROIDAL::get_periode_u(void)
133     {
134 francois 283 return 2.*M_PI;
135 foucault 27 }
136     double ST_TOROIDAL::get_periode_v(void)
137     {
138 francois 283 return 2.*M_PI;
139 foucault 27 }
140     double ST_TOROIDAL::get_umin(void)
141     {
142 francois 283 return 0.;
143 foucault 27 }
144     double ST_TOROIDAL::get_umax(void)
145     {
146 francois 283 return 2.*M_PI;
147 foucault 27 }
148     double ST_TOROIDAL::get_vmin(void)
149     {
150 francois 283 return 0.;
151 foucault 27 }
152     double ST_TOROIDAL::get_vmax(void)
153     {
154 francois 283 return 2.*M_PI;
155 foucault 27 }
156     void ST_TOROIDAL::initialiser(ST_GESTIONNAIRE *gest)
157     {
158 francois 283 ST_AXIS2_PLACEMENT_3D* axe=gest->lst_axis2_placement_3d.getid(id_axis2_placement_3d);
159     ST_DIRECTION* dirz=gest->lst_direction.getid(axe->get_id_direction1());
160     ST_POINT* point=gest->lst_point.getid(axe->get_id_point());
161     double xyz[3];
162     point->evaluer(xyz);
163     double *dirnorm=dirz->get_direction();
164     initialiser(xyz,dirnorm);
165 foucault 27 }
166    
167    
168     void ST_TOROIDAL::initialiser(double *xyz,double *dirz)
169     {
170 francois 283 origine.change_x(xyz[0]);
171     origine.change_y(xyz[1]);
172     origine.change_z(xyz[2]);
173     OT_VECTEUR_3D vec_z(dirz[0],dirz[1],dirz[2]);
174     vec_z.norme();
175     if (!(OPERATEUR::egal(vec_z.get_x(),0.,0.000001)))
176     {
177     x[0]=vec_z.get_y();
178     x[1]=(-vec_z.get_x());
179     x[2]=0.;
180     }
181     else if (!(OPERATEUR::egal(vec_z.get_y(),0.,0.000001)))
182     {
183     x[0]=0.;
184     x[1]=(-vec_z.get_z());
185     x[2]=vec_z.get_y();
186     }
187     else
188     {
189     x[0]=vec_z.get_z();
190     x[1]=0.;
191     x[2]=0.;
192     }
193     OT_VECTEUR_3D vec_x(x);
194     vec_x.norme();
195     OT_VECTEUR_3D vec_y=vec_z&vec_x;
196     repere.change_vecteur1(vec_x);
197     repere.change_vecteur2(vec_y);
198     repere.change_vecteur3(vec_z);
199 foucault 27 }
200    
201    
202    
203    
204     int ST_TOROIDAL::get_type_geometrique(TPL_LISTE_ENTITE<double> &param)
205     {
206 francois 283 param.ajouter(origine.get_x());
207     param.ajouter(origine.get_y());
208     param.ajouter(origine.get_z());
209     param.ajouter(repere.get_vecteur1().get_x());
210     param.ajouter(repere.get_vecteur1().get_y());
211     param.ajouter(repere.get_vecteur1().get_z());
212     param.ajouter(repere.get_vecteur3().get_x());
213     param.ajouter(repere.get_vecteur3().get_y());
214     param.ajouter(repere.get_vecteur3().get_z());
215     param.ajouter(grandray);
216     param.ajouter(petitray);
217     return MGCo_TORE;
218 foucault 27 }
219    
220    
221     void ST_TOROIDAL::est_util(ST_GESTIONNAIRE* gest)
222     {
223 francois 283 util=true;
224     gest->lst_axis2_placement_3d.getid(id_axis2_placement_3d)->est_util(gest);
225 foucault 27 }
226    
227    
228    
229    
230    
231     void ST_TOROIDAL:: get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> &param)
232     {
233    
234     // The first parameter indicate the code access
235 francois 283 param.ajouter(2);
236 foucault 27
237     // The follewing two parameters of the list indicate the orders of the net points
238    
239 francois 283 param.ajouter(4);
240     param.ajouter(4);
241 foucault 27
242     // The follewing two parameters indicate the number of rows and colons of the control points
243     // respectively to the two parameters directions
244    
245 francois 283 param.ajouter(7);
246     param.ajouter(7);
247 foucault 27
248     // this present the knot vector in the u-direction
249    
250 francois 283 param.ajouter(0);
251     param.ajouter(0);
252     param.ajouter(0);
253     param.ajouter(0.25);
254     param.ajouter(0.5);
255     param.ajouter(0.5);
256     param.ajouter(0.75);
257     param.ajouter(1);
258     param.ajouter(1);
259     param.ajouter(1);
260 foucault 27
261     // this present the knot vector in the u-direction
262    
263 francois 283 param.ajouter(0);
264     param.ajouter(0);
265     param.ajouter(0);
266     param.ajouter(0.25);
267     param.ajouter(0.5);
268     param.ajouter(0.5);
269     param.ajouter(0.75);
270     param.ajouter(1);
271     param.ajouter(1);
272     param.ajouter(1);
273 foucault 27
274    
275     // the construction of the polygon control of toroid surface is obtained by rotating the
276     // the controle polygon of one circle along the other circle.
277    
278    
279 francois 283 double xyz[3];
280     double w;
281     double rx,ry,rz;
282     double rp=grandray-petitray;
283     double rg=grandray+petitray;
284 foucault 27
285 francois 283 for (int v=0;v<7;v++)
286     {
287 foucault 27
288 francois 283 switch (v) {
289     case 0: {
290     rx=0;
291     ry=rp;
292     rz=0;
293     w=1;
294     break;
295     }
296     case 1: {
297     rx=-rp;
298     ry=rp;
299     rz=0;
300     w=0.5;
301     break;
302     }
303     case 2: {
304     rx=-rp;
305     ry=-rp;
306     rz=0;
307     w=0.5;
308     break;
309     }
310 souaissa 57 //case 3: {rx=-rp;ry=0;rz=0;w=1; break;}
311 francois 283 case 3: {
312     rx=0;
313     ry=-rp;
314     rz=0;
315     w=1;
316     break;
317     }
318     case 4: {
319     rx=rp;
320     ry=-rp;
321     rz=0;
322     w=0.5;
323     break;
324     }
325 souaissa 57 //case 5: {rx=0;ry=rp;rz=0;w=0.5; break;}
326 francois 283 case 5: {
327     rx=rp;
328     ry=rp;
329     rz=0;
330     w=0.5;
331     break;
332     }
333     case 6: {
334     rx=0;
335     ry=rp;
336     rz=0;
337     w=1;
338     break;
339     }
340     }
341 foucault 27
342    
343     //P0j
344    
345 francois 283 OT_VECTEUR_3D loc(rx,ry,rz);
346     OT_VECTEUR_3D glob=origine+repere*loc;
347 foucault 27
348 souaissa 57 //glob=origine+repere*loc;
349 foucault 27
350 francois 283 xyz[0]=glob.get_x();
351     xyz[1]=glob.get_y();
352     xyz[2]=glob.get_z();
353 foucault 27
354 francois 283 param.ajouter(xyz[0]);
355     param.ajouter(xyz[1]);
356     param.ajouter(xyz[2]);
357     param.ajouter(1*w);
358 foucault 27
359     //P1j
360    
361 francois 283 loc.change_z(-petitray);
362 foucault 27
363 francois 283 glob=origine+repere*loc;
364 foucault 27
365 francois 283 xyz[0]=glob.get_x();
366     xyz[1]=glob.get_y();
367     xyz[2]=glob.get_z();
368 foucault 27
369 francois 283 param.ajouter(xyz[0]);
370     param.ajouter(xyz[1]);
371     param.ajouter(xyz[2]);
372     param.ajouter(0.5*w);
373 foucault 27
374    
375     //P2j
376    
377 souaissa 57
378 francois 283 if (v==0||v==6)loc.change_y(rg);
379     if (v==3)loc.change_y(-rg);
380     if (v==1) {
381     loc.change_y(rg);
382     loc.change_x(-rg);
383     }
384     if (v==2) {
385     loc.change_y(-rg);
386     loc.change_x(-rg);
387     }
388     if (v==4) {
389     loc.change_y(-rg);
390     loc.change_x(rg);
391     }
392     if (v==5) {
393     loc.change_y(rg);
394     loc.change_x(rg);
395     }
396 souaissa 57 //if(v==1||v==2||v==4||v==5) loc.change_x(rg);
397 foucault 27
398 francois 283 glob=origine+repere*loc;
399 foucault 27
400 francois 283 xyz[0]=glob.get_x();
401     xyz[1]=glob.get_y();
402     xyz[2]=glob.get_z();
403 foucault 27
404 francois 283 param.ajouter(xyz[0]);
405     param.ajouter(xyz[1]);
406     param.ajouter(xyz[2]);
407     param.ajouter(0.5*w);
408 foucault 27
409     //P3j
410    
411 francois 283 loc.change_z(0);
412 foucault 27
413 francois 283 glob=origine+repere*loc;
414 foucault 27
415 francois 283 xyz[0]=glob.get_x();
416     xyz[1]=glob.get_y();
417     xyz[2]=glob.get_z();
418 foucault 27
419 francois 283 param.ajouter(xyz[0]);
420     param.ajouter(xyz[1]);
421     param.ajouter(xyz[2]);
422     param.ajouter(1*w);
423 foucault 27
424     //P4j
425    
426 francois 283 loc.change_z(petitray);
427 foucault 27
428 francois 283 glob=origine+repere*loc;
429 foucault 27
430 francois 283 xyz[0]=glob.get_x();
431     xyz[1]=glob.get_y();
432     xyz[2]=glob.get_z();
433 foucault 27
434 francois 283 param.ajouter(xyz[0]);
435     param.ajouter(xyz[1]);
436     param.ajouter(xyz[2]);
437     param.ajouter(0.5*w);
438 foucault 27
439     //P5j
440 francois 283 if (v==0||v==6)loc.change_y(rp);
441     if (v==3)loc.change_y(-rp);
442 foucault 27
443 francois 283 if (v==1) {
444     loc.change_y(rp);
445     loc.change_x(-rp);
446     }
447     if (v==2) {
448     loc.change_y(-rp);
449     loc.change_x(-rp);
450     }
451     if (v==4) {
452     loc.change_y(-rp);
453     loc.change_x(rp);
454     }
455     if (v==5) {
456     loc.change_y(rp);
457     loc.change_x(rp);
458     }
459     glob=origine+repere*loc;
460 foucault 27
461 francois 283 xyz[0]=glob.get_x();
462     xyz[1]=glob.get_y();
463     xyz[2]=glob.get_z();
464 foucault 27
465 francois 283 param.ajouter(xyz[0]);
466     param.ajouter(xyz[1]);
467     param.ajouter(xyz[2]);
468     param.ajouter(0.5*w);
469 foucault 27 //P5j
470    
471 francois 283 loc.change_z(0);
472 foucault 27
473 francois 283 glob=origine+repere*loc;
474 foucault 27
475 francois 283 xyz[0]=glob.get_x();
476     xyz[1]=glob.get_y();
477     xyz[2]=glob.get_z();
478 foucault 27
479 francois 283 param.ajouter(xyz[0]);
480     param.ajouter(xyz[1]);
481     param.ajouter(xyz[2]);
482     param.ajouter(1*w);
483 foucault 27
484 francois 283 }
485 foucault 27
486 francois 283 indx_premier_ptctr=25;
487 foucault 27 }
488