ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/sat/src/sat_cone.cpp
Revision: 283
Committed: Tue Sep 13 21:11:20 2011 UTC (13 years, 8 months ago) by francois
File size: 17535 byte(s)
Log Message:
structure de l'écriture

File Contents

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