ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/addin/step/src/sttoroidal.cpp
Revision: 1156
Committed: Thu Jun 13 22:02:48 2024 UTC (14 months ago) by francois
File size: 11439 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

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