ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/sat/src/sat_cone.cpp
Revision: 81
Committed: Thu Apr 10 15:20:04 2008 UTC (17 years, 1 month ago) by souaissa
Original Path: magic/lib/sat/sat/src/sat_cone.cpp
File size: 15857 byte(s)
Log Message:

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuillière et Vincent FRANCOIS
5     // Département de Génie Mécanique - UQTR
6     //------------------------------------------------------------
7     // 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     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // sat_cone.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 à 11H24
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include <math.h>
27     #include "constantegeo.h"
28     #include "sat_cone.h"
29    
30     #include "ot_mathematique.h"
31    
32    
33     SAT_CONE::SAT_CONE(unsigned long num):SAT_SURFACE(num)
34     {
35     }
36    
37     SAT_CONE::SAT_CONE():SAT_SURFACE()
38     {
39     }
40    
41     SAT_CONE::~SAT_CONE()
42     {
43     }
44    
45    
46     void SAT_CONE::calcule_parametre(void)
47     {
48     a=sqrt(major[0]*major[0]+major[1]*major[1]+major[2]*major[2]);
49     OT_VECTEUR_3D u(major);
50     OT_VECTEUR_3D w(normal);
51     OT_VECTEUR_3D v=w&u;
52     minor[0]=v.get_x();
53     minor[1]=v.get_y();
54     minor[2]=v.get_z();
55     u.norme();
56     w.norme();
57     v.norme();
58     major[0]=u.get_x();
59     major[1]=u.get_y();
60     major[2]=u.get_z();
61     minor[0]=v.get_x();
62     minor[1]=v.get_y();
63     minor[2]=v.get_z();
64     normal[0]=w.get_x();
65     normal[1]=w.get_y();
66     normal[2]=w.get_z();
67     if (cosalpha<0.) un=-1.0; else un=1.0;
68     }
69    
70    
71     void SAT_CONE::evaluer(double *uv,double *xyz)
72     {
73     double xtmp,ytmp,ztmp;
74     xtmp=a*(1.+un*uv[1]*sinalpha/cosalpha)*cos(uv[0]);
75     ytmp=a*ratio*(1.+un*uv[1]*sinalpha/cosalpha)*sin(uv[0]);
76     ztmp=un*a*uv[1];
77     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
78     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
79     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
80     }
81    
82     void SAT_CONE::deriver(double *uv,double *xyzdu, double *xyzdv)
83     {
84     double xtmp,ytmp,ztmp;
85     xtmp=-a*(1.+un*uv[1]*sinalpha/cosalpha)*sin(uv[0]);
86     ytmp=a*ratio*(1.+un*uv[1]*sinalpha/cosalpha)*cos(uv[0]);
87     ztmp=0.;
88     xyzdu[0]=major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
89     xyzdu[1]=major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
90     xyzdu[2]=major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
91     xtmp=un*a*sinalpha/cosalpha*cos(uv[0]);
92     ytmp=un*a*ratio*sinalpha/cosalpha*sin(uv[0]);
93     ztmp=un*a;
94     xyzdv[0]=major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
95     xyzdv[1]=major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
96     xyzdv[2]=major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
97     }
98    
99     void SAT_CONE::deriver_seconde(double *uv,double* xyzduu,double* xyzduv,double* xyzdvv,double *xyz , double *xyzdu, double *xyzdv)
100     {
101     double xtmp,ytmp,ztmp;
102     xtmp=-a*(1.+un*uv[1]*sinalpha/cosalpha)*cos(uv[0]);
103     ytmp=-a*ratio*(1.+un*uv[1]*sinalpha/cosalpha)*sin(uv[0]);
104     ztmp=0.;
105     xyzduu[0]=major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
106     xyzduu[1]=major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
107     xyzduu[2]=major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
108     xtmp=(-a*un*sinalpha/cosalpha*sin(uv[0]));
109     ytmp=a*un*ratio*sinalpha/cosalpha*cos(uv[0]);
110     ztmp=0.;
111     xyzduv[0]=major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
112     xyzduv[1]=major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
113     xyzduv[2]=major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
114     xyzdvv[0]=0.;
115     xyzdvv[1]=0.;
116     xyzdvv[2]=0.;
117     if ((xyzdu!=NULL) && (xyzdv!=NULL ) ) deriver(uv,xyzdu,xyzdv);
118     if (xyz!=NULL) evaluer(uv,xyz);
119     }
120    
121     void SAT_CONE::inverser(double *uv,double *xyz,double precision)
122     {
123     double xtmp,ytmp,ztmp;
124     xtmp=major[0]*(xyz[0]-center[0])+major[1]*(xyz[1]-center[1])+major[2]*(xyz[2]-center[2]);
125     ytmp=minor[0]*(xyz[0]-center[0])+minor[1]*(xyz[1]-center[1])+minor[2]*(xyz[2]-center[2]);
126     ztmp=normal[0]*(xyz[0]-center[0])+normal[1]*(xyz[1]-center[1])+normal[2]*(xyz[2]-center[2]);
127     uv[1]=un*ztmp/a;
128     double cs=xtmp/(a*(1.+un*uv[1]*sinalpha/cosalpha));
129     double sn=ytmp/(a*ratio*(1.+un*uv[1]*sinalpha/cosalpha));
130     if (cs>1) cs=1.;
131     if (cs<(-1)) cs=(-1.);
132     double angle=acos((double)cs);
133     if (sn<(-0.0001)) angle=(-angle);
134     if (angle<0) angle=angle+2*M_PI;
135     uv[0]=angle;
136     }
137    
138     int SAT_CONE::est_periodique_u(void)
139     {
140     return 1;
141     }
142    
143     int SAT_CONE::est_periodique_v(void)
144     {
145     return 0;
146     }
147    
148     double SAT_CONE::get_periode_u(void)
149     {
150     return 2*M_PI;
151     }
152    
153     double SAT_CONE::get_periode_v(void)
154     {
155     return 0.;
156     }
157    
158    
159     double SAT_CONE::get_umin(void)
160     {
161     return 0;
162     }
163    
164     double SAT_CONE::get_umax(void)
165     {
166     return 2*M_PI;
167     }
168    
169     double SAT_CONE::get_vmin(void)
170     {
171     return -1e300;
172     }
173    
174     double SAT_CONE::get_vmax(void)
175     {
176     return 1e300;
177     }
178    
179    
180     int SAT_CONE::get_type_geometrique(TPL_LISTE_ENTITE<double> &param)
181     {
182     param.ajouter(center[0]);
183     param.ajouter(center[1]);
184     param.ajouter(center[2]);
185     param.ajouter(major[0]);
186     param.ajouter(major[1]);
187     param.ajouter(major[2]);
188     param.ajouter(normal[0]);
189     param.ajouter(normal[1]);
190     param.ajouter(normal[2]);
191     param.ajouter(a);
192     param.ajouter(a*ratio);
193     param.ajouter(cosalpha);
194     param.ajouter(sinalpha);
195     return MGCo_CONE;
196     }
197    
198    
199    
200    
201    
202    
203    
204    
205 francois 19 void SAT_CONE::get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> &param)
206 5 {
207     // For a plan the net controls point is
208     double uv[2];
209     double xyz[3];
210    
211     // The first parameter indicate the code access
212     param.ajouter(2);
213     // The follewing two parameters of the list indicate the orders of the net points
214    
215    
216    
217     //this is for the cylindrical control net (alpha=Pi/2)
218    
219     double xtmp,ytmp,ztmp;
220    
221    
222    
223    
224 souaissa 81 if(sinalpha==0)
225 5 {
226    
227     param.ajouter(4);
228     param.ajouter(2);
229    
230     // The follewing two parameters indicate the number of rows and colons of the control points
231     // respectively to the two parameters directions
232    
233     param.ajouter(7);
234     param.ajouter(2);
235    
236     // this present the knot vector in the u-direction
237    
238     param.ajouter(0);
239     param.ajouter(0);
240     param.ajouter(0);
241     param.ajouter(0.25);
242     param.ajouter(0.5);
243     param.ajouter(0.5);
244     param.ajouter(0.75);
245     param.ajouter(1);
246     param.ajouter(1);
247     param.ajouter(1);
248    
249     //This present the knot vector in the v-direction
250    
251     param.ajouter(0);
252     param.ajouter(0);
253     param.ajouter(1);
254     param.ajouter(1);
255    
256    
257     for(int j=0;j<2;j++)
258     {
259    
260     double z_inf=10e6;
261     if (j==0)
262     z_inf=-z_inf;
263     if(j==1)
264     z_inf=z_inf;
265    
266     // the first control point have local cordinate (rayon,0)
267    
268    
269     xtmp=a;
270     ytmp=0;
271     ztmp=un*a*z_inf;
272    
273     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
274     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
275     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
276    
277    
278    
279     param.ajouter(xyz[0]);
280     param.ajouter(xyz[1]);
281     param.ajouter(xyz[2]);
282     param.ajouter(1);
283    
284     // The second control point have such local cordinate (rayon,rayon)
285    
286     ytmp=a;
287    
288    
289     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
290     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
291     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
292    
293     param.ajouter(xyz[0]);
294     param.ajouter(xyz[1]);
295     param.ajouter(xyz[2]);
296     param.ajouter(0.5);
297    
298     //the third control point have such local cordinate (-rayon,rayon)
299    
300    
301     xtmp=-a;
302    
303     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
304     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
305     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
306    
307     param.ajouter(xyz[0]);
308     param.ajouter(xyz[1]);
309     param.ajouter(xyz[2]);
310     param.ajouter(0.5);
311    
312     //The forth point have the local cordinate at(-rayon,rayon)
313    
314     ytmp=0;
315    
316    
317     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
318     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
319     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
320    
321     param.ajouter(xyz[0]);
322     param.ajouter(xyz[1]);
323     param.ajouter(xyz[2]);
324     param.ajouter(1);
325    
326    
327     //the fifth control point have the corfinate in the local cordinate (-rayon,-rayon)
328    
329    
330     ytmp=-a;
331    
332    
333     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
334     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
335     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
336    
337     param.ajouter(xyz[0]);
338     param.ajouter(xyz[1]);
339     param.ajouter(xyz[2]);
340     param.ajouter(0.5);
341    
342     //The sixth control point have the cordiante in the local coordinate (rayon,-rayon)
343    
344    
345     xtmp=a;
346    
347    
348     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
349     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
350     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
351    
352    
353     param.ajouter(xyz[0]);
354     param.ajouter(xyz[1]);
355     param.ajouter(xyz[2]);
356     param.ajouter(0.5);
357    
358     //The last control point have the same local cordinate with rhe first control point (rayon, 0)
359    
360    
361     ytmp=0;
362    
363     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
364     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
365     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
366    
367     param.ajouter(xyz[0]);
368     param.ajouter(xyz[1]);
369     param.ajouter(xyz[2]);
370     param.ajouter(1);
371     }
372    
373     }
374    
375     //this is for the conical surface control net (alpha!=0)
376    
377 souaissa 81 if (sinalpha!=0)
378 5 {
379     param.ajouter(2);
380     param.ajouter(4);
381    
382     // The follewing two parameters indicate the number of rows and colons of the control points
383     // respectively to the two parameters directions
384    
385     param.ajouter(2);
386     param.ajouter(7);
387    
388     // this present the knot vector in the u-direction
389 francois 19 param.ajouter(0);
390     param.ajouter(0);
391     param.ajouter(1);
392     param.ajouter(1);
393 5
394 francois 19 //This present the knot vector in the v-direction
395 5 param.ajouter(0);
396     param.ajouter(0);
397     param.ajouter(0);
398     param.ajouter(0.25);
399     param.ajouter(0.5);
400     param.ajouter(0.5);
401     param.ajouter(0.75);
402     param.ajouter(1);
403     param.ajouter(1);
404     param.ajouter(1);
405    
406    
407     //================================================================
408     //sommmt de la cone
409     //================================================================
410     //the control point at the sommet of the cone
411    
412     xtmp=0;
413     ytmp=0;
414 souaissa 81 //double z_sommet_cone= -a/(sinalpha/cosalpha) ;
415     double z_sommet_cone= un*a*sinalpha/cosalpha ;
416 5
417     double x_som=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*z_sommet_cone;
418     double y_som=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*z_sommet_cone;
419     double z_som=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*z_sommet_cone;
420    
421     //================================================================
422     //the first control point is placed at the cordinate point (rayon,0)
423     //================================================================
424    
425 souaissa 81 //ztmp=(10e6-a)/fabs(sinalpha/cosalpha);
426     ztmp=(10e6-a)/(un*sinalpha/cosalpha);
427 5 double r= ztmp*(sinalpha/cosalpha);
428    
429    
430     xtmp=r;
431     ytmp=0;
432 souaissa 81 //ztmp=un*a*ztmp;
433 5
434     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
435     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
436     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
437    
438     param.ajouter(xyz[0]);
439     param.ajouter(xyz[1]);
440     param.ajouter(xyz[2]);
441     param.ajouter(1);
442    
443     //================================================================
444     //sommmt de la cone
445     //================================================================
446     param.ajouter(x_som);
447     param.ajouter(y_som);
448     param.ajouter(z_som);
449     param.ajouter(1);
450     //================================================================
451     // the second control point have such local cordinate (rayon,rayon)
452     //================================================================
453     ytmp=r;
454    
455     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
456     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
457     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
458    
459     param.ajouter(xyz[0]);
460     param.ajouter(xyz[1]);
461     param.ajouter(xyz[2]);
462     param.ajouter(0.5);
463    
464     //================================================================
465     //sommmt de la cone
466     //================================================================
467     param.ajouter(x_som);
468     param.ajouter(y_som);
469     param.ajouter(z_som);
470     param.ajouter(0.5);
471     //================================================================
472     //the third control point have such local cordinate (-rayon,rayon)
473     //================================================================
474     xtmp=-r;
475    
476     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
477     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
478     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
479    
480     param.ajouter(xyz[0]);
481     param.ajouter(xyz[1]);
482     param.ajouter(xyz[2]);
483    
484     param.ajouter(0.5);
485     //================================================================
486     //sommmt de la cone
487     //================================================================
488     param.ajouter(x_som);
489     param.ajouter(y_som);
490     param.ajouter(z_som);
491     param.ajouter(0.5);
492     //================================================================
493     //The forth point have the local cordinate at(-rayon,rayon)
494     //================================================================
495    
496     ytmp=0;
497    
498     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
499     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
500     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
501    
502     param.ajouter(xyz[0]);
503     param.ajouter(xyz[1]);
504     param.ajouter(xyz[2]);
505     param.ajouter(1);
506     //================================================================
507     //sommmt de la cone
508     //================================================================
509     param.ajouter(x_som);
510     param.ajouter(y_som);
511     param.ajouter(z_som);
512     param.ajouter(1);
513     //================================================================
514 souaissa 81 //the fifth control point have the corfinate in the local cordinate(-rayon,-rayon)
515 5 //================================================================
516    
517     ytmp=-r;
518    
519     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
520     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
521     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
522    
523     param.ajouter(xyz[0]);
524     param.ajouter(xyz[1]);
525     param.ajouter(xyz[2]);
526     param.ajouter(0.5);
527     //================================================================
528     //sommmt de la cone
529     //================================================================
530     param.ajouter(x_som);
531     param.ajouter(y_som);
532     param.ajouter(z_som);
533     param.ajouter(1);
534     //================================================================
535     //The sixth control point have the cordiante in the local coordinate (rayon,-rayon)
536     //================================================================
537     xtmp=r;
538    
539     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
540     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
541     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
542    
543     param.ajouter(xyz[0]);
544     param.ajouter(xyz[1]);
545     param.ajouter(xyz[2]);
546     param.ajouter(0.5);
547     //================================================================
548     //sommmt de la cone
549     //================================================================
550     param.ajouter(x_som);
551     param.ajouter(y_som);
552     param.ajouter(z_som);
553     param.ajouter(0.5);
554     //================================================================
555     //The last control point have the same local cordinate with rhe first control point (rayon, 0)
556     //================================================================
557     ytmp=0;
558    
559     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
560     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
561     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
562    
563     param.ajouter(xyz[0]);
564     param.ajouter(xyz[1]);
565     param.ajouter(xyz[2]);
566     param.ajouter(1);
567     //================================================================
568     //sommmt de la cone
569     //================================================================
570     param.ajouter(x_som);
571     param.ajouter(y_som);
572     param.ajouter(z_som);
573     param.ajouter(1);
574     //================================================================
575    
576    
577     }
578    
579    
580 francois 19 indx_premier_ptctr=19;
581 5
582     }
583    
584