MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
vct_multi_modele.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 //####// vct_multi_modele.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:54 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #include "gestionversion.h"
25 #include "vct_multi_modele.h"
26 #include "vct.h"
27 
28 
29 #include "mg_geometrie.h"
30 
31 
32 
33 
35 {
36 }
37 
39 {
40 }
41 
43 {
44 }
45 
46 
48 {
51  fusionne_face();
52 }
53 
55 {
56  std::multimap<OT_VECTEUR_4DD,MG_SOMMET*,lessOT_VECTEUR_4DD > tabsom;
57  int nbsom=geo->get_nb_mg_sommet();
58  for (int i=0;i<nbsom;i++)
59  {
60  MG_SOMMET* som=geo->get_mg_sommet(i);
62  std::pair<OT_VECTEUR_4DD,MG_SOMMET*> tmp(*bary,som);
63  tabsom.insert(tmp);
64  }
65  int nb=tabsom.size();
66  std::multimap <OT_VECTEUR_4DD,MG_SOMMET*,lessOT_VECTEUR_4DD > :: iterator its;
67  its=tabsom.begin();
68  for ( int i=0;i<nb-1;i++)
69  {
70  MG_SOMMET* som1=(*its).second;
71  std::multimap <OT_VECTEUR_4DD,MG_SOMMET*,lessOT_VECTEUR_4DD > :: iterator itstmp=its;
72  itstmp++;
73  MG_SOMMET* som2=(*itstmp).second;
76  if (*bary1==*bary2)
77  {
78  int nbcosom=som2->get_nb_mg_cosommet();
79  for (int j=nbcosom-1;j> -1;j--)
80  {
81  MG_COSOMMET* cosom=som2->get_mg_cosommet(j);
82  cosom->change_sommet(som1);
83  som2->supprimer_mg_cosommet(cosom);
84  som1->ajouter_mg_cosommet(cosom);
85  }
87  tabsom.erase(itstmp);
88  }
89  else its++;
90  }
91 
92 
93 
94 
95 }
96 
97 
99 {
100  std::multimap <OT_VECTEUR_4DD,MG_ARETE*,lessOT_VECTEUR_4DD > tabare;
101  int nbarete=geo->get_nb_mg_arete();
102  for (int i=0;i<nbarete;i++)
103  {
104  MG_ARETE* arete=geo->get_mg_arete(i);
106  std::pair<OT_VECTEUR_4DD,MG_ARETE*> tmp(*bary,arete);
107  tabare.insert(tmp);
108  }
109  int nb=tabare.size();
110  std::multimap <OT_VECTEUR_4DD,MG_ARETE*,lessOT_VECTEUR_4DD > :: iterator ita;
111  ita=tabare.begin();
112  for ( int i=0;i<nb-1;i++)
113  {
114  MG_ARETE* are1=(*ita).second;
115  std::multimap <OT_VECTEUR_4DD,MG_ARETE*,lessOT_VECTEUR_4DD > :: iterator itatmp=ita;
116  itatmp++;
117  MG_ARETE* are2=(*itatmp).second;
120  int ident=0;
121  if (*bary1==*bary2)
124  {
127  {
130  {
131  ident=1;
132  int nbcoarete=are2->get_nb_mg_coarete();
133  double xyz[3],dxyz1[3],dxyz2[3],t;
134  are1->evaluer(are1->get_tmin(),xyz);
135  are2->inverser(t,xyz);
136  are1->deriver(are1->get_tmin(),dxyz1);
137  are2->deriver(t,dxyz2);
138  OT_VECTEUR_3D vec1(dxyz1[0],dxyz1[1],dxyz1[2]);
139  OT_VECTEUR_3D vec2(dxyz2[0],dxyz2[1],dxyz2[2]);
140  vec1.norme();
141  vec2.norme();
142  double ps=vec1*vec2;
143  int sens;
144  if (ps>0.) sens=1;
145  else sens=-1;
146  for (int j=nbcoarete-1;j> -1;j--)
147  {
148  MG_COARETE* coare=are2->get_mg_coarete(j);
149  coare->change_arete(are1,sens);
150  are2->supprimer_mg_coarete(coare);
151  are1->ajouter_mg_coarete(coare);
152  }
153  long id1=are2->get_cosommet1()->get_sommet()->get_id();
154  long id2=are2->get_cosommet2()->get_sommet()->get_id();
155  geo->supprimer_mg_areteid(are2->get_id());
158  tabare.erase(itatmp);
159  }
160  }
161  }
162 
163  if (ident==0) ita++;
164  }
165 }
166 
168 {
169  std::multimap <OT_VECTEUR_4DD,MG_FACE*,lessOT_VECTEUR_4DD > tabface;
170  int nbface=geo->get_nb_mg_face();
171  for (int i=0;i<nbface;i++)
172  {
173  MG_FACE* face=geo->get_mg_face(i);
175  std::pair<OT_VECTEUR_4DD,MG_FACE*> tmp(*bary,face);
176  tabface.insert(tmp);
177  }
178  int nb=tabface.size();
179  std::multimap <OT_VECTEUR_4DD,MG_FACE*,lessOT_VECTEUR_4DD> :: iterator itf;
180  itf=tabface.begin();
181  for ( int i=0;i<nb-1;i++)
182  {
183  MG_FACE* face1=(*itf).second;
184  std::multimap <OT_VECTEUR_4DD,MG_FACE*,lessOT_VECTEUR_4DD > :: iterator itftmp=itf;
185  itftmp++;
186  MG_FACE* face2=(*itftmp).second;
189  int ident=0;
190  if (*bary1==*bary2)
193  {
196  {
199  {
200  ident=1;
201  double uv1[2]={0.,0.};
202  double uv2[2]={0.,0.};
203  double xyz[3];
204  double n2[3];
205  double n1[3];
206  face1->evaluer(uv1,xyz);
207  face2->inverser(uv2,xyz);
208  face1->calcul_normale_unitaire(uv1,n1);
209  face2->calcul_normale_unitaire(uv2,n2);
210  OT_VECTEUR_3D vec1(n1[0],n1[1],n1[2]);
211  OT_VECTEUR_3D vec2(n2[0],n2[1],n2[2]);
212  double ps=vec1*vec2;
213  int sens;
214  if (ps>0.) sens=1;
215  else sens=-1;
216  int nbcoface=face2->get_nb_mg_coface();
217  for (int j=nbcoface-1;j> -1;j--)
218  {
219  MG_COFACE* coface=face2->get_mg_coface(j);
220  coface->change(face1,sens);
221  face2->supprimer_mg_coface(coface);
222  face1->ajouter_mg_coface(coface);
223  }
224  int nbboucle=face2->get_nb_mg_boucle();
225  for (int i=0;i<nbboucle;i++)
226  {
227  MG_BOUCLE* bou=face2->get_mg_boucle(i);
229  }
230  geo->supprimer_mg_faceid(face2->get_id());
231  tabface.erase(itftmp);
232  }
233  }
234  }
235  if (ident==0) itf++;
236  }
237 }
238 
MG_SOMMET::get_mg_cosommet
virtual MG_COSOMMET * get_mg_cosommet(int num)
Definition: mg_sommet.cpp:88
MG_GEOMETRIE::supprimer_mg_sommetid
virtual int supprimer_mg_sommetid(unsigned long num)
Definition: mg_geometrie.cpp:558
MG_ARETE::get_cosommet2
virtual class MG_COSOMMET * get_cosommet2(void)
Definition: mg_arete.cpp:85
VCT::get_tenseur_metrique
virtual OT_TENSEUR * get_tenseur_metrique(void)
Definition: vct.cpp:204
VCT_MULTI_MODELE
Definition: vct_multi_modele.h:30
mg_geometrie.h
MG_SOMMET::get_vectorisation
virtual VCT & get_vectorisation(void)
Definition: mg_sommet.cpp:103
MG_BOUCLE
Definition: mg_boucle.h:35
gestionversion.h
VCT_MULTI_MODELE::VCT_MULTI_MODELE
VCT_MULTI_MODELE(class MG_GEOMETRIE *g)
Definition: vct_multi_modele.cpp:34
vct.h
MG_COSOMMET::change_sommet
virtual void change_sommet(MG_SOMMET *som)
Definition: mg_cosommet.cpp:93
MG_ARETE::evaluer
virtual void evaluer(double t, double *xyz)
Definition: mg_arete.cpp:143
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
MG_COSOMMET
Definition: mg_cosommet.h:31
MG_GEOMETRIE::get_nb_mg_arete
unsigned int get_nb_mg_arete(void)
Definition: mg_geometrie.cpp:813
MG_FACE::get_nb_mg_coface
virtual int get_nb_mg_coface(void)
Definition: mg_face.cpp:83
MG_COARETE
Definition: mg_coarete.h:31
MG_SURFACE::get_vectorisation
virtual VCT & get_vectorisation(void)
Definition: mg_surface.cpp:76
MG_ARETE::supprimer_mg_coarete
virtual void supprimer_mg_coarete(class MG_COARETE *coarete)
Definition: mg_arete.cpp:213
MG_GEOMETRIE::get_mg_sommet
MG_SOMMET * get_mg_sommet(unsigned int num)
Definition: mg_geometrie.cpp:539
MG_FACE::get_nb_mg_boucle
virtual int get_nb_mg_boucle(void)
Definition: mg_face.cpp:67
MG_COFACE
Definition: mg_coface.h:33
MG_SOMMET::get_nb_mg_cosommet
virtual int get_nb_mg_cosommet(void)
Definition: mg_sommet.cpp:64
MG_ARETE::get_tmin
virtual double get_tmin(void)
Definition: mg_arete.cpp:179
MG_COARETE::change_arete
virtual void change_arete(MG_ARETE *are, int sens=1)
Definition: mg_coarete.cpp:64
MG_FACE::inverser
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
Definition: mg_face.cpp:228
MG_COFACE::change
virtual void change(MG_FACE *f, int ori)
Definition: mg_coface.cpp:63
MG_ARETE::inverser
virtual void inverser(double &t, double *xyz, double precision=1e-6)
Definition: mg_arete.cpp:173
MG_FACE::supprimer_mg_coface
virtual void supprimer_mg_coface(class MG_COFACE *coface)
Definition: mg_face.cpp:89
VCT::get_nb_points
virtual int get_nb_points(void)
Definition: vct.cpp:186
MG_GEOMETRIE::supprimer_mg_faceid
virtual int supprimer_mg_faceid(unsigned long num)
Definition: mg_geometrie.cpp:1270
MG_GEOMETRIE::supprimer_mg_areteid
virtual int supprimer_mg_areteid(unsigned long num)
Definition: mg_geometrie.cpp:819
MG_ARETE::get_nb_mg_coarete
virtual int get_nb_mg_coarete(void)
Definition: mg_arete.cpp:106
MG_FACE::evaluer
virtual void evaluer(double *uv, double *xyz)
Definition: mg_face.cpp:192
OT_TENSEUR
Definition: ot_tenseur.h:41
MG_ARETE::get_vectorisation
virtual VCT & get_vectorisation(void)
Definition: mg_arete.cpp:245
MG_FACE::get_mg_coface
virtual MG_COFACE * get_mg_coface(int num)
Definition: mg_face.cpp:104
MG_SOMMET::supprimer_mg_cosommet
virtual void supprimer_mg_cosommet(class MG_COSOMMET *cosom)
Definition: mg_sommet.cpp:70
MG_GEOMETRIE::get_mg_arete
MG_ARETE * get_mg_arete(unsigned int num)
Definition: mg_geometrie.cpp:800
MG_FACE::get_vectorisation
virtual VCT & get_vectorisation(void)
Definition: mg_face.cpp:496
MG_ARETE::ajouter_mg_coarete
virtual void ajouter_mg_coarete(class MG_COARETE *coarete)
Definition: mg_arete.cpp:101
OT_TENSEUR::est_til_equivalent
virtual int est_til_equivalent(OT_TENSEUR &tns)
Definition: ot_tenseur.cpp:258
MG_SOMMET::ajouter_mg_cosommet
virtual void ajouter_mg_cosommet(class MG_COSOMMET *cosom)
Definition: mg_sommet.cpp:59
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
MG_GEOMETRIE::get_mg_face
MG_FACE * get_mg_face(unsigned int num)
Definition: mg_geometrie.cpp:1251
VCT_MULTI_MODELE::recherche_identite
void recherche_identite(void)
Definition: vct_multi_modele.cpp:47
MG_COSOMMET::get_sommet
virtual MG_SOMMET * get_sommet(void)
Definition: mg_cosommet.cpp:83
MG_GEOMETRIE::get_nb_mg_face
unsigned int get_nb_mg_face(void)
Definition: mg_geometrie.cpp:1264
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
VCT_MULTI_MODELE::fusionne_face
void fusionne_face(void)
Definition: vct_multi_modele.cpp:167
VCT_MULTI_MODELE::fusionne_sommet
void fusionne_sommet(void)
Definition: vct_multi_modele.cpp:54
MG_FACE::ajouter_mg_coface
virtual void ajouter_mg_coface(class MG_COFACE *coface)
Definition: mg_face.cpp:78
vct_multi_modele.h
MG_FACE::calcul_normale_unitaire
virtual void calcul_normale_unitaire(double *uv, double *normale)
Definition: mg_face.cpp:248
VCT::get_barycentre_4d
virtual OT_VECTEUR_4DD * get_barycentre_4d(void)
Definition: vct.cpp:224
MG_COURBE::get_vectorisation
virtual VCT & get_vectorisation(void)
Definition: mg_courbe.cpp:84
MG_ARETE::get_courbe
virtual class MG_COURBE * get_courbe(void)
Definition: mg_arete.cpp:89
VCT_MULTI_MODELE::geo
MG_GEOMETRIE * geo
Definition: vct_multi_modele.h:41
MG_GEOMETRIE
Definition: mg_geometrie.h:84
VCT_MULTI_MODELE::~VCT_MULTI_MODELE
virtual ~VCT_MULTI_MODELE()
Definition: vct_multi_modele.cpp:42
MG_ARETE::deriver
virtual void deriver(double t, double *xyz)
Definition: mg_arete.cpp:149
MG_ARETE
Definition: mg_arete.h:36
MG_FACE
Definition: mg_face.h:34
MG_GEOMETRIE::supprimer_mg_boucleid
virtual int supprimer_mg_boucleid(unsigned long num)
Definition: mg_geometrie.cpp:1119
MG_FACE::get_mg_boucle
virtual MG_BOUCLE * get_mg_boucle(int num)
Definition: mg_face.cpp:72
MG_ARETE::get_cosommet1
virtual class MG_COSOMMET * get_cosommet1(void)
Definition: mg_arete.cpp:81
MG_SOMMET
Definition: mg_sommet.h:35
OT_VECTEUR_4DD
Definition: ot_mathematique.h:284
MG_FACE::get_surface
virtual MG_SURFACE * get_surface(void)
Definition: mg_face.cpp:109
MG_GEOMETRIE::get_nb_mg_sommet
unsigned int get_nb_mg_sommet(void)
Definition: mg_geometrie.cpp:552
MG_ARETE::get_mg_coarete
virtual MG_COARETE * get_mg_coarete(int num)
Definition: mg_arete.cpp:228
VCT_MULTI_MODELE::fusionne_arete
void fusionne_arete(void)
Definition: vct_multi_modele.cpp:98