ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mtu/src/mg_boucle.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (11 months, 1 week ago) by francois
File size: 14199 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

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