ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_peau.cpp
Revision: 1189
Committed: Tue Feb 4 17:26:49 2025 UTC (3 months ago) by francois
File size: 7177 byte(s)
Log Message:
Version 5.0 de MAGIC. Integration de ALGLIB pour faire de l'optimisation. ALGLIB se download automatiquement en executant un script dans le repertoire config update_magic.bash


File Contents

# Content
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
38 MAILLEUR3D_PEAU::~MAILLEUR3D_PEAU()
39 {
40 }
41
42
43
44 void MAILLEUR3D_PEAU::cree_front(MG_VOLUME* mgvol)
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;
52 TPL_MAP_ENTITE<M3D_TRIANGLE*> lsttrim3d;
53
54 for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(it);tri!=NULL;tri=mg_maillage->get_suivant_triangle(it))
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);*/
71 nvtri->change_origine(MAGIC::ORIGINE::TRIANGULATION);
72 nvtri->get_noeud1()->change_origine(MAGIC::ORIGINE::TRIANGULATION);;
73 nvtri->get_noeud2()->change_origine(MAGIC::ORIGINE::TRIANGULATION);;
74 nvtri->get_noeud3()->change_origine(MAGIC::ORIGINE::TRIANGULATION);;
75 nvtri->get_segment1()->change_origine(MAGIC::ORIGINE::TRIANGULATION);;
76 nvtri->get_segment2()->change_origine(MAGIC::ORIGINE::TRIANGULATION);;
77 nvtri->get_segment3()->change_origine(MAGIC::ORIGINE::TRIANGULATION);;
78 }
79 if (tri->get_lien_topologie()==NULL)
80 {
81 nvtri->get_segment1()->change_dimension_topo_null(2);
82 nvtri->get_segment2()->change_dimension_topo_null(2);
83 nvtri->get_segment3()->change_dimension_topo_null(2);
84 }
85 lsttrim3d.ajouter(nvtri);
86 }
87
88 TPL_MAP_ENTITE<M3D_TRIANGLE*>::ITERATEUR it2;
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());
93 mg_maillage->ajouter_mg_triangle(tri);
94 }
95
96 for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(it);tri!=NULL;tri=mg_maillage->get_suivant_triangle(it))
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
104 bool MAILLEUR3D_PEAU::orientation_peau(void)
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
124 for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(itp);tri!=NULL;tri=mg_maillage->get_suivant_triangle(itp))
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;
140 for (MG_TRIANGLE* tri2=mg_maillage->get_premier_triangle(it);tri2!=NULL;tri2=mg_maillage->get_suivant_triangle(it))
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