MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
sttoroidal.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
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 
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  initialiser(xyz,dirz);
41 }
42 
43 
45 {
46  return id_axis2_placement_3d;
47 }
49 {
50  return grandray;
51 }
53 {
54  return petitray;
55 }
56 
57 void ST_TOROIDAL::evaluer(double *uv,double *xyz)
58 {
59  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 }
65 void ST_TOROIDAL::deriver(double *uv,double *xyzdu, double *xyzdv)
66 {
67  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 }
78 void ST_TOROIDAL::deriver_seconde(double *uv,double* xyzduu,double* xyzduv,double* xyzdvv,double *xyz , double *xyzdu , double *xyzdv )
79 {
80  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 }
98 void ST_TOROIDAL::inverser(double *uv,double *xyz,double precision)
99 {
100  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 }
123 {
124  return 1;
125 }
127 {
128  return 1;
129 }
131 {
132  return 2.*M_PI;
133 }
135 {
136  return 2.*M_PI;
137 }
139 {
140  return 0.;
141 }
143 {
144  return 2.*M_PI;
145 }
147 {
148  return 0.;
149 }
151 {
152  return 2.*M_PI;
153 }
155 {
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 }
164 
165 
166 void ST_TOROIDAL::initialiser(double *xyz,double *dirz)
167 {
168  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 }
198 
199 
200 
201 
203 {
204  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);
216 }
217 
218 
220 {
221  util=true;
223 }
224 
225 
226 
227 
228 
229 void ST_TOROIDAL:: get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> &param)
230 {
231 
232  param.ajouter(2);
233 
234 
235  param.ajouter(4);
236  param.ajouter(4);
237 
238 
239  param.ajouter(7);
240  param.ajouter(7);
241 
242 
243  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 
254 
255  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 
266 
267 
268 
269  double xyz[3];
270  double w;
271  double rx,ry,rz;
272  double rp=grandray-petitray;
273  double rg=grandray+petitray;
274 
275  for (int v=0;v<7;v++)
276  {
277 
278  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 
330 
331 
332  OT_VECTEUR_3D loc(rx,ry,rz);
333  OT_VECTEUR_3D glob=origine+repere*loc;
334 
335 
336  xyz[0]=glob.get_x();
337  xyz[1]=glob.get_y();
338  xyz[2]=glob.get_z();
339 
340  param.ajouter(xyz[0]);
341  param.ajouter(xyz[1]);
342  param.ajouter(xyz[2]);
343  param.ajouter(1*w);
344 
345 
346  loc.change_z(-petitray);
347 
348  glob=origine+repere*loc;
349 
350  xyz[0]=glob.get_x();
351  xyz[1]=glob.get_y();
352  xyz[2]=glob.get_z();
353 
354  param.ajouter(xyz[0]);
355  param.ajouter(xyz[1]);
356  param.ajouter(xyz[2]);
357  param.ajouter(0.5*w);
358 
359 
360 
361 
362  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 
381  glob=origine+repere*loc;
382 
383  xyz[0]=glob.get_x();
384  xyz[1]=glob.get_y();
385  xyz[2]=glob.get_z();
386 
387  param.ajouter(xyz[0]);
388  param.ajouter(xyz[1]);
389  param.ajouter(xyz[2]);
390  param.ajouter(0.5*w);
391 
392 
393  loc.change_z(0);
394 
395  glob=origine+repere*loc;
396 
397  xyz[0]=glob.get_x();
398  xyz[1]=glob.get_y();
399  xyz[2]=glob.get_z();
400 
401  param.ajouter(xyz[0]);
402  param.ajouter(xyz[1]);
403  param.ajouter(xyz[2]);
404  param.ajouter(1*w);
405 
406 
407  loc.change_z(petitray);
408 
409  glob=origine+repere*loc;
410 
411  xyz[0]=glob.get_x();
412  xyz[1]=glob.get_y();
413  xyz[2]=glob.get_z();
414 
415  param.ajouter(xyz[0]);
416  param.ajouter(xyz[1]);
417  param.ajouter(xyz[2]);
418  param.ajouter(0.5*w);
419 
420  if (v==0||v==6)loc.change_y(rp);
421  if (v==3)loc.change_y(-rp);
422 
423  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 
441  xyz[0]=glob.get_x();
442  xyz[1]=glob.get_y();
443  xyz[2]=glob.get_z();
444 
445  param.ajouter(xyz[0]);
446  param.ajouter(xyz[1]);
447  param.ajouter(xyz[2]);
448  param.ajouter(0.5*w);
449 
450  loc.change_z(0);
451 
452  glob=origine+repere*loc;
453 
454  xyz[0]=glob.get_x();
455  xyz[1]=glob.get_y();
456  xyz[2]=glob.get_z();
457 
458  param.ajouter(xyz[0]);
459  param.ajouter(xyz[1]);
460  param.ajouter(xyz[2]);
461  param.ajouter(1*w);
462 
463  }
464 
465  indx_premier_ptctr=25;
466 }
467 
ST_GESTIONNAIRE
Definition: st_gestionnaire.h:55
OT_VECTEUR_3D::change_z
virtual void change_z(double z)
Definition: ot_mathematique.cpp:444
ST_TOROIDAL::x
double x[3]
Definition: sttoroidal.h:71
ST_TOROIDAL::get_periode_v
virtual double get_periode_v(void)
Definition: sttoroidal.cpp:134
ST_AXIS2_PLACEMENT_3D
Definition: staxis2place3d.h:32
ST_TOROIDAL::origine
OT_VECTEUR_3D origine
Definition: sttoroidal.h:69
OT_MATRICE_3D::change_vecteur3
void change_vecteur3(OT_VECTEUR_3D v)
Definition: ot_mathematique.cpp:810
ST_TOROIDAL::evaluer
virtual void evaluer(double *uv, double *xyz)
Definition: sttoroidal.cpp:57
ST_GESTIONNAIRE::lst_direction
TPL_MAP_ENTITE< class ST_DIRECTION * > lst_direction
Definition: st_gestionnaire.h:90
st_gestionnaire.h
ST_TOROIDAL::get_param_NURBS
virtual void get_param_NURBS(int &indx_premier_ptctr, TPL_LISTE_ENTITE< double > &param)
Definition: sttoroidal.cpp:229
ST_POINT::evaluer
virtual void evaluer(double *xyz)
Definition: st_point.cpp:50
OT_VECTEUR_3D::change_y
virtual void change_y(double y)
Definition: ot_mathematique.cpp:439
ST_AXIS2_PLACEMENT_3D::est_util
virtual void est_util(class ST_GESTIONNAIRE *gest)
Definition: staxis2place3d.cpp:53
OT_MATRICE_3D::get_vecteur1
OT_VECTEUR_3D & get_vecteur1(void)
Definition: ot_mathematique.cpp:814
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
OT_MATRICE_3D::transpose
void transpose(OT_MATRICE_3D &res) const
Definition: ot_mathematique.cpp:750
ST_TOROIDAL::get_type_geometrique
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > &param)
Definition: sttoroidal.cpp:202
ST_TOROIDAL::deriver_seconde
virtual void deriver_seconde(double *uv, double *xyzduu, double *xyzduv, double *xyzdvv, double *xyz=NULL, double *xyzdu=NULL, double *xyzdv=NULL)
Definition: sttoroidal.cpp:78
ST_GESTIONNAIRE::lst_point
TPL_MAP_ENTITE< class ST_POINT * > lst_point
Definition: st_gestionnaire.h:91
ST_DIRECTION
Definition: stdirection.h:32
ST_TOROIDAL::petitray
double petitray
Definition: sttoroidal.h:67
ST_TOROIDAL::est_periodique_u
virtual int est_periodique_u(void)
Definition: sttoroidal.cpp:122
ST_TOROIDAL::get_grandray
virtual double get_grandray(void)
Definition: sttoroidal.cpp:48
ST_POINT
Definition: st_point.h:30
ST_TOROIDAL::id_axis2_placement_3d
long id_axis2_placement_3d
Definition: sttoroidal.h:65
ST_TOROIDAL::deriver
virtual void deriver(double *uv, double *xyzdu, double *xyzdv)
Definition: sttoroidal.cpp:65
ST_TOROIDAL::initialiser
virtual void initialiser(class ST_GESTIONNAIRE *gest)
Definition: sttoroidal.cpp:154
ST_TOROIDAL::inverser
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
Definition: sttoroidal.cpp:98
ST_TOROIDAL::ST_TOROIDAL
ST_TOROIDAL(long LigneCourante, std::string idori, long axis2d, double grand, double petit)
Definition: sttoroidal.cpp:34
ST_TOROIDAL::grandray
double grandray
Definition: sttoroidal.h:66
OPERATEUR::egal
static int egal(double a, double b, double eps)
Definition: ot_mathematique.cpp:1629
OT_MATRICE_3D
Definition: ot_mathematique.h:160
constantegeo.h
OT_MATRICE_3D::get_vecteur3
OT_VECTEUR_3D & get_vecteur3(void)
Definition: ot_mathematique.cpp:822
ST_TOROIDAL::repere
OT_MATRICE_3D repere
Definition: sttoroidal.h:68
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
ST_TOROIDAL::get_petitray
virtual double get_petitray(void)
Definition: sttoroidal.cpp:52
ST_AXIS2_PLACEMENT_3D::get_id_point
virtual long get_id_point(void)
Definition: staxis2place3d.cpp:37
OT_MATRICE_3D::change_vecteur2
void change_vecteur2(OT_VECTEUR_3D v)
Definition: ot_mathematique.cpp:806
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
ST_TOROIDAL::get_periode_u
virtual double get_periode_u(void)
Definition: sttoroidal.cpp:130
ST_TOROIDAL::est_util
virtual void est_util(class ST_GESTIONNAIRE *gest)
Definition: sttoroidal.cpp:219
asin
double2 asin(double2 &val)
Definition: ot_doubleprecision.cpp:294
ST_TOROIDAL::get_umin
virtual double get_umin(void)
Definition: sttoroidal.cpp:138
ST_TOROIDAL::get_umax
virtual double get_umax(void)
Definition: sttoroidal.cpp:142
ST_GESTIONNAIRE::lst_axis2_placement_3d
TPL_MAP_ENTITE< class ST_AXIS2_PLACEMENT_3D * > lst_axis2_placement_3d
Definition: st_gestionnaire.h:81
ST_SURFACE
Definition: st_surface.h:29
ST_AXIS2_PLACEMENT_3D::get_id_direction1
virtual long get_id_direction1(void)
Definition: staxis2place3d.cpp:42
OT_VECTEUR_3D::get_y
virtual double get_y(void) const
Definition: ot_mathematique.cpp:423
acos
double2 acos(double2 &val)
Definition: ot_doubleprecision.cpp:224
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
ST_DIRECTION::get_direction
virtual double * get_direction(void)
Definition: stdirection.cpp:42
TPL_MAP_ENTITE::getid
virtual X getid(unsigned long num)
Definition: tpl_map_entite.h:96
ST_TOROIDAL::est_periodique_v
virtual int est_periodique_v(void)
Definition: sttoroidal.cpp:126
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
ST_TOROIDAL::get_vmax
virtual double get_vmax(void)
Definition: sttoroidal.cpp:150
ST_TOROIDAL::get_id_axis2_placement_3d
virtual long get_id_axis2_placement_3d(void)
Definition: sttoroidal.cpp:44
GEOMETRIE::CONST::Co_TORE
@ Co_TORE
Definition: constantegeo.h:32
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
sttoroidal.h
TPL_LISTE_ENTITE< double >
ST_IDENTIFICATEUR::util
bool util
Definition: st_ident.h:46
cos
double2 cos(double2 &val)
Definition: ot_doubleprecision.cpp:206
ST_TOROIDAL::get_vmin
virtual double get_vmin(void)
Definition: sttoroidal.cpp:146
OT_MATRICE_3D::change_vecteur1
void change_vecteur1(OT_VECTEUR_3D v)
Definition: ot_mathematique.cpp:802
OT_VECTEUR_3D::change_x
virtual void change_x(double x)
Definition: ot_mathematique.cpp:434
sin
double2 sin(double2 &val)
Definition: ot_doubleprecision.cpp:250