MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mg_maillage_outils.h
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_maillage_outils.h
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:54 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #ifndef mg_maillage_outilsh
23 #define mg_maillage_outilsh
24 
25 
26 
27 #include <set>
28 #include <vector>
29 #include <mg_maillage.h>
30 #include "mg_gestionnaire.h"
31 #include "ot_mathematique.h"
32 class MG_SEGMENT;
33 class MG_NOEUD;
34 class MG_FACE;
35 class MG_ARETE;
36 class MG_SOMMET;
37 class MG_MAILLAGE;
38 class MG_GEOMETRIE;
40 
41 
42 
48 {
49 public:
54 
55 void calcul_courbure_face_arete_sommet(MG_NOEUD *noeud,double& kmin1, double& kmax1,double& kmin2,double& kmax2,std::map<std::string,double> &liste_kmin,std::map<std::string,double> &liste_kmax,std::map<std::string,double> &liste_gau,std::map<std::string,double> &liste_courburemax1,std::map<std::string,double> &liste_courburemax2,std::map<std::string,double> &liste_courburemax3,std::map<std::string,double> &liste_courburemax4,std::map<std::string,double> &liste_courburemax5,int opensurafece);
56 void calcul_courbure_discrete(class MG_GESTIONNAIRE& gest,char *nom,int nummai,char* outputgestnom,int opensurafece);
57 void calcul_courbure(class MG_GESTIONNAIRE& gest,char* solnom,int nummai,int numgeo,char* outputgestnom);
58 
59 
60 void calcul_courbure_face(MG_NOEUD *noeud,double& kmin, double& kmax, std::map<std::string,double> &liste_kmin,std::map<std::string,double> &liste_kmax,std::map<std::string,double> &liste_gau,std::map<std::string,double> &liste_courburemax1,std::map<std::string,double> &liste_courburemax2,std::map<std::string,double> &liste_courburemax3,std::map<std::string,double> &liste_courburemax4,std::map<std::string,double> &liste_courburemax5 );
61 
62 
67  static void inserer_noeud_segment(class MG_MAILLAGE * __mesh, class MG_NOEUD * __node, class MG_SEGMENT * __splitSeg, MG_SEGMENT * __segs[2], bool __deleteOriginalSeg = true);
68 
74  static void change_lien_maillage(class MG_ELEMENT_TOPOLOGIQUE * __old_topo, MG_ELEMENT_TOPOLOGIQUE * __new_topo, MG_MAILLAGE * __mesh = 0);
84  static void SplitEdgeInMesh(MG_MAILLAGE * __mesh, class MG_ARETE * __origEdge, class MG_SOMMET * __splitVertex, class MG_ARETE * __arete_gauche, MG_ARETE * __arete_droite, MG_SEGMENT **__origSegment, MG_NOEUD ** __splitNode, MG_SEGMENT * __splitSegments[2]);
85 
97  static void classe_elements_dimension1__trouver_prochains_elements(std::set <MG_SEGMENT*> & __unvisitedSegs, std::vector<MG_SEGMENT*> & __visitedSegs, std::vector<MG_NOEUD*>& __visitedNodes, MG_NOEUD * & __nextNode, MG_SEGMENT * & __nextSeg);
98 
99 
104  static MG_NOEUD * classe_elements_dimension1__trouver_noeud_dimension0(const std::set<MG_SEGMENT*> & __unvisitedSegs);
105 
106 
107  /*
108 
109  Cette fonction classe une liste de segments attach�s � un tpologie de dimension 1
110  (ar�teMG_NOEUD* noeud1=ele1->get_noeud1();
111  MG_NOEUD* noeud2=ele1->get_noeud2();
112  MG_NOEUD* noeud3=ele1->get_noeud3();
113  MG_NOEUD* noeud4=ele2->get_noeud1();
114  MG_NOEUD* noeud5=ele2->get_noeud2();
115  MG_NOEUD* noeud6=ele2->get_noeud3();
116  return get_angle_par_noeud<MG_NOEUD*>(noeud1,noeud2,noeud3,noeud4,noeud5,noeud6);) et g�n�re 2 listes :
117 
118  * __visitedSegs : la liste des segments plac�s entre 2 noeuds li�s � une topologie
119  de dimension 0 (noeuds de sommets). Les premier et dernier segments
120  de la liste sont adjacent � un sommet de la topologie.
121  La liste de segments est ordonn�e par adjacence et forment une polyligne.
122 
123  * __visitedNodes : la liste des noeuds ordonn�s par ordre d'adjacence,
124  en partant du noeud d'extr�mit� du premier segment, et en finissant
125  par le noeud d'extremit� du dernier segment.
126 
127  __visitedNodes[i] et __visitedNodes[i+1] sont les extr�mit�s du segment __visitedSegs[i]
128 
129  Algorithme utilis� :
130 
131  * Trouver le premier noeud tel que la dimension de la topologie soit �gale � 0
132 
133  * Faire :
134 
135  * (seg^i+1, N^i+1) = Trouver les prochains segments et noeuds ((segs), (visited_seg), (visited_N))
136 
137  * Tant que dernier(visited_N) a une dimension non �gale � 0
138 
139  */
140  static void classe_elements_dimension1(std::set<MG_SEGMENT*> & __unvisitedSegs, std::vector<MG_SEGMENT*> & __visitedSegs, std::vector<MG_NOEUD*> & __visitedNodes );
141  static void IdentifyEdge1(std::set <MG_SOMMET *> __vertices, std::set<class MG_FACE *> & __adjacentFaces, std::set <MG_ARETE * > & __edge);
142  static void IdentifyEdge2(std::set <MG_SOMMET *> __vertices, std::set<MG_FACE *> & __adjacentFaces, std::set<MG_ARETE *> & __lst_edge, std::vector<MG_NOEUD*> & __nodes);
143  static void IdentifyEdge3(std::set <MG_SOMMET *> __vertices, std::set<MG_ARETE *> & __lst_edge, std::vector<MG_NOEUD*> & __nodes, MG_ARETE ** __edge);
144  MG_GEOMETRIE* importer(class MG_GESTIONNAIRE& gest,char *path);
145  static void IdentifyEdge4(std::set <MG_SOMMET *> __vertices, std::set<MG_ARETE *> & __lst_edge, std::vector<MG_NOEUD*> & __nodes, std::vector<MG_SEGMENT*> & __segments, MG_ARETE ** __edge);
146  static void IdentifyEdge5(const std::set <MG_SOMMET *> __vertices, const std::set<MG_ARETE *> & __lst_edge, const std::vector<MG_NOEUD*> & __nodes, const std::vector<MG_SEGMENT*> & __segs, MG_ARETE ** __edge);
147  static void FindCommonEdgesOfFaces(std::set< MG_FACE * > & __faces, std::set<MG_ARETE*> & __commonEdges);
148  static void _FilterSegmentsAndEdgeAdjacentToSameFaces( std::vector<MG_SEGMENT*> & __segments, std::set<MG_ARETE *> & __lst_edge);
149  static double TestDistanceEdgeNode(MG_ARETE* candidate_edge, MG_NOEUD* test_node);
150  static void Conformity_CloseSurfaceMesh(MG_MAILLAGE * __tess, double __tolerance);
151  static double TestDistanceEdge(MG_ARETE* candidate_edge, double* xyz_node);
152 
153  void projetedansletriangle(MG_TRIANGLE *tri,double x,double y, double z,double &xx,double &yy,double &zz);
154  int estdansletriangle(MG_TRIANGLE *tri,double x,double y, double z) ;
155  int projeteestdansletriangle(MG_TRIANGLE *tri,double x,double y, double z) ;
156  int estdansletetra(class MG_TETRA *tet,double x,double y, double z);
157  int compare_etat_tetra(int etat,int valeur);
158  int compare_etat_triangle(int etat,int valeur);
159 
160  int est_delaunay_generalise(double *xyz,MG_TRIANGLE* tri);
161 
162  double get_angle(class MG_TRIANGLE* ele1,class MG_TRIANGLE* ele2);
163 
164 
165  void get_noeud_voisin(MG_NOEUD* no,TPL_MAP_ENTITE<MG_NOEUD*> &liste,int niveau);
166  double get_volume(MG_MAILLAGE* mai);
167 
168 private:
170  int nummai;
171  double calcul_gaussienne_face(MG_NOEUD *noeud);
172  double calcul_moyenne_face(MG_NOEUD *noeud);
173  double calcul_surface_triangle_face(MG_NOEUD *noeud);
174 
175  double calcul_surface_lsttriangle(MG_NOEUD * noeud,MG_TRIANGLE * tr1);
176  double calcul_angle_lsttriangle(MG_NOEUD * noeud,MG_TRIANGLE * tr1);
177  double calcul_angle_lstsegment(MG_NOEUD * noeud,MG_SEGMENT * se1);
178 
179  void calcul_courbure_arete_virtuelle(MG_NOEUD *noeud,double& kmin, double& kmax, std::map<std::string,double> &liste_kmin,std::map<std::string,double> &liste_kmax );
180  void calcul_courbure_arete_nonvirtuelle(MG_NOEUD *noeud,double& kmin1, double& kmax1,double& kmin2,double& kmax2, std::map<std::string,double> &liste_kmin,std::map<std::string,double> &liste_kmax );
181  void calcul_courbure_arete(MG_NOEUD *noeud,double& kmin1, double& kmax1,double& kmin2,double& kmax2, std::map<std::string,double> &liste_kmin,std::map<std::string,double> &liste_kmax);
182 
183  void calcul_courbure_sommet(MG_NOEUD *noeud,double& kmin1, double& kmax1,double& kmin2,double& kmax2, std::map<std::string,double> &liste_kmin,std::map<std::string,double> &liste_kmax);
184  void calcul_courbure_sommet_arete_virtuelle(MG_SOMMET *sommet,MG_NOEUD *noeud,double& kmin1, double& kmax1,double& kmin2,double& kmax2, std::map<std::string,double> &liste_kmin,std::map<std::string,double> &liste_kmax );
185  void calcul_courbure_sommet_arete_nonvirtuelle(MG_SOMMET *sommet,MG_NOEUD *noeud,double& kmin1, double& kmax1,double& kmin2,double& kmax2, std::map<std::string,double> &liste_kmin,std::map<std::string,double> &liste_kmax );
186 
187 
188  static void _FilterGeometricTolerance(const std::vector<MG_NOEUD*> & __nodes, std::set<MG_ARETE*> & __lst_edge);
189  static void _FilterGeometricTolerance5(const std::vector<MG_NOEUD*> & __nodes, const std::vector<MG_SEGMENT*> & __segs, std::set<MG_ARETE*> & __lst_edge);
190 };
191 
192 #endif
double calcul_surface_lsttriangle(MG_NOEUD *noeud, MG_TRIANGLE *tr1)
void calcul_courbure_arete(MG_NOEUD *noeud, double &kmin1, double &kmax1, double &kmin2, double &kmax2, std::map< std::string, double > &liste_kmin, std::map< std::string, double > &liste_kmax)
static double TestDistanceEdgeNode(MG_ARETE *candidate_edge, MG_NOEUD *test_node)
static double TestDistanceEdge(MG_ARETE *candidate_edge, double *xyz_node)
static void classe_elements_dimension1__trouver_prochains_elements(std::set< MG_SEGMENT * > &__unvisitedSegs, std::vector< MG_SEGMENT * > &__visitedSegs, std::vector< MG_NOEUD * > &__visitedNodes, MG_NOEUD *&__nextNode, MG_SEGMENT *&__nextSeg)
static void SplitEdgeInMesh(MG_MAILLAGE *__mesh, class MG_ARETE *__origEdge, class MG_SOMMET *__splitVertex, class MG_ARETE *__arete_gauche, MG_ARETE *__arete_droite, MG_SEGMENT **__origSegment, MG_NOEUD **__splitNode, MG_SEGMENT *__splitSegments[2])
void get_noeud_voisin(MG_NOEUD *no, TPL_MAP_ENTITE< MG_NOEUD * > &liste, int niveau)
static void IdentifyEdge4(std::set< MG_SOMMET * > __vertices, std::set< MG_ARETE * > &__lst_edge, std::vector< MG_NOEUD * > &__nodes, std::vector< MG_SEGMENT * > &__segments, MG_ARETE **__edge)
static void IdentifyEdge2(std::set< MG_SOMMET * > __vertices, std::set< MG_FACE * > &__adjacentFaces, std::set< MG_ARETE * > &__lst_edge, std::vector< MG_NOEUD * > &__nodes)
double calcul_gaussienne_face(MG_NOEUD *noeud)
void calcul_courbure(class MG_GESTIONNAIRE &gest, char *solnom, int nummai, int numgeo, char *outputgestnom)
double calcul_moyenne_face(MG_NOEUD *noeud)
void calcul_courbure_face_arete_sommet(MG_NOEUD *noeud, double &kmin1, double &kmax1, double &kmin2, double &kmax2, std::map< std::string, double > &liste_kmin, std::map< std::string, double > &liste_kmax, std::map< std::string, double > &liste_gau, std::map< std::string, double > &liste_courburemax1, std::map< std::string, double > &liste_courburemax2, std::map< std::string, double > &liste_courburemax3, std::map< std::string, double > &liste_courburemax4, std::map< std::string, double > &liste_courburemax5, int opensurafece)
void calcul_courbure_arete_virtuelle(MG_NOEUD *noeud, double &kmin, double &kmax, std::map< std::string, double > &liste_kmin, std::map< std::string, double > &liste_kmax)
void calcul_courbure_sommet_arete_virtuelle(MG_SOMMET *sommet, MG_NOEUD *noeud, double &kmin1, double &kmax1, double &kmin2, double &kmax2, std::map< std::string, double > &liste_kmin, std::map< std::string, double > &liste_kmax)
void calcul_courbure_face(MG_NOEUD *noeud, double &kmin, double &kmax, std::map< std::string, double > &liste_kmin, std::map< std::string, double > &liste_kmax, std::map< std::string, double > &liste_gau, std::map< std::string, double > &liste_courburemax1, std::map< std::string, double > &liste_courburemax2, std::map< std::string, double > &liste_courburemax3, std::map< std::string, double > &liste_courburemax4, std::map< std::string, double > &liste_courburemax5)
int estdansletriangle(MG_TRIANGLE *tri, double x, double y, double z)
void calcul_courbure_sommet(MG_NOEUD *noeud, double &kmin1, double &kmax1, double &kmin2, double &kmax2, std::map< std::string, double > &liste_kmin, std::map< std::string, double > &liste_kmax)
static void IdentifyEdge5(const std::set< MG_SOMMET * > __vertices, const std::set< MG_ARETE * > &__lst_edge, const std::vector< MG_NOEUD * > &__nodes, const std::vector< MG_SEGMENT * > &__segs, MG_ARETE **__edge)
int estdansletetra(class MG_TETRA *tet, double x, double y, double z)
static void FindCommonEdgesOfFaces(std::set< MG_FACE * > &__faces, std::set< MG_ARETE * > &__commonEdges)
void calcul_courbure_discrete(class MG_GESTIONNAIRE &gest, char *nom, int nummai, char *outputgestnom, int opensurafece)
void calcul_courbure_arete_nonvirtuelle(MG_NOEUD *noeud, double &kmin1, double &kmax1, double &kmin2, double &kmax2, std::map< std::string, double > &liste_kmin, std::map< std::string, double > &liste_kmax)
void calcul_courbure_sommet_arete_nonvirtuelle(MG_SOMMET *sommet, MG_NOEUD *noeud, double &kmin1, double &kmax1, double &kmin2, double &kmax2, std::map< std::string, double > &liste_kmin, std::map< std::string, double > &liste_kmax)
static void _FilterGeometricTolerance5(const std::vector< MG_NOEUD * > &__nodes, const std::vector< MG_SEGMENT * > &__segs, std::set< MG_ARETE * > &__lst_edge)
double calcul_angle_lsttriangle(MG_NOEUD *noeud, MG_TRIANGLE *tr1)
double calcul_surface_triangle_face(MG_NOEUD *noeud)
static void IdentifyEdge1(std::set< MG_SOMMET * > __vertices, std::set< class MG_FACE * > &__adjacentFaces, std::set< MG_ARETE * > &__edge)
int compare_etat_tetra(int etat, int valeur)
int projeteestdansletriangle(MG_TRIANGLE *tri, double x, double y, double z)
void projetedansletriangle(MG_TRIANGLE *tri, double x, double y, double z, double &xx, double &yy, double &zz)
double get_volume(MG_MAILLAGE *mai)
static void classe_elements_dimension1(std::set< MG_SEGMENT * > &__unvisitedSegs, std::vector< MG_SEGMENT * > &__visitedSegs, std::vector< MG_NOEUD * > &__visitedNodes)
static MG_NOEUD * classe_elements_dimension1__trouver_noeud_dimension0(const std::set< MG_SEGMENT * > &__unvisitedSegs)
int est_delaunay_generalise(double *xyz, MG_TRIANGLE *tri)
double calcul_angle_lstsegment(MG_NOEUD *noeud, MG_SEGMENT *se1)
static void _FilterGeometricTolerance(const std::vector< MG_NOEUD * > &__nodes, std::set< MG_ARETE * > &__lst_edge)
MG_GEOMETRIE * importer(class MG_GESTIONNAIRE &gest, char *path)
static void change_lien_maillage(class MG_ELEMENT_TOPOLOGIQUE *__old_topo, MG_ELEMENT_TOPOLOGIQUE *__new_topo, MG_MAILLAGE *__mesh=0)
static void inserer_noeud_segment(class MG_MAILLAGE *__mesh, class MG_NOEUD *__node, class MG_SEGMENT *__splitSeg, MG_SEGMENT *__segs[2], bool __deleteOriginalSeg=true)
double get_angle(class MG_TRIANGLE *ele1, class MG_TRIANGLE *ele2)
int compare_etat_triangle(int etat, int valeur)
static void Conformity_CloseSurfaceMesh(MG_MAILLAGE *__tess, double __tolerance)
static void _FilterSegmentsAndEdgeAdjacentToSameFaces(std::vector< MG_SEGMENT * > &__segments, std::set< MG_ARETE * > &__lst_edge)
static void IdentifyEdge3(std::set< MG_SOMMET * > __vertices, std::set< MG_ARETE * > &__lst_edge, std::vector< MG_NOEUD * > &__nodes, MG_ARETE **__edge)