1 |
francois |
420 |
#include "gestionversion.h" |
2 |
|
|
#include "mailleur3d_peau.h" |
3 |
|
|
#include "fct_taille.h" |
4 |
|
|
#include "mg_volume.h" |
5 |
|
|
#include "m3d_triangle.h" |
6 |
|
|
|
7 |
|
|
|
8 |
|
|
|
9 |
|
|
|
10 |
|
|
|
11 |
francois |
494 |
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,TOUTDETRUIRE) |
12 |
francois |
420 |
{ |
13 |
|
|
|
14 |
|
|
} |
15 |
|
|
|
16 |
|
|
|
17 |
|
|
MAILLEUR3D_PEAU::~MAILLEUR3D_PEAU() |
18 |
|
|
{ |
19 |
|
|
} |
20 |
|
|
|
21 |
|
|
|
22 |
|
|
|
23 |
|
|
void MAILLEUR3D_PEAU::cree_front(MG_VOLUME* mgvol) |
24 |
|
|
{ |
25 |
francois |
1082 |
bool bienori=orientation_peau(); |
26 |
|
|
char chaine[255]; |
27 |
|
|
strcpy(chaine," Bonne orientation de la peau"); |
28 |
|
|
if (!bienori) strcpy(chaine," Changement d'orientation de la peau"); |
29 |
|
|
affiche(chaine); |
30 |
francois |
420 |
LISTE_MG_TRIANGLE::iterator it; |
31 |
|
|
TPL_MAP_ENTITE<M3D_TRIANGLE*> lsttrim3d; |
32 |
|
|
|
33 |
|
|
for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(it);tri!=NULL;tri=mg_maillage->get_suivant_triangle(it)) |
34 |
|
|
{ |
35 |
francois |
532 |
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()); |
36 |
francois |
420 |
nvtri->change_frontiere(); |
37 |
francois |
830 |
//if (tri->get_lien_topologie()==NULL) |
38 |
|
|
if (tri->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO) |
39 |
francois |
532 |
{ |
40 |
francois |
830 |
/*nvtri->change_origine(MAGIC::ORIGINE::IMPOSE); |
41 |
francois |
791 |
nvtri->get_noeud1()->change_origine(MAGIC::ORIGINE::IMPOSE);; |
42 |
|
|
nvtri->get_noeud2()->change_origine(MAGIC::ORIGINE::IMPOSE);; |
43 |
|
|
nvtri->get_noeud3()->change_origine(MAGIC::ORIGINE::IMPOSE);; |
44 |
|
|
nvtri->get_segment1()->change_origine(MAGIC::ORIGINE::IMPOSE);; |
45 |
|
|
nvtri->get_segment2()->change_origine(MAGIC::ORIGINE::IMPOSE);; |
46 |
|
|
nvtri->get_segment3()->change_origine(MAGIC::ORIGINE::IMPOSE);; |
47 |
francois |
532 |
nvtri->get_segment1()->change_dimension_topo_null(2); |
48 |
|
|
nvtri->get_segment2()->change_dimension_topo_null(2); |
49 |
francois |
830 |
nvtri->get_segment3()->change_dimension_topo_null(2);*/ |
50 |
|
|
nvtri->change_origine(MAGIC::ORIGINE::TRIANGULATION); |
51 |
|
|
nvtri->get_noeud1()->change_origine(MAGIC::ORIGINE::TRIANGULATION);; |
52 |
|
|
nvtri->get_noeud2()->change_origine(MAGIC::ORIGINE::TRIANGULATION);; |
53 |
|
|
nvtri->get_noeud3()->change_origine(MAGIC::ORIGINE::TRIANGULATION);; |
54 |
|
|
nvtri->get_segment1()->change_origine(MAGIC::ORIGINE::TRIANGULATION);; |
55 |
|
|
nvtri->get_segment2()->change_origine(MAGIC::ORIGINE::TRIANGULATION);; |
56 |
|
|
nvtri->get_segment3()->change_origine(MAGIC::ORIGINE::TRIANGULATION);; |
57 |
francois |
532 |
} |
58 |
francois |
830 |
if (tri->get_lien_topologie()==NULL) |
59 |
|
|
{ |
60 |
|
|
nvtri->get_segment1()->change_dimension_topo_null(2); |
61 |
|
|
nvtri->get_segment2()->change_dimension_topo_null(2); |
62 |
|
|
nvtri->get_segment3()->change_dimension_topo_null(2); |
63 |
|
|
} |
64 |
francois |
420 |
lsttrim3d.ajouter(nvtri); |
65 |
|
|
} |
66 |
|
|
|
67 |
|
|
TPL_MAP_ENTITE<M3D_TRIANGLE*>::ITERATEUR it2; |
68 |
|
|
|
69 |
|
|
for (M3D_TRIANGLE* tri=lsttrim3d.get_premier(it2);tri!=NULL;tri=lsttrim3d.get_suivant(it2)) |
70 |
|
|
{ |
71 |
|
|
mg_maillage->supprimer_mg_triangleid(tri->get_id()); |
72 |
|
|
mg_maillage->ajouter_mg_triangle(tri); |
73 |
|
|
} |
74 |
|
|
|
75 |
|
|
for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(it);tri!=NULL;tri=mg_maillage->get_suivant_triangle(it)) |
76 |
francois |
1082 |
if (bienori) ajouter_front_courant(NONFORCE,tri->get_noeud1(),tri->get_noeud2(),tri->get_noeud3(),tri); |
77 |
|
|
else ajouter_front_courant(NONFORCE,tri->get_noeud1(),tri->get_noeud3(),tri->get_noeud2(),tri); |
78 |
francois |
420 |
|
79 |
francois |
1082 |
} |
80 |
|
|
|
81 |
|
|
|
82 |
|
|
|
83 |
|
|
bool MAILLEUR3D_PEAU::orientation_peau(void) |
84 |
|
|
{ |
85 |
|
|
LISTE_MG_TRIANGLE::iterator it,itp; |
86 |
|
|
/*TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud; |
87 |
|
|
BOITE_3D boite=mg_maillage->get_premier_triangle(it)->get_noeud1()->get_boite_3D(); |
88 |
|
|
for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(it);tri!=NULL;tri=mg_maillage->get_suivant_triangle(it)) |
89 |
|
|
{ |
90 |
|
|
lstnoeud.ajouter(tri->get_noeud1()); |
91 |
|
|
lstnoeud.ajouter(tri->get_noeud2()); |
92 |
|
|
lstnoeud.ajouter(tri->get_noeud3()); |
93 |
|
|
boite=boite+tri->get_noeud1()->get_boite_3D(); |
94 |
|
|
boite=boite+tri->get_noeud2()->get_boite_3D(); |
95 |
|
|
boite=boite+tri->get_noeud3()->get_boite_3D(); |
96 |
|
|
} |
97 |
|
|
TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> octree; |
98 |
|
|
octree.initialiser(&lstnoeud,1,boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax()); |
99 |
|
|
for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(it);tri!=NULL;tri=mg_maillage->get_suivant_triangle(it)) |
100 |
|
|
octree.inserer(tri); |
101 |
|
|
*/ |
102 |
|
|
|
103 |
|
|
for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(itp);tri!=NULL;tri=mg_maillage->get_suivant_triangle(itp)) |
104 |
|
|
{ |
105 |
|
|
double *xyz1=tri->get_noeud1()->get_coord(); |
106 |
|
|
double *xyz2=tri->get_noeud2()->get_coord(); |
107 |
|
|
double *xyz3=tri->get_noeud3()->get_coord(); |
108 |
|
|
OT_VECTEUR_3D n1n2(xyz1,xyz2); |
109 |
|
|
OT_VECTEUR_3D n1n3(xyz1,xyz3); |
110 |
|
|
OT_VECTEUR_3D n=n1n3&n1n2; |
111 |
|
|
n.norme(); |
112 |
|
|
double xyz[3]; |
113 |
|
|
xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0])/3.; |
114 |
|
|
xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1])/3.; |
115 |
|
|
xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2])/3.; |
116 |
|
|
double eps=1e-6; |
117 |
|
|
bool pbdefinition=true; |
118 |
|
|
int tpositif=0,tnegatif=0; |
119 |
|
|
for (MG_TRIANGLE* tri2=mg_maillage->get_premier_triangle(it);tri2!=NULL;tri2=mg_maillage->get_suivant_triangle(it)) |
120 |
|
|
{ |
121 |
|
|
if (tri2==tri) continue; |
122 |
|
|
double *xyz1=tri2->get_noeud1()->get_coord(); |
123 |
|
|
double *xyz2=tri2->get_noeud2()->get_coord(); |
124 |
|
|
double *xyz3=tri2->get_noeud3()->get_coord(); |
125 |
|
|
OT_VECTEUR_3D n1n2(xyz1,xyz2); |
126 |
|
|
OT_VECTEUR_3D n1n3(xyz1,xyz3); |
127 |
|
|
OT_VECTEUR_3D n2=n1n3&n1n2; |
128 |
|
|
n2.norme(); |
129 |
|
|
if (fabs(n2*n)<1-eps) |
130 |
|
|
{ |
131 |
|
|
OT_VECTEUR_3D vec3=(-n); |
132 |
|
|
OT_MATRICE_3D mat(n1n2,n1n3,vec3); |
133 |
|
|
OT_VECTEUR_3D b(xyz1,xyz); |
134 |
|
|
OT_MATRICE_3D mat1(b,n1n3,vec3); |
135 |
|
|
OT_MATRICE_3D mat2(n1n2,b,vec3); |
136 |
|
|
OT_MATRICE_3D mat3(n1n2,n1n3,b); |
137 |
|
|
double det=mat.get_determinant(); |
138 |
|
|
double t1=mat1.get_determinant()/det; |
139 |
|
|
double t2=mat2.get_determinant()/det; |
140 |
|
|
double t=mat3.get_determinant()/det; |
141 |
|
|
if (t1>-eps) |
142 |
|
|
if (t2>-eps) |
143 |
|
|
if (t1+t2<1+eps) |
144 |
|
|
{ |
145 |
|
|
if (t>0) tpositif++; else tnegatif++; |
146 |
|
|
} |
147 |
|
|
|
148 |
|
|
|
149 |
|
|
} |
150 |
|
|
else |
151 |
|
|
{ |
152 |
|
|
OT_VECTEUR_3D n1g(xyz1,xyz); |
153 |
|
|
if (fabs(n1g*n2)<eps) |
154 |
|
|
{ |
155 |
|
|
pbdefinition=false; |
156 |
|
|
break; |
157 |
|
|
} |
158 |
|
|
} |
159 |
|
|
} |
160 |
|
|
if (pbdefinition) |
161 |
|
|
{ |
162 |
|
|
if (tnegatif%2==1) return true; |
163 |
|
|
return false; |
164 |
|
|
} |
165 |
|
|
} |
166 |
|
|
|
167 |
|
|
return true; // ne doit jamais passer ici |
168 |
|
|
} |
169 |
|
|
|