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 |
|