ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_boucle.cpp
Revision: 906
Committed: Mon Nov 13 22:30:18 2017 UTC (7 years, 6 months ago) by couturad
File size: 14163 byte(s)
Log Message:
Nouveau opencascade commit 1

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     // mg_boucle.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include "mg_boucle.h"
27     #include "ot_mathematique.h"
28 francois 375 #include "mg_definition.h"
29 francois 283 #include <math.h>
30     //#include "message.h"
31    
32     MG_BOUCLE::MG_BOUCLE(unsigned long num,class MG_FACE* mgface):MG_ELEMENT_COTOPOLOGIQUE(num),face(mgface),poutre(NULL)
33     {
34     }
35    
36    
37     MG_BOUCLE::MG_BOUCLE(class MG_FACE* mgface):MG_ELEMENT_COTOPOLOGIQUE(),face(mgface),poutre(NULL)
38     {
39     }
40    
41     MG_BOUCLE::MG_BOUCLE(unsigned long num,class MG_POUTRE* mgpou):MG_ELEMENT_COTOPOLOGIQUE(num),face(NULL),poutre(mgpou)
42     {
43     }
44    
45    
46     MG_BOUCLE::MG_BOUCLE(class MG_POUTRE* mgpou):MG_ELEMENT_COTOPOLOGIQUE(),face(NULL),poutre(mgpou)
47     {
48     }
49    
50 couturad 906 MG_BOUCLE::MG_BOUCLE(long unsigned int num): MG_ELEMENT_COTOPOLOGIQUE(num),face(NULL),poutre(NULL)
51     {
52 francois 283
53 couturad 906 }
54    
55     MG_BOUCLE::MG_BOUCLE():MG_ELEMENT_COTOPOLOGIQUE(),face(NULL),poutre(NULL)
56     {
57    
58     }
59    
60 francois 283 MG_BOUCLE::MG_BOUCLE(MG_BOUCLE& mdd):MG_ELEMENT_COTOPOLOGIQUE(),face(mdd.face),lst_coarete(mdd.lst_coarete)
61     {
62     }
63    
64    
65     MG_BOUCLE::~MG_BOUCLE()
66     {
67     }
68    
69 couturad 906 int MG_BOUCLE::get_type(void)
70     {
71     return TYPE_ELEMENT_COTOPOLOGIQUE::BOUCLE;
72     }
73 francois 283
74 couturad 906
75 francois 283 void MG_BOUCLE::ajouter_mg_coarete(class MG_COARETE* mgcoarete)
76     {
77     lst_coarete.insert(lst_coarete.end(),mgcoarete);
78     }
79    
80     int MG_BOUCLE::get_nb_mg_coarete(void)
81     {
82     return lst_coarete.size();
83     }
84    
85    
86     MG_COARETE* MG_BOUCLE::get_mg_coarete(int num)
87     {
88     return lst_coarete[num];
89     }
90    
91     void MG_BOUCLE::supprimer_mg_coarete(class MG_COARETE* mgcoarete)
92     {
93     std::vector<MG_COARETE*>::iterator i;
94     for (i=lst_coarete.begin();i!=lst_coarete.end();i++)
95     {
96     if ((*i)==mgcoarete)
97     {
98     lst_coarete.erase(i);
99     return;
100     }
101     }
102     }
103    
104     MG_FACE* MG_BOUCLE::get_mg_face(void)
105     {
106     return face;
107     }
108    
109     MG_COARETE* MG_BOUCLE::get_mg_coarete_suivante(MG_COARETE* coare)
110     {
111     MG_COARETE* coaretesuivante=NULL;
112     MG_SOMMET* mgsommet;
113     if (coare->get_orientation()==MEME_SENS) mgsommet=coare->get_arete()->get_cosommet2()->get_sommet();
114     else mgsommet=coare->get_arete()->get_cosommet1()->get_sommet();
115     double xyz[3];
116     mgsommet->get_point()->evaluer(xyz);
117     int nb=lst_coarete.size();
118     MG_COARETE* mgcoaretetmp=NULL;
119     double angleref=0.;
120     double angleref2=0.;
121     int trouve=0;
122     for (int i=0;i<nb;i++)
123     {
124     MG_COARETE* mgcoarete_suivante=lst_coarete[i];
125     MG_SOMMET* mgsommet_suivant;
126     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet1()->get_sommet();
127     else mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet2()->get_sommet();
128     if (mgsommet==mgsommet_suivant)
129     {
130     if (trouve==0)
131     {
132     trouve=1;
133     mgcoaretetmp=mgcoarete_suivante;
134     }
135     else
136     {
137     //angleref
138     double uv[2];
139     face->inverser(uv,xyz);
140     double normal[3];
141     face->calcul_normale_unitaire(uv,normal);
142     double dir1[3];
143     double dir2[3];
144     MG_COSOMMET* mgcosommet;
145     if (coare->get_orientation()==MEME_SENS) mgcosommet=coare->get_arete()->get_cosommet2();
146     else mgcosommet=coare->get_arete()->get_cosommet1();
147     coare->get_arete()->deriver(mgcosommet->get_t(),dir1);
148     if (mgcoaretetmp->get_orientation()==MEME_SENS) mgcosommet=mgcoaretetmp->get_arete()->get_cosommet1();
149     else mgcosommet=mgcoaretetmp->get_arete()->get_cosommet2();
150     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t(),dir2);
151     int sens1=coare->get_orientation();
152     int sens2=mgcoaretetmp->get_orientation();
153     OT_VECTEUR_3D vec1(-dir1[0]*sens1,-dir1[1]*sens1,-dir1[2]*sens1);
154     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
155     vec1.norme();
156     vec2.norme();
157     OT_VECTEUR_3D nor=normal&vec1;
158     double cs=vec1*vec2;
159     double sn=-1*(vec2*nor);
160     angleref=acos(cs);
161     if (sn<0) angleref=-angleref;
162     if (angleref<0) angleref=angleref+2.*M_PI;
163     if (coare->get_arete()==mgcoaretetmp->get_arete()) angleref=2*M_PI;
164     if (angleref<1e-10)
165     {
166     double dt=1e-3*(mgcoaretetmp->get_arete()->get_tmax()-mgcoaretetmp->get_arete()->get_tmin());
167     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
168     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
169     vec2.norme();
170     double cs=vec1*vec2;
171     double sn=-1*(vec2*nor);
172     angleref=acos(cs);
173     if (sn<0) angleref2=-angleref2;
174     if (angleref<0) angleref2=angleref2+2.*M_PI;
175     }
176     //angle
177     if (coare->get_orientation()==MEME_SENS) mgcosommet=coare->get_arete()->get_cosommet2();
178     else mgcosommet=coare->get_arete()->get_cosommet1();
179     coare->get_arete()->deriver(mgcosommet->get_t(),dir1);
180     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet1();
181     else mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet2();
182     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t(),dir2);
183     sens1=coare->get_orientation();
184     sens2=mgcoarete_suivante->get_orientation();
185     vec1.change_x(-dir1[0]*sens1);
186     vec1.change_y(-dir1[1]*sens1);
187     vec1.change_z(-dir1[2]*sens1);
188     vec2.change_x(dir2[0]*sens2);
189     vec2.change_y(dir2[1]*sens2);
190     vec2.change_z(dir2[2]*sens2);
191     vec1.norme();
192     vec2.norme();
193     nor=normal&vec1;
194     cs=vec1*vec2;
195     sn=-1*(vec2*nor);
196     double angle=acos(cs);
197     if (sn<0) angle=-angle;
198     if (angle<0) angle=angle+2.*M_PI;
199     if (coare->get_arete()==mgcoarete_suivante->get_arete()) angle=2*M_PI;
200     if (angle<angleref)
201     {
202     angleref=angle;
203     mgcoaretetmp=mgcoarete_suivante;
204     }
205     else if ((angle<1e-10) && (angleref<1e-10))
206     {
207     double dt=1e-3*(mgcoarete_suivante->get_arete()->get_tmax()-mgcoarete_suivante->get_arete()->get_tmin());
208     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
209     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
210     vec2.norme();
211     double cs=vec1*vec2;
212     double sn=-1*(vec2*nor);
213     angle=acos(cs);
214     if (sn<0) angle=-angle;
215     if (angle<0) angle=angle+2.*M_PI;
216     if (angle<angleref2)
217     mgcoaretetmp=mgcoarete_suivante;
218    
219     }
220    
221     }
222     }
223     }
224     coaretesuivante=mgcoaretetmp;
225     return coaretesuivante;
226     }
227    
228     MG_COARETE* MG_BOUCLE::get_mg_coarete_precedente(MG_COARETE* coare)
229     {
230     MG_COARETE* coareteprecedente=NULL;
231     MG_SOMMET* mgsommet;
232     if (coare->get_orientation()==MEME_SENS) mgsommet=coare->get_arete()->get_cosommet1()->get_sommet();
233     else mgsommet=coare->get_arete()->get_cosommet2()->get_sommet();
234     double xyz[3];
235     mgsommet->get_point()->evaluer(xyz);
236     int nb=lst_coarete.size();
237     MG_COARETE* mgcoaretetmp=NULL;
238     double angleref=0.;
239     double angleref2=0.;
240     int trouve=0;
241     for (int i=0;i<nb;i++)
242     {
243     MG_COARETE* mgcoarete_suivante=lst_coarete[i];
244     MG_SOMMET* mgsommet_suivant;
245     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet2()->get_sommet();
246     else mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet1()->get_sommet();
247     if (mgsommet==mgsommet_suivant)
248     {
249     if (trouve==0)
250     {
251     trouve=1;
252     mgcoaretetmp=mgcoarete_suivante;
253     }
254     else
255     {
256     //angleref
257     double uv[2];
258     face->inverser(uv,xyz);
259     double normal[3];
260     face->calcul_normale_unitaire(uv,normal);
261     double dir1[3];
262     double dir2[3];
263     MG_COSOMMET* mgcosommet;
264     if (coare->get_orientation()==MEME_SENS) mgcosommet=coare->get_arete()->get_cosommet1();
265     else mgcosommet=coare->get_arete()->get_cosommet2();
266     coare->get_arete()->deriver(mgcosommet->get_t(),dir1);
267     if (mgcoaretetmp->get_orientation()==MEME_SENS) mgcosommet=mgcoaretetmp->get_arete()->get_cosommet2();
268     else mgcosommet=mgcoaretetmp->get_arete()->get_cosommet1();
269     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t(),dir2);
270     int sens1=coare->get_orientation();
271     int sens2=mgcoaretetmp->get_orientation();
272     OT_VECTEUR_3D vec1(dir1[0]*sens1,dir1[1]*sens1,dir1[2]*sens1);
273     OT_VECTEUR_3D vec2(-dir2[0]*sens2,-dir2[1]*sens2,-dir2[2]*sens2);
274     vec1.norme();
275     vec2.norme();
276     OT_VECTEUR_3D nor=normal&vec1;
277     double cs=vec1*vec2;
278     double sn=-1*(vec2*nor);
279     angleref=acos(cs);
280     if (sn<0) angleref=-angleref;
281     if (angleref<0) angleref=angleref+2.*M_PI;
282     if (coare->get_arete()==mgcoaretetmp->get_arete()) angleref=2*M_PI;
283     if (angleref<1e-10)
284     {
285     double dt=1e-3*(mgcoaretetmp->get_arete()->get_tmax()-mgcoaretetmp->get_arete()->get_tmin());
286     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
287     OT_VECTEUR_3D vec2(-dir2[0]*sens2,-dir2[1]*sens2,-dir2[2]*sens2);
288     vec2.norme();
289     double cs=vec1*vec2;
290     double sn=-1*(vec2*nor);
291     angleref=acos(cs);
292     if (sn<0) angleref2=-angleref2;
293     if (angleref<0) angleref2=angleref2+2.*M_PI;
294     }
295     //angle
296     if (coare->get_orientation()==MEME_SENS) mgcosommet=coare->get_arete()->get_cosommet1();
297     else mgcosommet=coare->get_arete()->get_cosommet2();
298     coare->get_arete()->deriver(mgcosommet->get_t(),dir1);
299     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet2();
300     else mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet1();
301     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t(),dir2);
302     sens1=coare->get_orientation();
303     sens2=mgcoarete_suivante->get_orientation();
304     vec1.change_x(dir1[0]*sens1);
305     vec1.change_y(dir1[1]*sens1);
306     vec1.change_z(dir1[2]*sens1);
307     vec2.change_x(-dir2[0]*sens2);
308     vec2.change_y(-dir2[1]*sens2);
309     vec2.change_z(-dir2[2]*sens2);
310     vec1.norme();
311     vec2.norme();
312     nor=normal&vec1;
313     cs=vec1*vec2;
314     sn=-1*(vec2*nor);
315     double angle=acos(cs);
316     if (sn<0) angle=-angle;
317     if (angle<0) angle=angle+2.*M_PI;
318     if (coare->get_arete()==mgcoarete_suivante->get_arete()) angle=2*M_PI;
319     if (angle<angleref)
320     {
321     angleref=angle;
322     mgcoaretetmp=mgcoarete_suivante;
323     }
324     else if ((angle<1e-10) && (angleref<1e-10))
325     {
326     double dt=1e-3*(mgcoarete_suivante->get_arete()->get_tmax()-mgcoarete_suivante->get_arete()->get_tmin());
327     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
328     OT_VECTEUR_3D vec2(-dir2[0]*sens2,-dir2[1]*sens2,-dir2[2]*sens2);
329     vec2.norme();
330     double cs=vec1*vec2;
331     double sn=-1*(vec2*nor);
332     angle=acos(cs);
333     if (sn<0) angle=-angle;
334     if (angle<0) angle=angle+2.*M_PI;
335     if (angle<angleref2)
336     mgcoaretetmp=mgcoarete_suivante;
337    
338     }
339    
340     }
341     }
342     }
343     coareteprecedente=mgcoaretetmp;
344     return coareteprecedente;
345     }
346    
347 francois 763 void MG_BOUCLE::enregistrer(std::ostream& o,double version)
348 francois 283 {
349     if (face!=NULL) o << "%" << get_id() << "=BOUCLE($"<< face->get_id() << ",(";
350     if (poutre!=NULL) o << "%" << get_id() << "=BOUCLE($"<< poutre->get_id() << ",(";
351     for (unsigned int i=0;i<lst_coarete.size();i++)
352     {
353     o << "$" << lst_coarete[i]->get_id();
354     if (i!=lst_coarete.size()-1) o << ",";
355     else o << ")";
356     }
357     o << ");" << std::endl;
358     }
359    
360    
361    
362