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, 9 months ago) by couturad
File size: 14163 byte(s)
Log Message:
Nouveau opencascade commit 1

File Contents

# Content
1 //------------------------------------------------------------
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 #include "mg_definition.h"
29 #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 MG_BOUCLE::MG_BOUCLE(long unsigned int num): MG_ELEMENT_COTOPOLOGIQUE(num),face(NULL),poutre(NULL)
51 {
52
53 }
54
55 MG_BOUCLE::MG_BOUCLE():MG_ELEMENT_COTOPOLOGIQUE(),face(NULL),poutre(NULL)
56 {
57
58 }
59
60 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 int MG_BOUCLE::get_type(void)
70 {
71 return TYPE_ELEMENT_COTOPOLOGIQUE::BOUCLE;
72 }
73
74
75 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 void MG_BOUCLE::enregistrer(std::ostream& o,double version)
348 {
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