ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/mg_boucle.cpp
Revision: 174
Committed: Wed Apr 22 21:46:09 2009 UTC (16 years ago) by francois
Original Path: magic/lib/geometrie/geometrie/src/mg_boucle.cpp
File size: 15956 byte(s)
Log Message:
Plusieurs modif importantes : 
1) la fonction un point appartient a une face est generique donc le mailleurbloc et le remailleur utilise la methode generic
2) dans une boucle il y une methode qui permet de connaitre la coarete suivante et precedente
3) Des solutions sont possibles aux elements. Attention le format de fichier magic est change pour SOLUTION. Il y a un parametre different. Si il y a des solutions dans le fichier il n y a pas compatibilite avec le format d'avant

File Contents

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