ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/addin/sat/src/sat_cone.cpp
Revision: 1156
Committed: Thu Jun 13 22:02:48 2024 UTC (14 months, 2 weeks ago) by francois
File size: 13454 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     //####// sat_cone.cpp
15     //####//
16     //####//------------------------------------------------------------
17     //####//------------------------------------------------------------
18     //####// COPYRIGHT 2000-2024
19     //####// jeu 13 jun 2024 11:54:00 EDT
20     //####//------------------------------------------------------------
21     //####//------------------------------------------------------------
22 francois 283
23    
24     #include <math.h>
25     #include "constantegeo.h"
26     #include "sat_cone.h"
27    
28     #include "ot_mathematique.h"
29    
30    
31     SAT_CONE::SAT_CONE(unsigned long num):SAT_SURFACE(num)
32     {
33     }
34    
35     SAT_CONE::SAT_CONE():SAT_SURFACE()
36     {
37     }
38    
39     SAT_CONE::~SAT_CONE()
40     {
41     }
42    
43    
44     void SAT_CONE::calcule_parametre(void)
45     {
46     a=sqrt(major[0]*major[0]+major[1]*major[1]+major[2]*major[2]);
47     OT_VECTEUR_3D u(major);
48     OT_VECTEUR_3D w(normal);
49     OT_VECTEUR_3D v=w&u;
50     minor[0]=v.get_x();
51     minor[1]=v.get_y();
52     minor[2]=v.get_z();
53     u.norme();
54     w.norme();
55     v.norme();
56     major[0]=u.get_x();
57     major[1]=u.get_y();
58     major[2]=u.get_z();
59     minor[0]=v.get_x();
60     minor[1]=v.get_y();
61     minor[2]=v.get_z();
62     normal[0]=w.get_x();
63     normal[1]=w.get_y();
64     normal[2]=w.get_z();
65     if (cosalpha<0.) un=-1.0;
66     else un=1.0;
67     }
68    
69    
70     void SAT_CONE::evaluer(double *uv,double *xyz)
71     {
72     double xtmp,ytmp,ztmp;
73     xtmp=a*(1.+un*uv[1]*sinalpha/cosalpha)*cos(uv[0]);
74     ytmp=a*ratio*(1.+un*uv[1]*sinalpha/cosalpha)*sin(uv[0]);
75     ztmp=un*a*uv[1];
76     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
77     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
78     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
79     }
80    
81     void SAT_CONE::deriver(double *uv,double *xyzdu, double *xyzdv)
82     {
83     double xtmp,ytmp,ztmp;
84     xtmp=-a*(1.+un*uv[1]*sinalpha/cosalpha)*sin(uv[0]);
85     ytmp=a*ratio*(1.+un*uv[1]*sinalpha/cosalpha)*cos(uv[0]);
86     ztmp=0.;
87     xyzdu[0]=major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
88     xyzdu[1]=major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
89     xyzdu[2]=major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
90     xtmp=un*a*sinalpha/cosalpha*cos(uv[0]);
91     ytmp=un*a*ratio*sinalpha/cosalpha*sin(uv[0]);
92     ztmp=un*a;
93     xyzdv[0]=major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
94     xyzdv[1]=major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
95     xyzdv[2]=major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
96     }
97    
98     void SAT_CONE::deriver_seconde(double *uv,double* xyzduu,double* xyzduv,double* xyzdvv,double *xyz , double *xyzdu, double *xyzdv)
99     {
100     double xtmp,ytmp,ztmp;
101     xtmp=-a*(1.+un*uv[1]*sinalpha/cosalpha)*cos(uv[0]);
102     ytmp=-a*ratio*(1.+un*uv[1]*sinalpha/cosalpha)*sin(uv[0]);
103     ztmp=0.;
104     xyzduu[0]=major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
105     xyzduu[1]=major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
106     xyzduu[2]=major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
107     xtmp=(-a*un*sinalpha/cosalpha*sin(uv[0]));
108     ytmp=a*un*ratio*sinalpha/cosalpha*cos(uv[0]);
109     ztmp=0.;
110     xyzduv[0]=major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
111     xyzduv[1]=major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
112     xyzduv[2]=major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
113     xyzdvv[0]=0.;
114     xyzdvv[1]=0.;
115     xyzdvv[2]=0.;
116     if ((xyzdu!=NULL) && (xyzdv!=NULL ) ) deriver(uv,xyzdu,xyzdv);
117     if (xyz!=NULL) evaluer(uv,xyz);
118     }
119    
120     void SAT_CONE::inverser(double *uv,double *xyz,double precision)
121     {
122     double xtmp,ytmp,ztmp;
123     xtmp=major[0]*(xyz[0]-center[0])+major[1]*(xyz[1]-center[1])+major[2]*(xyz[2]-center[2]);
124     ytmp=minor[0]*(xyz[0]-center[0])+minor[1]*(xyz[1]-center[1])+minor[2]*(xyz[2]-center[2]);
125     ztmp=normal[0]*(xyz[0]-center[0])+normal[1]*(xyz[1]-center[1])+normal[2]*(xyz[2]-center[2]);
126     uv[1]=un*ztmp/a;
127     double cs=xtmp/(a*(1.+un*uv[1]*sinalpha/cosalpha));
128     double sn=ytmp/(a*ratio*(1.+un*uv[1]*sinalpha/cosalpha));
129     if (cs>1) cs=1.;
130     if (cs<(-1)) cs=(-1.);
131     double angle=acos((double)cs);
132     if (sn<(-0.0001)) angle=(-angle);
133     if (angle<0) angle=angle+2*M_PI;
134     uv[0]=angle;
135     }
136    
137     int SAT_CONE::est_periodique_u(void)
138     {
139     return 1;
140     }
141    
142     int SAT_CONE::est_periodique_v(void)
143     {
144     return 0;
145     }
146    
147     double SAT_CONE::get_periode_u(void)
148     {
149     return 2*M_PI;
150     }
151    
152     double SAT_CONE::get_periode_v(void)
153     {
154     return 0.;
155     }
156    
157    
158     double SAT_CONE::get_umin(void)
159     {
160     return 0;
161     }
162    
163     double SAT_CONE::get_umax(void)
164     {
165     return 2*M_PI;
166     }
167    
168     double SAT_CONE::get_vmin(void)
169     {
170     return -1e300;
171     }
172    
173     double SAT_CONE::get_vmax(void)
174     {
175     return 1e300;
176     }
177    
178    
179     int SAT_CONE::get_type_geometrique(TPL_LISTE_ENTITE<double> &param)
180     {
181     param.ajouter(center[0]);
182     param.ajouter(center[1]);
183     param.ajouter(center[2]);
184     param.ajouter(major[0]);
185     param.ajouter(major[1]);
186     param.ajouter(major[2]);
187     param.ajouter(normal[0]);
188     param.ajouter(normal[1]);
189     param.ajouter(normal[2]);
190     param.ajouter(a);
191     param.ajouter(a*ratio);
192 francois 886 if (fabs(sinalpha<0.00000001))
193 francois 1149 return GEOMETRIE::CONST::Co_CYLINDRE;
194 francois 283 param.ajouter(cosalpha);
195     param.ajouter(sinalpha);
196 francois 1149 return GEOMETRIE::CONST::Co_CONE;
197 francois 283 }
198    
199    
200    
201    
202    
203    
204    
205    
206     void SAT_CONE::get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> &param)
207     {
208     double uv[2];
209     double xyz[3];
210    
211     param.ajouter(2);
212    
213    
214    
215    
216     double xtmp,ytmp,ztmp;
217    
218    
219    
220    
221     if (sinalpha==0)
222     {
223    
224     param.ajouter(4);
225     param.ajouter(2);
226    
227    
228     param.ajouter(7);
229     param.ajouter(2);
230    
231    
232     param.ajouter(0);
233     param.ajouter(0);
234     param.ajouter(0);
235     param.ajouter(0.25);
236     param.ajouter(0.5);
237     param.ajouter(0.5);
238     param.ajouter(0.75);
239     param.ajouter(1);
240     param.ajouter(1);
241     param.ajouter(1);
242    
243    
244     param.ajouter(0);
245     param.ajouter(0);
246     param.ajouter(1);
247     param.ajouter(1);
248    
249    
250     for (int j=0;j<2;j++)
251     {
252    
253     double z_inf=10e6;
254     if (j==0)
255     z_inf=-z_inf;
256     if (j==1)
257     z_inf=z_inf;
258    
259    
260    
261     xtmp=a;
262     ytmp=0;
263     ztmp=un*a*z_inf;
264    
265     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
266     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
267     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
268    
269    
270    
271     param.ajouter(xyz[0]);
272     param.ajouter(xyz[1]);
273     param.ajouter(xyz[2]);
274     param.ajouter(1);
275    
276    
277     ytmp=a;
278    
279    
280     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
281     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
282     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
283    
284     param.ajouter(xyz[0]);
285     param.ajouter(xyz[1]);
286     param.ajouter(xyz[2]);
287     param.ajouter(0.5);
288    
289    
290    
291     xtmp=-a;
292    
293     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
294     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
295     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
296    
297     param.ajouter(xyz[0]);
298     param.ajouter(xyz[1]);
299     param.ajouter(xyz[2]);
300     param.ajouter(0.5);
301    
302    
303     ytmp=0;
304    
305    
306     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
307     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
308     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
309    
310     param.ajouter(xyz[0]);
311     param.ajouter(xyz[1]);
312     param.ajouter(xyz[2]);
313     param.ajouter(1);
314    
315    
316    
317    
318     ytmp=-a;
319    
320    
321     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
322     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
323     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
324    
325     param.ajouter(xyz[0]);
326     param.ajouter(xyz[1]);
327     param.ajouter(xyz[2]);
328     param.ajouter(0.5);
329    
330    
331    
332     xtmp=a;
333    
334    
335     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
336     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
337     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
338    
339    
340     param.ajouter(xyz[0]);
341     param.ajouter(xyz[1]);
342     param.ajouter(xyz[2]);
343     param.ajouter(0.5);
344    
345    
346    
347     ytmp=0;
348    
349     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
350     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
351     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
352    
353     param.ajouter(xyz[0]);
354     param.ajouter(xyz[1]);
355     param.ajouter(xyz[2]);
356     param.ajouter(1);
357     }
358    
359     }
360    
361    
362     if (sinalpha!=0)
363     {
364     param.ajouter(2);
365     param.ajouter(4);
366    
367    
368     param.ajouter(2);
369     param.ajouter(7);
370    
371     param.ajouter(0);
372     param.ajouter(0);
373     param.ajouter(1);
374     param.ajouter(1);
375    
376     param.ajouter(0);
377     param.ajouter(0);
378     param.ajouter(0);
379     param.ajouter(0.25);
380     param.ajouter(0.5);
381     param.ajouter(0.5);
382     param.ajouter(0.75);
383     param.ajouter(1);
384     param.ajouter(1);
385     param.ajouter(1);
386    
387    
388    
389     xtmp=0;
390     ytmp=0;
391     double z_sommet_cone= un*a*sinalpha/cosalpha ;
392    
393     double x_som=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*z_sommet_cone;
394     double y_som=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*z_sommet_cone;
395     double z_som=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*z_sommet_cone;
396    
397    
398     ztmp=(10e6-a)/(un*sinalpha/cosalpha);
399     double r= ztmp*(sinalpha/cosalpha);
400    
401    
402     xtmp=r;
403     ytmp=0;
404    
405     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
406     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
407     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
408    
409     param.ajouter(xyz[0]);
410     param.ajouter(xyz[1]);
411     param.ajouter(xyz[2]);
412     param.ajouter(1);
413    
414     param.ajouter(x_som);
415     param.ajouter(y_som);
416     param.ajouter(z_som);
417     param.ajouter(1);
418     ytmp=r;
419    
420     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
421     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
422     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
423    
424     param.ajouter(xyz[0]);
425     param.ajouter(xyz[1]);
426     param.ajouter(xyz[2]);
427     param.ajouter(0.5);
428    
429     param.ajouter(x_som);
430     param.ajouter(y_som);
431     param.ajouter(z_som);
432     param.ajouter(0.5);
433     xtmp=-r;
434    
435     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
436     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
437     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
438    
439     param.ajouter(xyz[0]);
440     param.ajouter(xyz[1]);
441     param.ajouter(xyz[2]);
442    
443     param.ajouter(0.5);
444     param.ajouter(x_som);
445     param.ajouter(y_som);
446     param.ajouter(z_som);
447     param.ajouter(0.5);
448    
449     ytmp=0;
450    
451     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
452     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
453     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
454    
455     param.ajouter(xyz[0]);
456     param.ajouter(xyz[1]);
457     param.ajouter(xyz[2]);
458     param.ajouter(1);
459     param.ajouter(x_som);
460     param.ajouter(y_som);
461     param.ajouter(z_som);
462     param.ajouter(1);
463    
464     ytmp=-r;
465    
466     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
467     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
468     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
469    
470     param.ajouter(xyz[0]);
471     param.ajouter(xyz[1]);
472     param.ajouter(xyz[2]);
473     param.ajouter(0.5);
474     param.ajouter(x_som);
475     param.ajouter(y_som);
476     param.ajouter(z_som);
477     param.ajouter(1);
478     xtmp=r;
479    
480     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
481     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
482     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
483    
484     param.ajouter(xyz[0]);
485     param.ajouter(xyz[1]);
486     param.ajouter(xyz[2]);
487     param.ajouter(0.5);
488     param.ajouter(x_som);
489     param.ajouter(y_som);
490     param.ajouter(z_som);
491     param.ajouter(0.5);
492     ytmp=0;
493    
494     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
495     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
496     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
497    
498     param.ajouter(xyz[0]);
499     param.ajouter(xyz[1]);
500     param.ajouter(xyz[2]);
501     param.ajouter(1);
502     param.ajouter(x_som);
503     param.ajouter(y_som);
504     param.ajouter(z_som);
505     param.ajouter(1);
506    
507    
508     }
509    
510    
511     indx_premier_ptctr=19;
512    
513     }
514    
515