ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/sat/src/sat_cone.cpp
Revision: 19
Committed: Wed Jun 20 17:47:45 2007 UTC (17 years, 10 months ago) by francois
Original Path: magic/lib/sat/sat/src/sat_cone.cpp
File size: 15765 byte(s)
Log Message:
ajout d'un index dans les param NURBS

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     if(cosalpha==0)
225     {
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     if (cosalpha!=0)
378     {
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     double z_sommet_cone= -a/(sinalpha/cosalpha) ;
415    
416     double x_som=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*z_sommet_cone;
417     double y_som=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*z_sommet_cone;
418     double z_som=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*z_sommet_cone;
419    
420     //================================================================
421     //the first control point is placed at the cordinate point (rayon,0)
422     //================================================================
423    
424     ztmp=(10e6-a)/fabs(sinalpha/cosalpha);
425     double r= ztmp*(sinalpha/cosalpha);
426    
427    
428     xtmp=r;
429     ytmp=0;
430     ztmp=un*a*ztmp;
431    
432     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
433     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
434     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
435    
436     param.ajouter(xyz[0]);
437     param.ajouter(xyz[1]);
438     param.ajouter(xyz[2]);
439     param.ajouter(1);
440    
441     //================================================================
442     //sommmt de la cone
443     //================================================================
444     param.ajouter(x_som);
445     param.ajouter(y_som);
446     param.ajouter(z_som);
447     param.ajouter(1);
448     //================================================================
449     // the second control point have such local cordinate (rayon,rayon)
450     //================================================================
451     ytmp=r;
452    
453     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
454     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
455     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
456    
457     param.ajouter(xyz[0]);
458     param.ajouter(xyz[1]);
459     param.ajouter(xyz[2]);
460     param.ajouter(0.5);
461    
462     //================================================================
463     //sommmt de la cone
464     //================================================================
465     param.ajouter(x_som);
466     param.ajouter(y_som);
467     param.ajouter(z_som);
468     param.ajouter(0.5);
469     //================================================================
470     //the third control point have such local cordinate (-rayon,rayon)
471     //================================================================
472     xtmp=-r;
473    
474     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
475     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
476     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
477    
478     param.ajouter(xyz[0]);
479     param.ajouter(xyz[1]);
480     param.ajouter(xyz[2]);
481    
482     param.ajouter(0.5);
483     //================================================================
484     //sommmt de la cone
485     //================================================================
486     param.ajouter(x_som);
487     param.ajouter(y_som);
488     param.ajouter(z_som);
489     param.ajouter(0.5);
490     //================================================================
491     //The forth point have the local cordinate at(-rayon,rayon)
492     //================================================================
493    
494     ytmp=0;
495    
496     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
497     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
498     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
499    
500     param.ajouter(xyz[0]);
501     param.ajouter(xyz[1]);
502     param.ajouter(xyz[2]);
503     param.ajouter(1);
504     //================================================================
505     //sommmt de la cone
506     //================================================================
507     param.ajouter(x_som);
508     param.ajouter(y_som);
509     param.ajouter(z_som);
510     param.ajouter(1);
511     //================================================================
512     //the fifth control point have the corfinate in the local cordinate (-rayon,-rayon)
513     //================================================================
514    
515     ytmp=-r;
516    
517     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
518     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
519     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
520    
521     param.ajouter(xyz[0]);
522     param.ajouter(xyz[1]);
523     param.ajouter(xyz[2]);
524     param.ajouter(0.5);
525     //================================================================
526     //sommmt de la cone
527     //================================================================
528     param.ajouter(x_som);
529     param.ajouter(y_som);
530     param.ajouter(z_som);
531     param.ajouter(1);
532     //================================================================
533     //The sixth control point have the cordiante in the local coordinate (rayon,-rayon)
534     //================================================================
535     xtmp=r;
536    
537     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
538     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
539     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
540    
541     param.ajouter(xyz[0]);
542     param.ajouter(xyz[1]);
543     param.ajouter(xyz[2]);
544     param.ajouter(0.5);
545     //================================================================
546     //sommmt de la cone
547     //================================================================
548     param.ajouter(x_som);
549     param.ajouter(y_som);
550     param.ajouter(z_som);
551     param.ajouter(0.5);
552     //================================================================
553     //The last control point have the same local cordinate with rhe first control point (rayon, 0)
554     //================================================================
555     ytmp=0;
556    
557     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
558     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
559     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
560    
561     param.ajouter(xyz[0]);
562     param.ajouter(xyz[1]);
563     param.ajouter(xyz[2]);
564     param.ajouter(1);
565     //================================================================
566     //sommmt de la cone
567     //================================================================
568     param.ajouter(x_som);
569     param.ajouter(y_som);
570     param.ajouter(z_som);
571     param.ajouter(1);
572     //================================================================
573    
574    
575     }
576    
577    
578 francois 19 indx_premier_ptctr=19;
579 5
580     }
581    
582