1 |
#include "gestionversion.h" |
2 |
#include "mailleur_analyse.h" |
3 |
#include "mg_gestionnaire.h" |
4 |
#include "m3d_triangle.h" |
5 |
#include "tpl_fonctions_generiques.h" |
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
MAILLEUR_ANALYSE::MAILLEUR_ANALYSE(MG_MAILLAGE* m,OT_CPU* comp):MAILLEUR(comp),mai(m),borne1(0.1),borne2(0.2),borne3(0.5) |
14 |
{ |
15 |
|
16 |
} |
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
MAILLEUR_ANALYSE::MAILLEUR_ANALYSE(MAILLEUR_ANALYSE &mdd):MAILLEUR(mdd),mai(mdd.mai),borne1(mdd.borne1),borne2(mdd.borne2),borne3(mdd.borne3) |
23 |
{ |
24 |
|
25 |
} |
26 |
|
27 |
|
28 |
|
29 |
MAILLEUR_ANALYSE::~MAILLEUR_ANALYSE() |
30 |
{ |
31 |
|
32 |
} |
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
void MAILLEUR_ANALYSE::analyse(char *nom) |
39 |
{ |
40 |
char mess[500]; |
41 |
sprintf(mess,"ANALYSEUR DE MG MAILLAGE 3D"); |
42 |
affiche(mess); |
43 |
sprintf(mess,"---------------------------"); |
44 |
affiche(mess); |
45 |
sprintf(mess,""); |
46 |
affiche(mess); |
47 |
|
48 |
LISTE_MG_NOEUD::iterator itn; |
49 |
for (MG_NOEUD* no=mai->get_premier_noeud(itn);no!=NULL;no=mai->get_suivant_noeud(itn)) |
50 |
no->change_nouveau_numero(0); |
51 |
|
52 |
LISTE_MG_SEGMENT::iterator its; |
53 |
for (MG_SEGMENT* seg=mai->get_premier_segment(its);seg!=NULL;seg=mai->get_suivant_segment(its)) |
54 |
seg->change_nouveau_numero(0); |
55 |
|
56 |
|
57 |
LISTE_MG_TRIANGLE::iterator ittr; |
58 |
for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittr);tri!=NULL;tri=mai->get_suivant_triangle(ittr)) |
59 |
tri->change_nouveau_numero(0); |
60 |
|
61 |
LISTE_MG_QUADRANGLE::iterator itq; |
62 |
for (MG_QUADRANGLE* quad=mai->get_premier_quadrangle(itq);quad!=NULL;quad=mai->get_suivant_quadrangle(itq)) |
63 |
quad->change_nouveau_numero(0); |
64 |
|
65 |
LISTE_MG_TETRA::iterator itt; |
66 |
for (MG_TETRA* tet=mai->get_premier_tetra(itt);tet!=NULL;tet=mai->get_suivant_tetra(itt)) |
67 |
{ |
68 |
tet->get_triangle1()->change_nouveau_numero(tet->get_triangle1()->get_nouveau_numero()+1); |
69 |
tet->get_triangle2()->change_nouveau_numero(tet->get_triangle2()->get_nouveau_numero()+1); |
70 |
tet->get_triangle3()->change_nouveau_numero(tet->get_triangle3()->get_nouveau_numero()+1); |
71 |
tet->get_triangle4()->change_nouveau_numero(tet->get_triangle4()->get_nouveau_numero()+1); |
72 |
} |
73 |
|
74 |
LISTE_MG_HEXA::iterator ith; |
75 |
for (MG_HEXA* hex=mai->get_premier_hexa(ith);hex!=NULL;hex=mai->get_suivant_hexa(ith)) |
76 |
{ |
77 |
hex->get_quadrangle1()->change_nouveau_numero(hex->get_quadrangle1()->get_nouveau_numero()+1); |
78 |
hex->get_quadrangle2()->change_nouveau_numero(hex->get_quadrangle2()->get_nouveau_numero()+1); |
79 |
hex->get_quadrangle3()->change_nouveau_numero(hex->get_quadrangle3()->get_nouveau_numero()+1); |
80 |
hex->get_quadrangle4()->change_nouveau_numero(hex->get_quadrangle4()->get_nouveau_numero()+1); |
81 |
hex->get_quadrangle5()->change_nouveau_numero(hex->get_quadrangle5()->get_nouveau_numero()+1); |
82 |
hex->get_quadrangle6()->change_nouveau_numero(hex->get_quadrangle6()->get_nouveau_numero()+1); |
83 |
} |
84 |
int nbtrifront=0; |
85 |
for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittr);tri!=NULL;tri=mai->get_suivant_triangle(ittr)) |
86 |
{ |
87 |
if (mai->get_nb_mg_tetra()==0) |
88 |
tri->change_nouveau_numero(1); |
89 |
if (tri->get_nouveau_numero()==1) |
90 |
{ |
91 |
nbtrifront++; |
92 |
tri->get_segment1()->change_nouveau_numero(tri->get_segment1()->get_nouveau_numero()+1); |
93 |
tri->get_segment2()->change_nouveau_numero(tri->get_segment2()->get_nouveau_numero()+1); |
94 |
tri->get_segment3()->change_nouveau_numero(tri->get_segment3()->get_nouveau_numero()+1); |
95 |
tri->get_noeud1()->change_nouveau_numero(1); |
96 |
tri->get_noeud2()->change_nouveau_numero(1); |
97 |
tri->get_noeud3()->change_nouveau_numero(1); |
98 |
|
99 |
} |
100 |
} |
101 |
int nbquadfront=0; |
102 |
for (MG_QUADRANGLE* quad=mai->get_premier_quadrangle(itq);quad!=NULL;quad=mai->get_suivant_quadrangle(itq)) |
103 |
{ |
104 |
if (mai->get_nb_mg_hexa()==0) |
105 |
quad->change_nouveau_numero(1); |
106 |
if (quad->get_nouveau_numero()==1) |
107 |
{ |
108 |
nbquadfront++; |
109 |
quad->get_segment1()->change_nouveau_numero(quad->get_segment1()->get_nouveau_numero()+1); |
110 |
quad->get_segment2()->change_nouveau_numero(quad->get_segment2()->get_nouveau_numero()+1); |
111 |
quad->get_segment3()->change_nouveau_numero(quad->get_segment3()->get_nouveau_numero()+1); |
112 |
quad->get_segment4()->change_nouveau_numero(quad->get_segment4()->get_nouveau_numero()+1); |
113 |
quad->get_noeud1()->change_nouveau_numero(1); |
114 |
quad->get_noeud2()->change_nouveau_numero(1); |
115 |
quad->get_noeud3()->change_nouveau_numero(1); |
116 |
quad->get_noeud4()->change_nouveau_numero(1); |
117 |
} |
118 |
} |
119 |
int nbsegfront=0; |
120 |
for (MG_SEGMENT* seg=mai->get_premier_segment(its);seg!=NULL;seg=mai->get_suivant_segment(its)) |
121 |
if (seg->get_nouveau_numero()==2) nbsegfront++; |
122 |
int nbnofront=0; |
123 |
for (MG_NOEUD* no=mai->get_premier_noeud(itn);no!=NULL;no=mai->get_suivant_noeud(itn)) |
124 |
if (no->get_nouveau_numero()==1) nbnofront++; |
125 |
sprintf(mess," Maillage numero : %lu",mai->get_id());affiche(mess); |
126 |
sprintf(mess," %d noeuds",mai->get_nb_mg_noeud()); affiche(mess); |
127 |
sprintf(mess," %d segments",mai->get_nb_mg_segment()); affiche(mess); |
128 |
sprintf(mess," %d triangles",mai->get_nb_mg_triangle()); affiche(mess); |
129 |
sprintf(mess," %d quadrangles",mai->get_nb_mg_quadrangle()); affiche(mess); |
130 |
sprintf(mess," %d tetras",mai->get_nb_mg_tetra()); affiche(mess); |
131 |
sprintf(mess," %d hexas",mai->get_nb_mg_hexa()); affiche(mess); affiche(""); |
132 |
sprintf(mess," %d noeuds frontiere",nbnofront); affiche(mess); |
133 |
sprintf(mess," %d segments frontiere",nbsegfront); affiche(mess); |
134 |
sprintf(mess," %d triangles frontiere",nbtrifront); affiche(mess); |
135 |
sprintf(mess," %d quadrangles frontiere",nbquadfront); affiche(mess);affiche(""); |
136 |
|
137 |
MG_SOLUTION *sol=NULL; |
138 |
if (nom!=NULL) |
139 |
{ |
140 |
std::string nomsol=nom;nomsol=nomsol+".sol"; |
141 |
if (mai->get_nb_mg_tetra()==0) sol=new MG_SOLUTION(mai,1,(char*)nomsol.c_str(),mai->get_nb_mg_triangle(),"Qualité",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2,MAGIC::TYPE_SOLUTION::SCALAIRE); |
142 |
if (mai->get_nb_mg_tetra()!=0) sol=new MG_SOLUTION(mai,1,(char*)nomsol.c_str(),mai->get_nb_mg_tetra(),"Qualité",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3,MAGIC::TYPE_SOLUTION::SCALAIRE); |
143 |
mai->get_gestionnaire()->ajouter_mg_solution(sol); |
144 |
} |
145 |
double qualmin=1e300,qualmax=-1e300,qualmoy=0.; |
146 |
int tab2[5]={0,0,0,0,0}; |
147 |
int itri=0; |
148 |
for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittr);tri!=NULL;tri=mai->get_suivant_triangle(ittr)) |
149 |
if (tri->get_nouveau_numero()==1) |
150 |
{ |
151 |
double qual=OPERATEUR::qualite_triangle(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord(),tri->get_noeud3()->get_coord()); |
152 |
MG_NOEUD * no1=tri->get_noeud1(); |
153 |
MG_NOEUD * no2=tri->get_noeud1(); |
154 |
MG_NOEUD * no3=tri->get_noeud1(); |
155 |
int nb1=no1->get_lien_triangle()->get_nb(); |
156 |
int nb2=no2->get_lien_triangle()->get_nb(); |
157 |
int nb3=no3->get_lien_triangle()->get_nb(); |
158 |
OT_VECTEUR_3D vec1(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord()); |
159 |
OT_VECTEUR_3D vec2(tri->get_noeud1()->get_coord(),tri->get_noeud3()->get_coord()); |
160 |
OT_VECTEUR_3D normal=vec1&vec2; |
161 |
normal.norme(); |
162 |
int nbretourne=0; |
163 |
for (int i=0;i<nb1;i++) |
164 |
for (int j=0;j<nb2;j++) |
165 |
for (int k=0;k<nb3;k++) |
166 |
{ |
167 |
MG_TRIANGLE* tri1=no1->get_lien_triangle()->get(i); |
168 |
MG_TRIANGLE* tri2=no2->get_lien_triangle()->get(j); |
169 |
MG_TRIANGLE* tri3=no3->get_lien_triangle()->get(k); |
170 |
if ((tri1==tri2) && (tri1==tri3) && (tri1!=tri) && (tri1->get_nouveau_numero()==1)) |
171 |
{ |
172 |
OT_VECTEUR_3D vec1tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord()); |
173 |
OT_VECTEUR_3D vec2tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord()); |
174 |
OT_VECTEUR_3D normaltmp=vec1tmp&vec2tmp; |
175 |
normaltmp.norme(); |
176 |
double psca=normal*normaltmp; |
177 |
if (psca<-0.999) nbretourne++; |
178 |
} |
179 |
} |
180 |
if (nbretourne>1) qual=-qual; |
181 |
qualmoy=qualmoy+qual; |
182 |
if (qual<qualmin) qualmin=qual; |
183 |
if (qual>qualmax) qualmax=qual; |
184 |
if (qual<0.) tab2[0]++; |
185 |
else if (qual<borne1) tab2[1]++; |
186 |
else if (qual<borne2) tab2[2]++; |
187 |
else if (qual<borne3) tab2[3]++; |
188 |
else tab2[4]++; |
189 |
if (sol!=NULL) |
190 |
if (mai->get_nb_mg_tetra()==0) sol->ecrire(qual,itri,0); |
191 |
itri++; |
192 |
} |
193 |
if (nbtrifront!=0) |
194 |
{ |
195 |
sprintf(mess," qualite moyenne des triangles de frontiere %lf",qualmoy/nbtrifront); affiche(mess); |
196 |
sprintf(mess," qualite min des triangles de frontiere %lf",qualmin); affiche(mess); |
197 |
sprintf(mess," qualite max des triangles de frontiere %lf",qualmax); affiche(mess); |
198 |
sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne3,tab2[4],tab2[4]*100./nbtrifront); affiche(mess); |
199 |
sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne2,tab2[3],tab2[3]*100./nbtrifront); affiche(mess); |
200 |
sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne1,tab2[2],tab2[2]*100./nbtrifront); affiche(mess); |
201 |
sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",0.,tab2[1],tab2[1]*100./nbtrifront); affiche(mess); |
202 |
sprintf(mess," nombre de triangles de frontiere retournes : %d (%.2lf%%)",tab2[0],tab2[0]*100./nbtrifront); affiche(mess); affiche(""); |
203 |
} |
204 |
|
205 |
|
206 |
|
207 |
qualmin=1e300,qualmax=-1e300,qualmoy=0.; |
208 |
int tab3[5]={0,0,0,0,0}; |
209 |
int itet=0; |
210 |
for (MG_TETRA* tet=mai->get_premier_tetra(itt);tet!=NULL;tet=mai->get_suivant_tetra(itt)) |
211 |
{ |
212 |
double qual=OPERATEUR::qualite_tetra(tet->get_noeud1()->get_coord(),tet->get_noeud2()->get_coord(),tet->get_noeud3()->get_coord(),tet->get_noeud4()->get_coord()); |
213 |
OT_VECTEUR_3D vec1(tet->get_noeud1()->get_coord(),tet->get_noeud2()->get_coord()); |
214 |
OT_VECTEUR_3D vec2(tet->get_noeud1()->get_coord(),tet->get_noeud3()->get_coord()); |
215 |
OT_VECTEUR_3D vec3(tet->get_noeud1()->get_coord(),tet->get_noeud4()->get_coord()); |
216 |
OT_VECTEUR_3D pvec=vec1&vec2; |
217 |
double psca=pvec*vec3; |
218 |
if (psca<0.) qual=-qual; |
219 |
qualmoy=qualmoy+qual; |
220 |
if (qual<qualmin) qualmin=qual; |
221 |
if (qual>qualmax) qualmax=qual; |
222 |
if (qual<0.) tab3[0]++; |
223 |
else if (qual<borne1) tab3[1]++; |
224 |
else if (qual<borne2) tab3[2]++; |
225 |
else if (qual<borne3) tab3[3]++; |
226 |
else tab3[4]++; |
227 |
if (sol!=NULL) |
228 |
sol->ecrire(qual,itet,0); |
229 |
itet++; |
230 |
} |
231 |
if (mai->get_nb_mg_tetra()!=0) |
232 |
{ |
233 |
sprintf(mess," qualite moyenne des tetra %lf",qualmoy/mai->get_nb_mg_tetra()); affiche(mess); |
234 |
sprintf(mess," qualite min des tetra %lf",qualmin); affiche(mess); |
235 |
sprintf(mess," qualite max des tetra %lf",qualmax); affiche(mess); |
236 |
sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",borne3,tab3[4],tab3[4]*100./mai->get_nb_mg_tetra()); affiche(mess); |
237 |
sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",borne2,tab3[3],tab3[3]*100./mai->get_nb_mg_tetra()); affiche(mess); |
238 |
sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",borne1,tab3[2],tab3[2]*100./mai->get_nb_mg_tetra()); affiche(mess); |
239 |
sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",0.,tab3[1],tab3[1]*100./mai->get_nb_mg_tetra()); affiche(mess); |
240 |
sprintf(mess," nombre de tetra retournes : %d (%.2lf%%)",tab3[0],tab3[0]*100./mai->get_nb_mg_tetra()); affiche(mess); |
241 |
int nbsegcorrect=0; |
242 |
int nbsegincorrect=0; |
243 |
for (MG_SEGMENT* seg=mai->get_premier_segment(its);seg!=NULL;seg=mai->get_suivant_segment(its)) |
244 |
if (seg->get_nouveau_numero()!=2) |
245 |
{ |
246 |
MG_NOEUD* no1=seg->get_noeud1(); |
247 |
MG_NOEUD* no2=seg->get_noeud2(); |
248 |
int nb1=no1->get_lien_tetra()->get_nb(); |
249 |
int nb2=no2->get_lien_tetra()->get_nb(); |
250 |
double angletot=0; |
251 |
for (int i=0;i<nb1;i++) |
252 |
for (int j=0;j<nb2;j++) |
253 |
{ |
254 |
MG_TETRA* tet1=no1->get_lien_tetra()->get(i); |
255 |
MG_TETRA* tet2=no2->get_lien_tetra()->get(j); |
256 |
if (tet1==tet2) |
257 |
{ |
258 |
MG_NOEUD *nn1,*nn2,*nn3,*nn4; |
259 |
if (tet1->get_noeud1()==no1) nn1=tet1->get_noeud1(); |
260 |
if (tet1->get_noeud2()==no1) nn1=tet1->get_noeud2(); |
261 |
if (tet1->get_noeud3()==no1) nn1=tet1->get_noeud3(); |
262 |
if (tet1->get_noeud4()==no1) nn1=tet1->get_noeud4(); |
263 |
if (tet1->get_noeud1()==no2) nn2=tet1->get_noeud1(); |
264 |
if (tet1->get_noeud2()==no2) nn2=tet1->get_noeud2(); |
265 |
if (tet1->get_noeud3()==no2) nn2=tet1->get_noeud3(); |
266 |
if (tet1->get_noeud4()==no2) nn2=tet1->get_noeud4(); |
267 |
if (tet1->get_noeud1()!=nn1) |
268 |
if (tet1->get_noeud1()!=nn2) nn3=tet1->get_noeud1(); |
269 |
if (tet1->get_noeud2()!=nn1) |
270 |
if (tet1->get_noeud2()!=nn2) nn3=tet1->get_noeud2(); |
271 |
if (tet1->get_noeud3()!=nn1) |
272 |
if (tet1->get_noeud3()!=nn2) nn3=tet1->get_noeud3(); |
273 |
if (tet1->get_noeud4()!=nn1) |
274 |
if (tet1->get_noeud4()!=nn2) nn3=tet1->get_noeud4(); |
275 |
if (tet1->get_noeud1()!=nn1) |
276 |
if (tet1->get_noeud1()!=nn2) |
277 |
if (tet1->get_noeud1()!=nn3) nn4=tet1->get_noeud1(); |
278 |
if (tet1->get_noeud2()!=nn1) |
279 |
if (tet1->get_noeud2()!=nn2) |
280 |
if (tet1->get_noeud2()!=nn3) nn4=tet1->get_noeud2(); |
281 |
if (tet1->get_noeud3()!=nn1) |
282 |
if (tet1->get_noeud3()!=nn2) |
283 |
if (tet1->get_noeud3()!=nn3) nn4=tet1->get_noeud3(); |
284 |
if (tet1->get_noeud4()!=nn1) |
285 |
if (tet1->get_noeud4()!=nn2) |
286 |
if (tet1->get_noeud4()!=nn3) nn4=tet1->get_noeud4(); |
287 |
double angle=get_angle_par_noeud<MG_NOEUD*>(nn1,nn2,nn3,nn1,nn2,nn4); |
288 |
if (angle>M_PI) angle=2.*M_PI-angle; |
289 |
angletot=angletot+angle; |
290 |
|
291 |
} |
292 |
} |
293 |
if ((angletot<2*M_PI-0.001) || (angletot>2*M_PI+0.001)) |
294 |
{ |
295 |
sprintf(mess," segment %lu angle matiere autour de %.2lf",seg->get_id(),angletot); affiche(mess); |
296 |
nbsegincorrect++; |
297 |
} |
298 |
else nbsegcorrect++; |
299 |
} |
300 |
sprintf(mess," segment correct %d(%.2lf%%) segment incorrect %d(%.2lf%%) ",nbsegcorrect,nbsegcorrect*100./(nbsegcorrect+nbsegincorrect),nbsegincorrect,nbsegincorrect*100./(nbsegcorrect+nbsegincorrect)); affiche(mess); |
301 |
} |
302 |
|
303 |
if (nom!=NULL) |
304 |
{ |
305 |
std::string nomf=nom; |
306 |
nomf=nomf+".magic"; |
307 |
mai->get_gestionnaire()->enregistrer((char*)nomf.c_str()); |
308 |
} |
309 |
} |