MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mg_boucle.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
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 
23 
24 #include "gestionversion.h"
25 #include "mg_boucle.h"
26 #include "ot_mathematique.h"
27 #include "mg_definition.h"
28 #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 MG_BOUCLE::MG_BOUCLE(long unsigned int num): MG_ELEMENT_COTOPOLOGIQUE(num),face(NULL),poutre(NULL)
49 {
50 
51 }
52 
54 {
55 
56 }
57 
58 MG_BOUCLE::MG_BOUCLE(MG_BOUCLE& mdd):MG_ELEMENT_COTOPOLOGIQUE(),face(mdd.face),lst_coarete(mdd.lst_coarete)
59 {
60 }
61 
62 
64 {
65 }
66 
68 {
69  return TYPE_ELEMENT_COTOPOLOGIQUE::BOUCLE;
70 }
71 
72 
74 {
75  lst_coarete.insert(lst_coarete.end(),mgcoarete);
76 }
77 
79 {
80  return lst_coarete.size();
81 }
82 
83 
85 {
86  return lst_coarete[num];
87 }
88 
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 
103 {
104  return face;
105 }
106 
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 
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 void MG_BOUCLE::enregistrer(std::ostream& o,double version)
346 {
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 
MG_ARETE::get_cosommet2
virtual class MG_COSOMMET * get_cosommet2(void)
Definition: mg_arete.cpp:85
MG_BOUCLE
Definition: mg_boucle.h:35
gestionversion.h
MG_BOUCLE::get_nb_mg_coarete
virtual int get_nb_mg_coarete(void)
Definition: mg_boucle.cpp:78
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
MG_COSOMMET
Definition: mg_cosommet.h:31
MG_COARETE
Definition: mg_coarete.h:31
MG_BOUCLE::get_type
virtual int get_type(void)
Definition: mg_boucle.cpp:67
MG_BOUCLE::ajouter_mg_coarete
virtual void ajouter_mg_coarete(class MG_COARETE *mgcoarete)
Definition: mg_boucle.cpp:73
MG_ARETE::get_tmin
virtual double get_tmin(void)
Definition: mg_arete.cpp:179
MG_BOUCLE::face
MG_FACE * face
Definition: mg_boucle.h:56
MG_POUTRE
Definition: mg_poutre.h:33
MG_FACE::inverser
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
Definition: mg_face.cpp:228
MEME_SENS
const int MEME_SENS
Definition: mg_definition.h:35
MG_BOUCLE::get_mg_face
virtual MG_FACE * get_mg_face(void)
Definition: mg_boucle.cpp:102
MG_COARETE::get_orientation
virtual int get_orientation(void)
Definition: mg_coarete.cpp:71
MG_SOMMET::get_point
virtual MG_POINT * get_point(void)
Definition: mg_sommet.cpp:52
MG_ELEMENT_COTOPOLOGIQUE
Definition: mg_element_cotopologique.h:30
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
MG_BOUCLE::MG_BOUCLE
MG_BOUCLE()
Definition: mg_boucle.cpp:53
MG_COSOMMET::get_sommet
virtual MG_SOMMET * get_sommet(void)
Definition: mg_cosommet.cpp:83
ot_mathematique.h
acos
double2 acos(double2 &val)
Definition: ot_doubleprecision.cpp:224
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
MG_BOUCLE::get_mg_coarete
virtual MG_COARETE * get_mg_coarete(int num)
Definition: mg_boucle.cpp:84
MG_BOUCLE::~MG_BOUCLE
virtual ~MG_BOUCLE()
Definition: mg_boucle.cpp:63
MG_FACE::calcul_normale_unitaire
virtual void calcul_normale_unitaire(double *uv, double *normale)
Definition: mg_face.cpp:248
MG_COSOMMET::get_t
double get_t()
Definition: mg_cosommet.cpp:99
mg_definition.h
MG_BOUCLE::get_mg_coarete_suivante
virtual MG_COARETE * get_mg_coarete_suivante(MG_COARETE *coare)
Definition: mg_boucle.cpp:107
MG_BOUCLE::supprimer_mg_coarete
virtual void supprimer_mg_coarete(class MG_COARETE *mgcoarete)
Definition: mg_boucle.cpp:89
MG_BOUCLE::lst_coarete
std::vector< MG_COARETE * > lst_coarete
Definition: mg_boucle.h:58
MG_ARETE::deriver
virtual void deriver(double t, double *xyz)
Definition: mg_arete.cpp:149
MG_FACE
Definition: mg_face.h:34
MG_BOUCLE::enregistrer
virtual void enregistrer(std::ostream &o, double version)
Definition: mg_boucle.cpp:345
mg_boucle.h
MG_ARETE::get_cosommet1
virtual class MG_COSOMMET * get_cosommet1(void)
Definition: mg_arete.cpp:81
MG_SOMMET
Definition: mg_sommet.h:35
MG_BOUCLE::poutre
MG_POUTRE * poutre
Definition: mg_boucle.h:57
MG_COARETE::get_arete
virtual MG_ARETE * get_arete(void)
Definition: mg_coarete.cpp:58
MG_ARETE::get_tmax
virtual double get_tmax(void)
Definition: mg_arete.cpp:184
MG_POINT::evaluer
virtual void evaluer(double *xyz)=0
MG_BOUCLE::get_mg_coarete_precedente
virtual MG_COARETE * get_mg_coarete_precedente(MG_COARETE *coare)
Definition: mg_boucle.cpp:226