MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
sat_ellipse.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 //####// sat_ellipse.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:54:00 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "sat_ellipse.h"
25 #include "tpl_fonction.h"
26 #include "ot_mathematique.h"
27 #include "constantegeo.h"
28 
29 #include <math.h>
30 
31 SAT_ELLIPSE::SAT_ELLIPSE(unsigned long num):SAT_COURBE(num)
32 {
33 }
34 
36 {
37 }
38 
40 {
41 }
42 
43 
44 
45 void SAT_ELLIPSE::evaluer(double t,double *xyz)
46 {
47  xyz[0]=center[0]+major[0]*a*cos(t)+minor[0]*a*ratio*sin(t);
48  xyz[1]=center[1]+major[1]*a*cos(t)+minor[1]*a*ratio*sin(t);
49  xyz[2]=center[2]+major[2]*a*cos(t)+minor[2]*a*ratio*sin(t);
50 }
51 
52 void SAT_ELLIPSE::deriver(double t,double *xyz)
53 {
54  xyz[0]= -major[0]*a*sin(t)+minor[0]*a*ratio*cos(t);
55  xyz[1]= -major[1]*a*sin(t)+minor[1]*a*ratio*cos(t);
56  xyz[2]= -major[2]*a*sin(t)+minor[2]*a*ratio*cos(t);
57 
58 }
59 
60 void SAT_ELLIPSE::deriver_seconde(double t,double *ddxyz,double* dxyz ,double* xyz )
61 {
62  ddxyz[0]= -major[0]*a*cos(t)-minor[0]*a*ratio*sin(t);
63  ddxyz[1]= -major[1]*a*cos(t)-minor[1]*a*ratio*sin(t);
64  ddxyz[2]= -major[2]*a*cos(t)-minor[2]*a*ratio*sin(t);
65  if (dxyz!=NULL) deriver(t,dxyz);
66  if (xyz!=NULL) evaluer(t,xyz);
67 }
68 
69 void SAT_ELLIPSE::inverser(double& t,double *xyz,double precision)
70 {
71  double vecsol[3],veccoef1[3],veccoef2[3];
72  vecsol[0]=xyz[0]-center[0];
73  vecsol[1]=xyz[1]-center[1];
74  vecsol[2]=xyz[2]-center[2];
75  veccoef1[0]=major[0]*a;
76  veccoef1[1]=major[1]*a;
77  veccoef1[2]=major[2]*a;
78  veccoef2[0]=minor[0]*a*ratio;
79  veccoef2[1]=minor[1]*a*ratio;
80  veccoef2[2]=minor[2]*a*ratio;
81 
82  int num1,num2;
83  double det= veccoef1[0]*veccoef2[1]-veccoef1[1]*veccoef2[0];
84  if (OPERATEUR::egal(det,0.0,0.0001))
85  {
86  det= veccoef1[0]*veccoef2[2]-veccoef1[2]*veccoef2[0];
87  if (OPERATEUR::egal(det,0.0,0.0001))
88  {
89  det= veccoef1[1]*veccoef2[2]-veccoef1[2]*veccoef2[1];
90  num1=1;
91  num2=2;
92  }
93  else
94  {
95  num1=0;
96  num2=2;
97  }
98  }
99  else
100  {
101  num1=0;
102  num2=1;
103  }
104  double co= (vecsol[num1]*veccoef2[num2]-vecsol[num2]*veccoef2[num1])/det;
105  double si= (vecsol[num2]*veccoef1[num1]-vecsol[num1]*veccoef1[num2])/det;
106  if (co>1.) co=1.;
107  if (co<(-1.)) co=(-1.);
108  t=acos(co);
109  if (si<-0.0001) t= -t;
110  if (t<-0.0001) t=t+2*M_PI;
111 
112 
113 
114 }
115 
117 {
118  return 0.;
119 }
120 
122 {
123  return 2.*M_PI;
124 }
125 
127 {
128  return 1;
129 }
130 
132 {
133  return 2.*M_PI;
134 }
135 
136 
138 {
139  a=sqrt(major[0]*major[0]+major[1]*major[1]+major[2]*major[2]);
140  OT_VECTEUR_3D u(major);
142  OT_VECTEUR_3D v=w&u;
143  u.norme();
144  w.norme();
145  v.norme();
146  major[0]=u.get_x();
147  major[1]=u.get_y();
148  major[2]=u.get_z();
149  minor[0]=v.get_x();
150  minor[1]=v.get_y();
151  minor[2]=v.get_z();
152  normal[0]=w.get_x();
153  normal[1]=w.get_y();
154  normal[2]=w.get_z();
155 }
156 
157 
158 
159 
160 
161 
162 
163 
164 
165 
166 
167 
168 
169 double equation_longueur(SAT_ELLIPSE& ellipse,double t)
170 {
171  return sqrt(ellipse.a*ellipse.a*sin(t)*sin(t)+ellipse.a*ellipse.a*ellipse.ratio*ellipse.ratio*cos(t)*cos(t));
172 }
173 
174 
175 
176 
177 double SAT_ELLIPSE::get_longueur(double t1,double t2,double precis)
178 {
179  if (ratio!=1.)
180  {
182  return longueur_ellipse.integrer_gauss_2(t1,t2);
183  }
184  else
185  {
186  return a*(t2-t1);
187  }
188 
189 
190 }
191 
192 
194 {
195  param.ajouter(center[0]);
196  param.ajouter(center[1]);
197  param.ajouter(center[2]);
198  param.ajouter(major[0]);
199  param.ajouter(major[1]);
200  param.ajouter(major[2]);
201  param.ajouter(normal[0]);
202  param.ajouter(normal[1]);
203  param.ajouter(normal[2]);
204  param.ajouter(a);
205  param.ajouter(a*ratio);
207 }
208 
209 
210 
211 
212 void SAT_ELLIPSE::get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> &param)
213 {
214  double xyz[3];
215 
216  param.ajouter(1);
217 
218 
219  param.ajouter(3);
220  param.ajouter(0);
221 
222 
223  param.ajouter(7);
224  param.ajouter(0);
225 
226 
227  param.ajouter(0);
228  param.ajouter(0);
229  param.ajouter(0);
230  param.ajouter(0.25);
231  param.ajouter(0.5);
232  param.ajouter(0.5);
233  param.ajouter(0.75);
234  param.ajouter(1);
235  param.ajouter(1);
236  param.ajouter(1);
237 
238 
239 
240  double ax= a;
241  double ay= 0;
242 
243  xyz[0]=center[0]+major[0]*ax+minor[0]*ay;
244  xyz[1]=center[1]+major[1]*ax+minor[1]*ay;
245  xyz[2]=center[2]+major[2]*ax+minor[2]*ay;
246 
247  param.ajouter(xyz[0]);
248  param.ajouter(xyz[1]);
249  param.ajouter(xyz[2]);
250  param.ajouter(1);
251 
252 
253  ay=a*ratio;
254 
255  xyz[0]=center[0]+major[0]*ax+minor[0]*ay;
256  xyz[1]=center[1]+major[1]*ax+minor[1]*ay;
257  xyz[2]=center[2]+major[2]*ax+minor[2]*ay;
258 
259 
260 
261  param.ajouter(xyz[0]);
262  param.ajouter(xyz[1]);
263  param.ajouter(xyz[2]);
264  param.ajouter(0.5);
265 
266 
267 
268  ax=-a;
269 
270  xyz[0]=center[0]+major[0]*ax+minor[0]*ay;
271  xyz[1]=center[1]+major[1]*ax+minor[1]*ay;
272  xyz[2]=center[2]+major[2]*ax+minor[2]*ay;
273 
274 
275  param.ajouter(xyz[0]);
276  param.ajouter(xyz[1]);
277  param.ajouter(xyz[2]);
278  param.ajouter(0.5);
279 
280 
281  ay=0;
282 
283  xyz[0]=center[0]+major[0]*ax+minor[0]*ay;
284  xyz[1]=center[1]+major[1]*ax+minor[1]*ay;
285  xyz[2]=center[2]+major[2]*ax+minor[2]*ay;
286 
287 
288  param.ajouter(xyz[0]);
289  param.ajouter(xyz[1]);
290  param.ajouter(xyz[2]);
291  param.ajouter(1);
292 
293 
294 
295  ay=-a*ratio;
296 
297  xyz[0]=center[0]+major[0]*ax+minor[0]*ay;
298  xyz[1]=center[1]+major[1]*ax+minor[1]*ay;
299  xyz[2]=center[2]+major[2]*ax+minor[2]*ay;
300 
301 
302 
303 
304  param.ajouter(xyz[0]);
305  param.ajouter(xyz[1]);
306  param.ajouter(xyz[2]);
307  param.ajouter(0.5);
308 
309 
310  ax=a;
311 
312  xyz[0]=center[0]+major[0]*ax+minor[0]*ay;
313  xyz[1]=center[1]+major[1]*ax+minor[1]*ay;
314  xyz[2]=center[2]+major[2]*ax+minor[2]*ay;
315 
316 
317  param.ajouter(xyz[0]);
318  param.ajouter(xyz[1]);
319  param.ajouter(xyz[2]);
320  param.ajouter(0.5);
321 
322 
323  ay=0;
324 
325  xyz[0]=center[0]+major[0]*ax+minor[0]*ay;
326  xyz[1]=center[1]+major[1]*ax+minor[1]*ay;
327  xyz[2]=center[2]+major[2]*ax+minor[2]*ay;
328 
329 
330  param.ajouter(xyz[0]);
331  param.ajouter(xyz[1]);
332  param.ajouter(xyz[2]);
333  param.ajouter(1);
334 
335  indx_premier_ptctr=15;
336 
337 }
sat_ellipse.h
SAT_ELLIPSE::calcul_parametre
virtual void calcul_parametre(void)
Definition: sat_ellipse.cpp:137
SAT_ELLIPSE::center
double center[3]
Definition: sat_ellipse.h:39
SAT_ELLIPSE::SAT_ELLIPSE
SAT_ELLIPSE()
Definition: sat_ellipse.cpp:35
SAT_ELLIPSE::major
double major[3]
Definition: sat_ellipse.h:41
SAT_ELLIPSE::get_tmax
virtual double get_tmax()
Definition: sat_ellipse.cpp:121
GEOMETRIE::CONST::Co_ELLIPSE
@ Co_ELLIPSE
Definition: constantegeo.h:32
SAT_ELLIPSE::deriver_seconde
virtual void deriver_seconde(double t, double *ddxyz, double *dxyz=NULL, double *xyz=NULL)
Definition: sat_ellipse.cpp:60
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
SAT_ELLIPSE::inverser
virtual void inverser(double &t, double *xyz, double precision=1e-6)
Definition: sat_ellipse.cpp:69
SAT_ELLIPSE
Definition: sat_ellipse.h:29
SAT_ELLIPSE::a
double a
Definition: sat_ellipse.h:44
SAT_ELLIPSE::get_periode
virtual double get_periode(void)
Definition: sat_ellipse.cpp:131
SAT_ELLIPSE::~SAT_ELLIPSE
virtual ~SAT_ELLIPSE()
Definition: sat_ellipse.cpp:39
OPERATEUR::egal
static int egal(double a, double b, double eps)
Definition: ot_mathematique.cpp:1629
SAT_ELLIPSE::get_longueur
virtual double get_longueur(double t1, double t2, double precis=1e6)
Definition: sat_ellipse.cpp:177
TPL_FONCTION1
Definition: tpl_fonction.h:28
constantegeo.h
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
ot_mathematique.h
SAT_ELLIPSE::evaluer
virtual void evaluer(double t, double *xyz)
Definition: sat_ellipse.cpp:45
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
SAT_ELLIPSE::get_type_geometrique
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > &param)
Definition: sat_ellipse.cpp:193
SAT_ELLIPSE::get_param_NURBS
virtual void get_param_NURBS(int &indx_premier_ptctr, TPL_LISTE_ENTITE< double > &param)
Definition: sat_ellipse.cpp:212
TPL_FONCTION1::integrer_gauss_2
A integrer_gauss_2(C t1, C t2, int nb_pas=32)
Definition: tpl_fonction.h:41
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
SAT_ELLIPSE::normal
double normal[3]
Definition: sat_ellipse.h:40
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
TPL_LISTE_ENTITE< double >
SAT_ELLIPSE::get_tmin
virtual double get_tmin()
Definition: sat_ellipse.cpp:116
SAT_ELLIPSE::ratio
double ratio
Definition: sat_ellipse.h:42
SAT_ELLIPSE::deriver
virtual void deriver(double t, double *xyz)
Definition: sat_ellipse.cpp:52
SAT_COURBE
Definition: sat_courbe.h:33
SAT_ELLIPSE::minor
double minor[3]
Definition: sat_ellipse.h:45
cos
double2 cos(double2 &val)
Definition: ot_doubleprecision.cpp:206
tpl_fonction.h
SAT_ELLIPSE::est_periodique
virtual int est_periodique(void)
Definition: sat_ellipse.cpp:126
equation_longueur
double equation_longueur(SAT_ELLIPSE &ellipse, double t)
Definition: sat_ellipse.cpp:169
sin
double2 sin(double2 &val)
Definition: ot_doubleprecision.cpp:250