ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/sat/src/sat_cone.cpp
Revision: 886
Committed: Fri May 26 23:30:57 2017 UTC (7 years, 11 months ago) by francois
File size: 17595 byte(s)
Log Message:
Divers bug rencontré 
* cylindre cone et tore mal defini dans occ_surface
*parenthese de trop dans les fichiers magic pour les entitées topologiques

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 francois 886 if (fabs(sinalpha<0.00000001))
195     return MGCo_CYLINDRE;
196 francois 283 param.ajouter(cosalpha);
197     param.ajouter(sinalpha);
198     return MGCo_CONE;
199     }
200    
201    
202    
203    
204    
205    
206    
207    
208     void SAT_CONE::get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> &param)
209     {
210     // For a plan the net controls point is
211     double uv[2];
212     double xyz[3];
213    
214     // The first parameter indicate the code access
215     param.ajouter(2);
216     // The follewing two parameters of the list indicate the orders of the net points
217    
218    
219    
220     //this is for the cylindrical control net (alpha=Pi/2)
221    
222     double xtmp,ytmp,ztmp;
223    
224    
225    
226    
227     if (sinalpha==0)
228     {
229    
230     param.ajouter(4);
231     param.ajouter(2);
232    
233     // The follewing two parameters indicate the number of rows and colons of the control points
234     // respectively to the two parameters directions
235    
236     param.ajouter(7);
237     param.ajouter(2);
238    
239     // this present the knot vector in the u-direction
240    
241     param.ajouter(0);
242     param.ajouter(0);
243     param.ajouter(0);
244     param.ajouter(0.25);
245     param.ajouter(0.5);
246     param.ajouter(0.5);
247     param.ajouter(0.75);
248     param.ajouter(1);
249     param.ajouter(1);
250     param.ajouter(1);
251    
252     //This present the knot vector in the v-direction
253    
254     param.ajouter(0);
255     param.ajouter(0);
256     param.ajouter(1);
257     param.ajouter(1);
258    
259    
260     for (int j=0;j<2;j++)
261     {
262    
263     double z_inf=10e6;
264     if (j==0)
265     z_inf=-z_inf;
266     if (j==1)
267     z_inf=z_inf;
268    
269     // the first control point have local cordinate (rayon,0)
270    
271    
272     xtmp=a;
273     ytmp=0;
274     ztmp=un*a*z_inf;
275    
276     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
277     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
278     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
279    
280    
281    
282     param.ajouter(xyz[0]);
283     param.ajouter(xyz[1]);
284     param.ajouter(xyz[2]);
285     param.ajouter(1);
286    
287     // The second control point have such local cordinate (rayon,rayon)
288    
289     ytmp=a;
290    
291    
292     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
293     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
294     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
295    
296     param.ajouter(xyz[0]);
297     param.ajouter(xyz[1]);
298     param.ajouter(xyz[2]);
299     param.ajouter(0.5);
300    
301     //the third control point have such local cordinate (-rayon,rayon)
302    
303    
304     xtmp=-a;
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(0.5);
314    
315     //The forth point have the local cordinate at(-rayon,rayon)
316    
317     ytmp=0;
318    
319    
320     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
321     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
322     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
323    
324     param.ajouter(xyz[0]);
325     param.ajouter(xyz[1]);
326     param.ajouter(xyz[2]);
327     param.ajouter(1);
328    
329    
330     //the fifth control point have the corfinate in the local cordinate (-rayon,-rayon)
331    
332    
333     ytmp=-a;
334    
335    
336     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
337     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
338     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
339    
340     param.ajouter(xyz[0]);
341     param.ajouter(xyz[1]);
342     param.ajouter(xyz[2]);
343     param.ajouter(0.5);
344    
345     //The sixth control point have the cordiante in the local coordinate (rayon,-rayon)
346    
347    
348     xtmp=a;
349    
350    
351     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
352     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
353     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
354    
355    
356     param.ajouter(xyz[0]);
357     param.ajouter(xyz[1]);
358     param.ajouter(xyz[2]);
359     param.ajouter(0.5);
360    
361     //The last control point have the same local cordinate with rhe first control point (rayon, 0)
362    
363    
364     ytmp=0;
365    
366     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
367     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
368     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
369    
370     param.ajouter(xyz[0]);
371     param.ajouter(xyz[1]);
372     param.ajouter(xyz[2]);
373     param.ajouter(1);
374     }
375    
376     }
377    
378     //this is for the conical surface control net (alpha!=0)
379    
380     if (sinalpha!=0)
381     {
382     param.ajouter(2);
383     param.ajouter(4);
384    
385     // The follewing two parameters indicate the number of rows and colons of the control points
386     // respectively to the two parameters directions
387    
388     param.ajouter(2);
389     param.ajouter(7);
390    
391     // this present the knot vector in the u-direction
392     param.ajouter(0);
393     param.ajouter(0);
394     param.ajouter(1);
395     param.ajouter(1);
396    
397     //This present the knot vector in the v-direction
398     param.ajouter(0);
399     param.ajouter(0);
400     param.ajouter(0);
401     param.ajouter(0.25);
402     param.ajouter(0.5);
403     param.ajouter(0.5);
404     param.ajouter(0.75);
405     param.ajouter(1);
406     param.ajouter(1);
407     param.ajouter(1);
408    
409    
410     //================================================================
411     //sommmt de la cone
412     //================================================================
413     //the control point at the sommet of the cone
414    
415     xtmp=0;
416     ytmp=0;
417     //double z_sommet_cone= -a/(sinalpha/cosalpha) ;
418     double z_sommet_cone= un*a*sinalpha/cosalpha ;
419    
420     double x_som=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*z_sommet_cone;
421     double y_som=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*z_sommet_cone;
422     double z_som=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*z_sommet_cone;
423    
424     //================================================================
425     //the first control point is placed at the cordinate point (rayon,0)
426     //================================================================
427    
428     //ztmp=(10e6-a)/fabs(sinalpha/cosalpha);
429     ztmp=(10e6-a)/(un*sinalpha/cosalpha);
430     double r= ztmp*(sinalpha/cosalpha);
431    
432    
433     xtmp=r;
434     ytmp=0;
435     //ztmp=un*a*ztmp;
436    
437     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
438     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
439     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
440    
441     param.ajouter(xyz[0]);
442     param.ajouter(xyz[1]);
443     param.ajouter(xyz[2]);
444     param.ajouter(1);
445    
446     //================================================================
447     //sommmt de la cone
448     //================================================================
449     param.ajouter(x_som);
450     param.ajouter(y_som);
451     param.ajouter(z_som);
452     param.ajouter(1);
453     //================================================================
454     // the second control point have such local cordinate (rayon,rayon)
455     //================================================================
456     ytmp=r;
457    
458     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
459     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
460     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
461    
462     param.ajouter(xyz[0]);
463     param.ajouter(xyz[1]);
464     param.ajouter(xyz[2]);
465     param.ajouter(0.5);
466    
467     //================================================================
468     //sommmt de la cone
469     //================================================================
470     param.ajouter(x_som);
471     param.ajouter(y_som);
472     param.ajouter(z_som);
473     param.ajouter(0.5);
474     //================================================================
475     //the third control point have such local cordinate (-rayon,rayon)
476     //================================================================
477     xtmp=-r;
478    
479     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
480     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
481     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
482    
483     param.ajouter(xyz[0]);
484     param.ajouter(xyz[1]);
485     param.ajouter(xyz[2]);
486    
487     param.ajouter(0.5);
488     //================================================================
489     //sommmt de la cone
490     //================================================================
491     param.ajouter(x_som);
492     param.ajouter(y_som);
493     param.ajouter(z_som);
494     param.ajouter(0.5);
495     //================================================================
496     //The forth point have the local cordinate at(-rayon,rayon)
497     //================================================================
498    
499     ytmp=0;
500    
501     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
502     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
503     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
504    
505     param.ajouter(xyz[0]);
506     param.ajouter(xyz[1]);
507     param.ajouter(xyz[2]);
508     param.ajouter(1);
509     //================================================================
510     //sommmt de la cone
511     //================================================================
512     param.ajouter(x_som);
513     param.ajouter(y_som);
514     param.ajouter(z_som);
515     param.ajouter(1);
516     //================================================================
517     //the fifth control point have the corfinate in the local cordinate(-rayon,-rayon)
518     //================================================================
519    
520     ytmp=-r;
521    
522     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
523     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
524     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
525    
526     param.ajouter(xyz[0]);
527     param.ajouter(xyz[1]);
528     param.ajouter(xyz[2]);
529     param.ajouter(0.5);
530     //================================================================
531     //sommmt de la cone
532     //================================================================
533     param.ajouter(x_som);
534     param.ajouter(y_som);
535     param.ajouter(z_som);
536     param.ajouter(1);
537     //================================================================
538     //The sixth control point have the cordiante in the local coordinate (rayon,-rayon)
539     //================================================================
540     xtmp=r;
541    
542     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
543     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
544     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
545    
546     param.ajouter(xyz[0]);
547     param.ajouter(xyz[1]);
548     param.ajouter(xyz[2]);
549     param.ajouter(0.5);
550     //================================================================
551     //sommmt de la cone
552     //================================================================
553     param.ajouter(x_som);
554     param.ajouter(y_som);
555     param.ajouter(z_som);
556     param.ajouter(0.5);
557     //================================================================
558     //The last control point have the same local cordinate with rhe first control point (rayon, 0)
559     //================================================================
560     ytmp=0;
561    
562     xyz[0]=center[0]+major[0]*xtmp+minor[0]*ytmp+normal[0]*ztmp;
563     xyz[1]=center[1]+major[1]*xtmp+minor[1]*ytmp+normal[1]*ztmp;
564     xyz[2]=center[2]+major[2]*xtmp+minor[2]*ytmp+normal[2]*ztmp;
565    
566     param.ajouter(xyz[0]);
567     param.ajouter(xyz[1]);
568     param.ajouter(xyz[2]);
569     param.ajouter(1);
570     //================================================================
571     //sommmt de la cone
572     //================================================================
573     param.ajouter(x_som);
574     param.ajouter(y_som);
575     param.ajouter(z_som);
576     param.ajouter(1);
577     //================================================================
578    
579    
580     }
581    
582    
583     indx_premier_ptctr=19;
584    
585     }
586    
587