ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/step/src/stplane.cpp
Revision: 283
Committed: Tue Sep 13 21:11:20 2011 UTC (13 years, 8 months ago) by francois
File size: 7763 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     // stplane.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H24
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26    
27     #include <stdlib.h>
28     #include <math.h>
29     #include "st_ident.h"
30     #include "stplane.h"
31     #include "st_gestionnaire.h"
32     #include "stdirection.h"
33     #include "st_point.h"
34     #include "constantegeo.h"
35    
36    
37    
38    
39     ST_PLANE::ST_PLANE(long LigneCourante,std::string idori,long axis2_placement_3d):ST_SURFACE(LigneCourante,idori), id_axis2_placement_3d(axis2_placement_3d)
40     {
41     }
42    
43     ST_PLANE::ST_PLANE(double *xyz,double *direction):ST_SURFACE()
44     {
45     initialiser(xyz,direction);
46     }
47    
48     long ST_PLANE::get_id_axis2_placement_3d(void)
49     {
50     return id_axis2_placement_3d;
51     }
52    
53     void ST_PLANE::calcul_parametre(void)
54     {
55     OT_VECTEUR_3D vec_normal(normal);
56     vec_normal.norme();
57     if (!(OPERATEUR::egal(vec_normal.get_x(),0.,0.000001)))
58     {
59     dir1[0]=vec_normal.get_y();
60     dir1[1]=(-vec_normal.get_x());
61     dir1[2]=0.;
62     }
63     else if (!(OPERATEUR::egal(vec_normal.get_y(),0.,0.000001)))
64     {
65     dir1[0]=0.;
66     dir1[1]=(-vec_normal.get_z());
67     dir1[2]=vec_normal.get_y();
68     }
69     else
70     {
71     dir1[0]=vec_normal.get_z();
72     dir1[1]=0.;
73     dir1[2]=0.;
74     }
75     OT_VECTEUR_3D vec_dir1(dir1);
76     vec_dir1.norme();
77     OT_VECTEUR_3D vec_dir2=vec_normal&vec_dir1;
78     dir2[0]=vec_dir2.get_x();
79     dir2[1]=vec_dir2.get_y();
80     dir2[2]=vec_dir2.get_z();
81     }
82    
83     void ST_PLANE::evaluer(double *uv,double *xyz)
84     {
85     xyz[0]=origine.get_x()+uv[0]*dir1[0]+uv[1]*dir2[0];
86     xyz[1]=origine.get_y()+uv[0]*dir1[1]+uv[1]*dir2[1];
87     xyz[2]=origine.get_z()+uv[0]*dir1[2]+uv[1]*dir2[2];
88     }
89     void ST_PLANE::deriver(double *uv,double *xyzdu, double *xyzdv)
90     {
91     xyzdu[0]=dir1[0];
92     xyzdu[1]=dir1[1];
93     xyzdu[2]=dir1[2];
94     xyzdv[0]=dir2[0];
95     xyzdv[1]=dir2[1];
96     xyzdv[2]=dir2[2];
97     }
98     void ST_PLANE::deriver_seconde(double *uv,double* xyzduu,double* xyzduv,double* xyzdvv,double *xyz , double *xyzdu , double *xyzdv )
99     {
100     xyzduu[0]=0.;
101     xyzduu[1]=0.;
102     xyzduu[2]=0.;
103     xyzduv[0]=0.;
104     xyzduv[1]=0.;
105     xyzduv[2]=0.;
106     xyzdvv[0]=0.;
107     xyzdvv[1]=0.;
108     xyzdvv[2]=0.;
109     evaluer(uv,xyz);
110     deriver(uv,xyzdu,xyzdv);
111     }
112     void ST_PLANE::inverser(double *uv,double *xyz,double precision)
113     {
114     double coord[3];
115     int n1,n2;
116     coord[0]=xyz[0]-origine.get_x();
117     coord[1]=xyz[1]-origine.get_y();
118     coord[2]=xyz[2]-origine.get_z();;
119     double det=dir1[0]*dir2[1]-dir1[1]*dir2[0];
120     if (!(OPERATEUR::egal(det,0.0,0.0001)))
121     {
122     n1=0;
123     n2=1;
124     }
125     else
126     {
127     det=dir1[0]*dir2[2]-dir1[2]*dir2[0];
128     if (!(OPERATEUR::egal(det,0.0,0.0001)))
129     {
130     n1=0;
131     n2=2;
132     }
133     else
134     {
135     n1=1;
136     n2=2;
137     det=dir1[1]*dir2[2]-dir1[2]*dir2[1];
138     }
139     }
140     uv[0]=(coord[n1]*dir2[n2]-coord[n2]*dir2[n1])/det;
141     uv[1]=(dir1[n1]*coord[n2]-dir1[n2]*coord[n1])/det;
142    
143     }
144     int ST_PLANE::est_periodique_u(void)
145     {
146     return 0;
147     }
148     int ST_PLANE::est_periodique_v(void)
149     {
150     return 0;
151     }
152     double ST_PLANE::get_periode_u(void)
153     {
154     return 0.;
155     }
156     double ST_PLANE::get_periode_v(void)
157     {
158     return 0.;
159     }
160     double ST_PLANE::get_umin(void)
161     {
162     return -1e300;
163     }
164     double ST_PLANE::get_umax(void)
165     {
166     return 1e300;
167     }
168     double ST_PLANE::get_vmin(void)
169     {
170     return -1e300;
171     }
172     double ST_PLANE::get_vmax(void)
173     {
174     return 1e300;
175     }
176     void ST_PLANE::initialiser(ST_GESTIONNAIRE *gest)
177     {
178     ST_AXIS2_PLACEMENT_3D* axe=gest->lst_axis2_placement_3d.getid(id_axis2_placement_3d);
179     ST_DIRECTION* dirz=gest->lst_direction.getid(axe->get_id_direction1());
180     ST_POINT* point=gest->lst_point.getid(axe->get_id_point());
181     double xyz[3];
182     point->evaluer(xyz);
183     double *direct=dirz->get_direction();
184     initialiser(xyz,direct);
185     }
186    
187     void ST_PLANE::initialiser(double *point, double *dirnorm)
188     {
189     origine.change_x(point[0]);
190     origine.change_y(point[1]);
191     origine.change_z(point[2]);
192     normal[0]=dirnorm[0];
193     normal[1]=dirnorm[1];
194     normal[2]=dirnorm[2];
195     calcul_parametre();
196     }
197    
198    
199    
200     int ST_PLANE::get_type_geometrique(TPL_LISTE_ENTITE<double> &param)
201     {
202     param.ajouter(origine.get_x());
203     param.ajouter(origine.get_y());
204     param.ajouter(origine.get_z());
205     param.ajouter(normal[0]);
206     param.ajouter(normal[1]);
207     param.ajouter(normal[2]);
208     return MGCo_PLAN;
209     }
210    
211    
212     void ST_PLANE::est_util(ST_GESTIONNAIRE* gest)
213     {
214     util=true;
215     gest->lst_axis2_placement_3d.getid(id_axis2_placement_3d)->est_util(gest);
216     }
217    
218    
219     void ST_PLANE::get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> &param)
220     {
221    
222     // For a plan the net controls point is
223     double uv[2];
224     double xyz[3];
225    
226     // The first parameter indicate the code access
227     param.ajouter(2);
228     // The follewing two parameters of the list indicate the orders of the net points
229    
230     param.ajouter(2);
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(2);
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(1);
244     param.ajouter(1);
245    
246     // this present the knot vector in the v-direction
247    
248     param.ajouter(0);
249     param.ajouter(0);
250     param.ajouter(1);
251     param.ajouter(1);
252    
253     // note that the cordinate of the control points are given in the homogeneous cordinates
254    
255    
256     double inf_val=10e6;
257    
258     // this is the firt control point with cordinate (+inf,+inf)
259    
260     xyz[0]=origine.get_x()+inf_val*dir1[0]+inf_val*dir2[0];
261     xyz[1]=origine.get_y()+inf_val*dir1[1]+inf_val*dir2[1];
262     xyz[2]=origine.get_z()+inf_val*dir1[2]+inf_val*dir2[2];
263    
264     param.ajouter(xyz[0]);
265     param.ajouter(xyz[1]);
266     param.ajouter(xyz[2]);
267     param.ajouter(1);
268    
269    
270     // this is the second control point with cordinate (-inf,+inf)
271    
272     xyz[0]=origine.get_x()-inf_val*dir1[0]+inf_val*dir2[0];
273     xyz[1]=origine.get_y()-inf_val*dir1[1]+inf_val*dir2[1];
274     xyz[2]=origine.get_z()-inf_val*dir1[2]+inf_val*dir2[2];
275    
276     param.ajouter(xyz[0]);
277     param.ajouter(xyz[1]);
278     param.ajouter(xyz[2]);
279     param.ajouter(1);
280    
281     // this is the third control point with cordinate (-inf,-inf)
282    
283     xyz[0]=origine.get_x()+inf_val*dir1[0]-inf_val*dir2[0];
284     xyz[1]=origine.get_y()+inf_val*dir1[1]-inf_val*dir2[1];
285     xyz[2]=origine.get_z()+inf_val*dir1[2]-inf_val*dir2[2];
286    
287     param.ajouter(xyz[0]);
288     param.ajouter(xyz[1]);
289     param.ajouter(xyz[2]);
290     param.ajouter(1);
291    
292     // this is the second control point with cordinate (inf,-inf)
293    
294    
295     xyz[0]=origine.get_x()-inf_val*dir1[0]-inf_val*dir2[0];
296     xyz[1]=origine.get_y()-inf_val*dir1[1]-inf_val*dir2[1];
297     xyz[2]=origine.get_z()-inf_val*dir1[2]-inf_val*dir2[2];
298    
299     param.ajouter(xyz[0]);
300     param.ajouter(xyz[1]);
301     param.ajouter(xyz[2]);
302     param.ajouter(1);
303    
304    
305     indx_premier_ptctr=13;
306    
307     }