MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mailleur3d_peau.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 //####// mailleur3d_peau.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:55 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "gestionversion.h"
23 #include "mailleur3d_peau.h"
24 #include "fct_taille.h"
25 #include "mg_volume.h"
26 #include "m3d_triangle.h"
27 
28 
29 
30 
31 
32 MAILLEUR3D_PEAU::MAILLEUR3D_PEAU(MG_MAILLAGE* mgmai,MG_GEOMETRIE *mggeo,MG_VOLUME* mgvol,FCT_TAILLE* fct_taille,bool save):MAILLEUR3D(mgmai,mggeo,fct_taille,save,mgvol,MAGIC::MAILLEURFRONTALETAT::TOUTDETRUIRE)
33 {
34 
35 }
36 
37 
39 {
40 }
41 
42 
43 
45 {
46 bool bienori=orientation_peau();
47 char chaine[255];
48 strcpy(chaine," Bonne orientation de la peau");
49 if (!bienori) strcpy(chaine," Changement d'orientation de la peau");
50 affiche(chaine);
51 LISTE_MG_TRIANGLE::iterator it;
53 
55  {
56  M3D_TRIANGLE* nvtri=new M3D_TRIANGLE(tri->get_id(),tri->get_lien_topologie(),tri->get_noeud1(),tri->get_noeud2(),tri->get_noeud3(),tri->get_segment1(),tri->get_segment2(),tri->get_segment3(),tri->get_origine());
57  nvtri->change_frontiere();
58  //if (tri->get_lien_topologie()==NULL)
59  if (tri->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO)
60  {
61  /*nvtri->change_origine(MAGIC::ORIGINE::IMPOSE);
62  nvtri->get_noeud1()->change_origine(MAGIC::ORIGINE::IMPOSE);;
63  nvtri->get_noeud2()->change_origine(MAGIC::ORIGINE::IMPOSE);;
64  nvtri->get_noeud3()->change_origine(MAGIC::ORIGINE::IMPOSE);;
65  nvtri->get_segment1()->change_origine(MAGIC::ORIGINE::IMPOSE);;
66  nvtri->get_segment2()->change_origine(MAGIC::ORIGINE::IMPOSE);;
67  nvtri->get_segment3()->change_origine(MAGIC::ORIGINE::IMPOSE);;
68  nvtri->get_segment1()->change_dimension_topo_null(2);
69  nvtri->get_segment2()->change_dimension_topo_null(2);
70  nvtri->get_segment3()->change_dimension_topo_null(2);*/
78  }
79  if (tri->get_lien_topologie()==NULL)
80  {
84  }
85  lsttrim3d.ajouter(nvtri);
86  }
87 
89 
90 for (M3D_TRIANGLE* tri=lsttrim3d.get_premier(it2);tri!=NULL;tri=lsttrim3d.get_suivant(it2))
91  {
92  mg_maillage->supprimer_mg_triangleid(tri->get_id());
94  }
95 
97  if (bienori) ajouter_front_courant(MAGIC::MAILLEURFRONTALETAT::NONFORCE,tri->get_noeud1(),tri->get_noeud2(),tri->get_noeud3(),tri);
98  else ajouter_front_courant(MAGIC::MAILLEURFRONTALETAT::NONFORCE,tri->get_noeud1(),tri->get_noeud3(),tri->get_noeud2(),tri);
99 
100 }
101 
102 
103 
105 {
106 LISTE_MG_TRIANGLE::iterator it,itp;
107 /*TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
108 BOITE_3D boite=mg_maillage->get_premier_triangle(it)->get_noeud1()->get_boite_3D();
109 for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(it);tri!=NULL;tri=mg_maillage->get_suivant_triangle(it))
110  {
111  lstnoeud.ajouter(tri->get_noeud1());
112  lstnoeud.ajouter(tri->get_noeud2());
113  lstnoeud.ajouter(tri->get_noeud3());
114  boite=boite+tri->get_noeud1()->get_boite_3D();
115  boite=boite+tri->get_noeud2()->get_boite_3D();
116  boite=boite+tri->get_noeud3()->get_boite_3D();
117  }
118 TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> octree;
119 octree.initialiser(&lstnoeud,1,boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax());
120 for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(it);tri!=NULL;tri=mg_maillage->get_suivant_triangle(it))
121  octree.inserer(tri);
122 */
123 
125 {
126 double *xyz1=tri->get_noeud1()->get_coord();
127 double *xyz2=tri->get_noeud2()->get_coord();
128 double *xyz3=tri->get_noeud3()->get_coord();
129 OT_VECTEUR_3D n1n2(xyz1,xyz2);
130 OT_VECTEUR_3D n1n3(xyz1,xyz3);
131 OT_VECTEUR_3D n=n1n3&n1n2;
132 n.norme();
133 double xyz[3];
134 xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0])/3.;
135 xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1])/3.;
136 xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2])/3.;
137 double eps=1e-6;
138 bool pbdefinition=true;
139 int tpositif=0,tnegatif=0;
141  {
142  if (tri2==tri) continue;
143  double *xyz1=tri2->get_noeud1()->get_coord();
144  double *xyz2=tri2->get_noeud2()->get_coord();
145  double *xyz3=tri2->get_noeud3()->get_coord();
146  OT_VECTEUR_3D n1n2(xyz1,xyz2);
147  OT_VECTEUR_3D n1n3(xyz1,xyz3);
148  OT_VECTEUR_3D n2=n1n3&n1n2;
149  n2.norme();
150  if (fabs(n2*n)<1-eps)
151  {
152  OT_VECTEUR_3D vec3=(-n);
153  OT_MATRICE_3D mat(n1n2,n1n3,vec3);
154  OT_VECTEUR_3D b(xyz1,xyz);
155  OT_MATRICE_3D mat1(b,n1n3,vec3);
156  OT_MATRICE_3D mat2(n1n2,b,vec3);
157  OT_MATRICE_3D mat3(n1n2,n1n3,b);
158  double det=mat.get_determinant();
159  double t1=mat1.get_determinant()/det;
160  double t2=mat2.get_determinant()/det;
161  double t=mat3.get_determinant()/det;
162  if (t1>-eps)
163  if (t2>-eps)
164  if (t1+t2<1+eps)
165  {
166  if (t>0) tpositif++; else tnegatif++;
167  }
168 
169 
170  }
171  else
172  {
173  OT_VECTEUR_3D n1g(xyz1,xyz);
174  if (fabs(n1g*n2)<eps)
175  {
176  pbdefinition=false;
177  break;
178  }
179  }
180  }
181  if (pbdefinition)
182  {
183  if (tnegatif%2==1) return true;
184  return false;
185  }
186 }
187 
188 return true; // ne doit jamais passer ici
189 }
190 
TPL_MAP_ENTITE::get_premier
virtual X get_premier(ITERATEUR &it)
Definition: tpl_map_entite.h:112
MG_TRIANGLE::get_segment1
virtual MG_SEGMENT * get_segment1(void)
Definition: mg_triangle.cpp:142
OT_MATRICE_3D::get_determinant
double get_determinant()
Definition: ot_mathematique.cpp:735
MAILLEUR3D::ajouter_front_courant
virtual MG_FRONT_3D * ajouter_front_courant(int numero_front, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, MG_TRIANGLE *triangle)
Definition: mailleur3d.cpp:267
fct_taille.h
gestionversion.h
mailleur3d_peau.h
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
MAILLEUR3D_PEAU::orientation_peau
virtual bool orientation_peau(void)
Definition: mailleur3d_peau.cpp:104
MAGIC::MAILLEURFRONTALETAT::NONFORCE
@ NONFORCE
Definition: mg_definition.h:114
mat2
#define mat2(i, j)
M3D_TRIANGLE::change_frontiere
virtual void change_frontiere(void)
Definition: m3d_triangle.cpp:154
M3D_TRIANGLE
Definition: m3d_triangle.h:31
m3d_triangle.h
MG_TRIANGLE::get_segment2
virtual MG_SEGMENT * get_segment2(void)
Definition: mg_triangle.cpp:147
MAILLEUR3D_PEAU::~MAILLEUR3D_PEAU
virtual ~MAILLEUR3D_PEAU()
Definition: mailleur3d_peau.cpp:38
mat1
#define mat1(i, j)
MAGIC_AFFICHE::affiche
virtual void affiche(char *mess)
Definition: magic_affiche.cpp:43
MAILLEUR3D::mg_maillage
MG_MAILLAGE * mg_maillage
Definition: mailleur3d.h:167
MG_TRIANGLE
Definition: mg_triangle.h:38
FCT_TAILLE
Definition: fct_taille.h:30
MG_VOLUME
Definition: mg_volume.h:33
MG_TRIANGLE::get_segment3
virtual MG_SEGMENT * get_segment3(void)
Definition: mg_triangle.cpp:152
MAILLEUR3D
Definition: mailleur3d.h:51
MG_SEGMENT::change_dimension_topo_null
virtual void change_dimension_topo_null(int num)
Definition: mg_segment.cpp:251
MAGIC
Definition: mg_fast_marching.cpp:40
MG_MAILLAGE::get_premier_triangle
MG_TRIANGLE * get_premier_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:912
MG_MAILLAGE::ajouter_mg_triangle
MG_TRIANGLE * ajouter_mg_triangle(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, int origine, unsigned long num=0)
Definition: mg_maillage.cpp:731
MG_MAILLAGE::supprimer_mg_triangleid
int supprimer_mg_triangleid(unsigned long num)
Definition: mg_maillage.cpp:820
OT_MATRICE_3D
Definition: ot_mathematique.h:160
TPL_MAP_ENTITE::ITERATEUR
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
Definition: tpl_map_entite.h:38
MG_ELEMENT_MAILLAGE::change_origine
virtual void change_origine(int)
Definition: mg_element_maillage.cpp:86
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
MG_TRIANGLE::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_triangle.cpp:131
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
MG_TRIANGLE::get_noeud1
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_triangle.cpp:126
MG_TRIANGLE::get_noeud3
virtual MG_NOEUD * get_noeud3(void)
Definition: mg_triangle.cpp:137
MG_GEOMETRIE
Definition: mg_geometrie.h:84
MG_MAILLAGE::get_suivant_triangle
MG_TRIANGLE * get_suivant_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:920
MG_MAILLAGE
Definition: mg_maillage.h:62
MAILLEUR3D_PEAU::cree_front
virtual void cree_front(MG_VOLUME *mgvol)
Definition: mailleur3d_peau.cpp:44
TPL_MAP_ENTITE::get_suivant
virtual X get_suivant(ITERATEUR &it)
Definition: tpl_map_entite.h:120
MAGIC::ORIGINE::TRIANGULATION
@ TRIANGULATION
Definition: mg_definition.h:79
MAGIC::ORIGINE::MAILLEUR_AUTO
@ MAILLEUR_AUTO
Definition: mg_definition.h:79
mg_volume.h
mat
#define mat(i, j)
MAILLEUR3D_PEAU::MAILLEUR3D_PEAU
MAILLEUR3D_PEAU(MG_MAILLAGE *mgmai, MG_GEOMETRIE *mggeo, MG_VOLUME *mgvol, FCT_TAILLE *fct_taille, bool save)
Definition: mailleur3d_peau.cpp:32