ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_analyse.cpp
Revision: 660
Committed: Thu Mar 5 21:18:28 2015 UTC (10 years, 2 months ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur_analyse.cpp
File size: 17019 byte(s)
Log Message:
Suppression des warning apparus avec le passage a Ubuntu 14.04

File Contents

# User Rev Content
1 francois 425 #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 francois 514 #include "fct_taille.h"
7 francois 425
8    
9    
10    
11    
12    
13 francois 426 MAILLEUR_ANALYSE::MAILLEUR_ANALYSE(MG_MAILLAGE* m,OT_CPU* comp):MAILLEUR(comp),mai(m),borne1(0.1),borne2(0.2),borne3(0.5),eps_angle_retourne(0.03)
14 francois 425 {
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 francois 426 void MAILLEUR_ANALYSE::change_borne(double val1,double val2,double val3)
35     {
36     borne1=val1;
37     borne2=val2;
38     borne3=val3;
39     }
40 francois 425
41 francois 426 void MAILLEUR_ANALYSE::get_borne(double &val1,double &val2,double &val3)
42     {
43     val1=borne1;
44     val2=borne2;
45     val3=borne3;
46     }
47 francois 425
48 francois 426 void MAILLEUR_ANALYSE::change_eps_angle_retourne(double val)
49     {
50     eps_angle_retourne=val;
51     }
52 francois 425
53 francois 426 double MAILLEUR_ANALYSE::get_eps_angle_retourne(void)
54     {
55     return eps_angle_retourne;
56     }
57 francois 425
58 francois 426
59 francois 425 void MAILLEUR_ANALYSE::analyse(char *nom)
60     {
61     char mess[500];
62     sprintf(mess,"ANALYSEUR DE MG MAILLAGE 3D");
63     affiche(mess);
64     sprintf(mess,"---------------------------");
65     affiche(mess);
66 francois 660 affiche((char*)"");
67 francois 425
68     LISTE_MG_NOEUD::iterator itn;
69     for (MG_NOEUD* no=mai->get_premier_noeud(itn);no!=NULL;no=mai->get_suivant_noeud(itn))
70     no->change_nouveau_numero(0);
71    
72     LISTE_MG_SEGMENT::iterator its;
73     for (MG_SEGMENT* seg=mai->get_premier_segment(its);seg!=NULL;seg=mai->get_suivant_segment(its))
74     seg->change_nouveau_numero(0);
75    
76    
77     LISTE_MG_TRIANGLE::iterator ittr;
78     for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittr);tri!=NULL;tri=mai->get_suivant_triangle(ittr))
79     tri->change_nouveau_numero(0);
80    
81     LISTE_MG_QUADRANGLE::iterator itq;
82     for (MG_QUADRANGLE* quad=mai->get_premier_quadrangle(itq);quad!=NULL;quad=mai->get_suivant_quadrangle(itq))
83     quad->change_nouveau_numero(0);
84    
85     LISTE_MG_TETRA::iterator itt;
86     for (MG_TETRA* tet=mai->get_premier_tetra(itt);tet!=NULL;tet=mai->get_suivant_tetra(itt))
87     {
88     tet->get_triangle1()->change_nouveau_numero(tet->get_triangle1()->get_nouveau_numero()+1);
89     tet->get_triangle2()->change_nouveau_numero(tet->get_triangle2()->get_nouveau_numero()+1);
90     tet->get_triangle3()->change_nouveau_numero(tet->get_triangle3()->get_nouveau_numero()+1);
91     tet->get_triangle4()->change_nouveau_numero(tet->get_triangle4()->get_nouveau_numero()+1);
92     }
93    
94     LISTE_MG_HEXA::iterator ith;
95     for (MG_HEXA* hex=mai->get_premier_hexa(ith);hex!=NULL;hex=mai->get_suivant_hexa(ith))
96     {
97     hex->get_quadrangle1()->change_nouveau_numero(hex->get_quadrangle1()->get_nouveau_numero()+1);
98     hex->get_quadrangle2()->change_nouveau_numero(hex->get_quadrangle2()->get_nouveau_numero()+1);
99     hex->get_quadrangle3()->change_nouveau_numero(hex->get_quadrangle3()->get_nouveau_numero()+1);
100     hex->get_quadrangle4()->change_nouveau_numero(hex->get_quadrangle4()->get_nouveau_numero()+1);
101     hex->get_quadrangle5()->change_nouveau_numero(hex->get_quadrangle5()->get_nouveau_numero()+1);
102     hex->get_quadrangle6()->change_nouveau_numero(hex->get_quadrangle6()->get_nouveau_numero()+1);
103     }
104     int nbtrifront=0;
105     for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittr);tri!=NULL;tri=mai->get_suivant_triangle(ittr))
106     {
107     if (mai->get_nb_mg_tetra()==0)
108     tri->change_nouveau_numero(1);
109     if (tri->get_nouveau_numero()==1)
110     {
111     nbtrifront++;
112     tri->get_segment1()->change_nouveau_numero(tri->get_segment1()->get_nouveau_numero()+1);
113     tri->get_segment2()->change_nouveau_numero(tri->get_segment2()->get_nouveau_numero()+1);
114     tri->get_segment3()->change_nouveau_numero(tri->get_segment3()->get_nouveau_numero()+1);
115     tri->get_noeud1()->change_nouveau_numero(1);
116     tri->get_noeud2()->change_nouveau_numero(1);
117     tri->get_noeud3()->change_nouveau_numero(1);
118    
119     }
120     }
121     int nbquadfront=0;
122     for (MG_QUADRANGLE* quad=mai->get_premier_quadrangle(itq);quad!=NULL;quad=mai->get_suivant_quadrangle(itq))
123     {
124     if (mai->get_nb_mg_hexa()==0)
125     quad->change_nouveau_numero(1);
126     if (quad->get_nouveau_numero()==1)
127     {
128     nbquadfront++;
129     quad->get_segment1()->change_nouveau_numero(quad->get_segment1()->get_nouveau_numero()+1);
130     quad->get_segment2()->change_nouveau_numero(quad->get_segment2()->get_nouveau_numero()+1);
131     quad->get_segment3()->change_nouveau_numero(quad->get_segment3()->get_nouveau_numero()+1);
132     quad->get_segment4()->change_nouveau_numero(quad->get_segment4()->get_nouveau_numero()+1);
133     quad->get_noeud1()->change_nouveau_numero(1);
134     quad->get_noeud2()->change_nouveau_numero(1);
135     quad->get_noeud3()->change_nouveau_numero(1);
136     quad->get_noeud4()->change_nouveau_numero(1);
137     }
138     }
139     int nbsegfront=0;
140     for (MG_SEGMENT* seg=mai->get_premier_segment(its);seg!=NULL;seg=mai->get_suivant_segment(its))
141     if (seg->get_nouveau_numero()==2) nbsegfront++;
142     int nbnofront=0;
143     for (MG_NOEUD* no=mai->get_premier_noeud(itn);no!=NULL;no=mai->get_suivant_noeud(itn))
144     if (no->get_nouveau_numero()==1) nbnofront++;
145     sprintf(mess," Maillage numero : %lu",mai->get_id());affiche(mess);
146     sprintf(mess," %d noeuds",mai->get_nb_mg_noeud()); affiche(mess);
147     sprintf(mess," %d segments",mai->get_nb_mg_segment()); affiche(mess);
148     sprintf(mess," %d triangles",mai->get_nb_mg_triangle()); affiche(mess);
149     sprintf(mess," %d quadrangles",mai->get_nb_mg_quadrangle()); affiche(mess);
150     sprintf(mess," %d tetras",mai->get_nb_mg_tetra()); affiche(mess);
151 francois 479 sprintf(mess," %d hexas",mai->get_nb_mg_hexa()); affiche(mess); affiche((char*)"");
152 francois 425 sprintf(mess," %d noeuds frontiere",nbnofront); affiche(mess);
153     sprintf(mess," %d segments frontiere",nbsegfront); affiche(mess);
154     sprintf(mess," %d triangles frontiere",nbtrifront); affiche(mess);
155 francois 479 sprintf(mess," %d quadrangles frontiere",nbquadfront); affiche(mess);affiche((char*)"");
156 francois 425
157     MG_SOLUTION *sol=NULL;
158     if (nom!=NULL)
159     {
160     std::string nomsol=nom;nomsol=nomsol+".sol";
161     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);
162     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);
163     mai->get_gestionnaire()->ajouter_mg_solution(sol);
164     }
165     double qualmin=1e300,qualmax=-1e300,qualmoy=0.;
166 francois 429 int tab2[7]={0,0,0,0,0,0,0};
167 francois 425 int itri=0;
168     for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittr);tri!=NULL;tri=mai->get_suivant_triangle(ittr))
169     if (tri->get_nouveau_numero()==1)
170     {
171     double qual=OPERATEUR::qualite_triangle(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord(),tri->get_noeud3()->get_coord());
172     MG_NOEUD * no1=tri->get_noeud1();
173 francois 429 MG_NOEUD * no2=tri->get_noeud2();
174     MG_NOEUD * no3=tri->get_noeud3();
175     if (no1==no2)
176     if (no1==no3)
177     tab2[6]++;
178 francois 425 int nb1=no1->get_lien_triangle()->get_nb();
179     int nb2=no2->get_lien_triangle()->get_nb();
180     int nb3=no3->get_lien_triangle()->get_nb();
181     OT_VECTEUR_3D vec1(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord());
182     OT_VECTEUR_3D vec2(tri->get_noeud1()->get_coord(),tri->get_noeud3()->get_coord());
183     OT_VECTEUR_3D normal=vec1&vec2;
184     normal.norme();
185     int nbretourne=0;
186 francois 429 int nbvoisin=0;
187 francois 425 for (int i=0;i<nb1;i++)
188     for (int j=0;j<nb2;j++)
189     {
190     MG_TRIANGLE* tri1=no1->get_lien_triangle()->get(i);
191     MG_TRIANGLE* tri2=no2->get_lien_triangle()->get(j);
192 francois 429 if ( (tri1==tri2) && (tri1!=tri) && (tri1->get_nouveau_numero()==1))
193 francois 425 {
194     OT_VECTEUR_3D vec1tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
195     OT_VECTEUR_3D vec2tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
196     OT_VECTEUR_3D normaltmp=vec1tmp&vec2tmp;
197     normaltmp.norme();
198     double psca=normal*normaltmp;
199 francois 426 if (psca<-cos(eps_angle_retourne)) nbretourne++;
200 francois 429 nbvoisin++;
201 francois 425 }
202     }
203 francois 429 for (int i=0;i<nb1;i++)
204     for (int j=0;j<nb3;j++)
205     {
206     MG_TRIANGLE* tri1=no1->get_lien_triangle()->get(i);
207     MG_TRIANGLE* tri2=no3->get_lien_triangle()->get(j);
208     if ( (tri1==tri2) && (tri1!=tri) && (tri1->get_nouveau_numero()==1))
209     {
210     OT_VECTEUR_3D vec1tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
211     OT_VECTEUR_3D vec2tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
212     OT_VECTEUR_3D normaltmp=vec1tmp&vec2tmp;
213     normaltmp.norme();
214     double psca=normal*normaltmp;
215     if (psca<-cos(eps_angle_retourne)) nbretourne++;
216     nbvoisin++;
217     }
218     }
219     for (int i=0;i<nb2;i++)
220     for (int j=0;j<nb3;j++)
221     {
222     MG_TRIANGLE* tri1=no2->get_lien_triangle()->get(i);
223     MG_TRIANGLE* tri2=no3->get_lien_triangle()->get(j);
224     if ( (tri1==tri2) && (tri1!=tri) && (tri1->get_nouveau_numero()==1))
225     {
226     OT_VECTEUR_3D vec1tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
227     OT_VECTEUR_3D vec2tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
228     OT_VECTEUR_3D normaltmp=vec1tmp&vec2tmp;
229     normaltmp.norme();
230     double psca=normal*normaltmp;
231     if (psca<-cos(eps_angle_retourne)) nbretourne++;
232     nbvoisin++;
233     }
234     }
235     if (nbvoisin!=3)
236     tab2[5]++;
237 francois 425 if (nbretourne>1) qual=-qual;
238     qualmoy=qualmoy+qual;
239     if (qual<qualmin) qualmin=qual;
240     if (qual>qualmax) qualmax=qual;
241     if (qual<0.) tab2[0]++;
242     else if (qual<borne1) tab2[1]++;
243     else if (qual<borne2) tab2[2]++;
244     else if (qual<borne3) tab2[3]++;
245     else tab2[4]++;
246     if (sol!=NULL)
247     if (mai->get_nb_mg_tetra()==0) sol->ecrire(qual,itri,0);
248     itri++;
249     }
250     if (nbtrifront!=0)
251     {
252 francois 429 sprintf(mess," Nombre de triangles avec des noeuds fusionnés : %d",tab2[6]); affiche(mess);
253     sprintf(mess," Nombre de triangles avec 1 voisin manquant : %d",tab2[5]); affiche(mess);
254 francois 426 sprintf(mess," critere d'angle limite pour l'inversion : %lf",eps_angle_retourne); affiche(mess);
255     sprintf(mess," qualite moyenne des triangles de frontiere : %lf",qualmoy/nbtrifront); affiche(mess);
256     sprintf(mess," qualite min des triangles de frontiere : %lf",qualmin); affiche(mess);
257     sprintf(mess," qualite max des triangles de frontiere : %lf",qualmax); affiche(mess);
258 francois 425 sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne3,tab2[4],tab2[4]*100./nbtrifront); affiche(mess);
259     sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne2,tab2[3],tab2[3]*100./nbtrifront); affiche(mess);
260     sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne1,tab2[2],tab2[2]*100./nbtrifront); affiche(mess);
261     sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",0.,tab2[1],tab2[1]*100./nbtrifront); affiche(mess);
262 francois 479 sprintf(mess," nombre de triangles de frontiere retournes : %d (%.2lf%%)",tab2[0],tab2[0]*100./nbtrifront); affiche(mess); affiche((char*)"");
263 francois 425 }
264    
265    
266    
267     qualmin=1e300,qualmax=-1e300,qualmoy=0.;
268     int tab3[5]={0,0,0,0,0};
269     int itet=0;
270     for (MG_TETRA* tet=mai->get_premier_tetra(itt);tet!=NULL;tet=mai->get_suivant_tetra(itt))
271     {
272     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());
273     OT_VECTEUR_3D vec1(tet->get_noeud1()->get_coord(),tet->get_noeud2()->get_coord());
274     OT_VECTEUR_3D vec2(tet->get_noeud1()->get_coord(),tet->get_noeud3()->get_coord());
275     OT_VECTEUR_3D vec3(tet->get_noeud1()->get_coord(),tet->get_noeud4()->get_coord());
276     OT_VECTEUR_3D pvec=vec1&vec2;
277     double psca=pvec*vec3;
278     if (psca<0.) qual=-qual;
279     qualmoy=qualmoy+qual;
280     if (qual<qualmin) qualmin=qual;
281     if (qual>qualmax) qualmax=qual;
282     if (qual<0.) tab3[0]++;
283     else if (qual<borne1) tab3[1]++;
284     else if (qual<borne2) tab3[2]++;
285     else if (qual<borne3) tab3[3]++;
286     else tab3[4]++;
287     if (sol!=NULL)
288     sol->ecrire(qual,itet,0);
289     itet++;
290     }
291     if (mai->get_nb_mg_tetra()!=0)
292     {
293 francois 426 sprintf(mess," qualite moyenne des tetra : %lf",qualmoy/mai->get_nb_mg_tetra()); affiche(mess);
294     sprintf(mess," qualite min des tetra : %lf",qualmin); affiche(mess);
295     sprintf(mess," qualite max des tetra : %lf",qualmax); affiche(mess);
296 francois 425 sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",borne3,tab3[4],tab3[4]*100./mai->get_nb_mg_tetra()); affiche(mess);
297     sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",borne2,tab3[3],tab3[3]*100./mai->get_nb_mg_tetra()); affiche(mess);
298     sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",borne1,tab3[2],tab3[2]*100./mai->get_nb_mg_tetra()); affiche(mess);
299     sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",0.,tab3[1],tab3[1]*100./mai->get_nb_mg_tetra()); affiche(mess);
300     sprintf(mess," nombre de tetra retournes : %d (%.2lf%%)",tab3[0],tab3[0]*100./mai->get_nb_mg_tetra()); affiche(mess);
301     int nbsegcorrect=0;
302     int nbsegincorrect=0;
303     for (MG_SEGMENT* seg=mai->get_premier_segment(its);seg!=NULL;seg=mai->get_suivant_segment(its))
304     if (seg->get_nouveau_numero()!=2)
305     {
306     MG_NOEUD* no1=seg->get_noeud1();
307     MG_NOEUD* no2=seg->get_noeud2();
308     int nb1=no1->get_lien_tetra()->get_nb();
309     int nb2=no2->get_lien_tetra()->get_nb();
310     double angletot=0;
311     for (int i=0;i<nb1;i++)
312     for (int j=0;j<nb2;j++)
313     {
314     MG_TETRA* tet1=no1->get_lien_tetra()->get(i);
315     MG_TETRA* tet2=no2->get_lien_tetra()->get(j);
316     if (tet1==tet2)
317     {
318     MG_NOEUD *nn1,*nn2,*nn3,*nn4;
319     if (tet1->get_noeud1()==no1) nn1=tet1->get_noeud1();
320     if (tet1->get_noeud2()==no1) nn1=tet1->get_noeud2();
321     if (tet1->get_noeud3()==no1) nn1=tet1->get_noeud3();
322     if (tet1->get_noeud4()==no1) nn1=tet1->get_noeud4();
323     if (tet1->get_noeud1()==no2) nn2=tet1->get_noeud1();
324     if (tet1->get_noeud2()==no2) nn2=tet1->get_noeud2();
325     if (tet1->get_noeud3()==no2) nn2=tet1->get_noeud3();
326     if (tet1->get_noeud4()==no2) nn2=tet1->get_noeud4();
327     if (tet1->get_noeud1()!=nn1)
328     if (tet1->get_noeud1()!=nn2) nn3=tet1->get_noeud1();
329     if (tet1->get_noeud2()!=nn1)
330     if (tet1->get_noeud2()!=nn2) nn3=tet1->get_noeud2();
331     if (tet1->get_noeud3()!=nn1)
332     if (tet1->get_noeud3()!=nn2) nn3=tet1->get_noeud3();
333     if (tet1->get_noeud4()!=nn1)
334     if (tet1->get_noeud4()!=nn2) nn3=tet1->get_noeud4();
335     if (tet1->get_noeud1()!=nn1)
336     if (tet1->get_noeud1()!=nn2)
337     if (tet1->get_noeud1()!=nn3) nn4=tet1->get_noeud1();
338     if (tet1->get_noeud2()!=nn1)
339     if (tet1->get_noeud2()!=nn2)
340     if (tet1->get_noeud2()!=nn3) nn4=tet1->get_noeud2();
341     if (tet1->get_noeud3()!=nn1)
342     if (tet1->get_noeud3()!=nn2)
343     if (tet1->get_noeud3()!=nn3) nn4=tet1->get_noeud3();
344     if (tet1->get_noeud4()!=nn1)
345     if (tet1->get_noeud4()!=nn2)
346     if (tet1->get_noeud4()!=nn3) nn4=tet1->get_noeud4();
347     double angle=get_angle_par_noeud<MG_NOEUD*>(nn1,nn2,nn3,nn1,nn2,nn4);
348     if (angle>M_PI) angle=2.*M_PI-angle;
349     angletot=angletot+angle;
350    
351     }
352     }
353     if ((angletot<2*M_PI-0.001) || (angletot>2*M_PI+0.001))
354     {
355     sprintf(mess," segment %lu angle matiere autour de %.2lf",seg->get_id(),angletot); affiche(mess);
356     nbsegincorrect++;
357     }
358     else nbsegcorrect++;
359     }
360     sprintf(mess," segment correct %d(%.2lf%%) segment incorrect %d(%.2lf%%) ",nbsegcorrect,nbsegcorrect*100./(nbsegcorrect+nbsegincorrect),nbsegincorrect,nbsegincorrect*100./(nbsegcorrect+nbsegincorrect)); affiche(mess);
361     }
362    
363     if (nom!=NULL)
364     {
365     std::string nomf=nom;
366     nomf=nomf+".magic";
367     mai->get_gestionnaire()->enregistrer((char*)nomf.c_str());
368     }
369     }
370 francois 514
371    
372 francois 577 void MAILLEUR_ANALYSE::compare_maillage_carte_isotrope(FCT_TAILLE* carte,char *nom,double *tab)
373 francois 514 {
374     MG_GESTIONNAIRE *gest=mai->get_gestionnaire();
375 francois 577 LISTE_MG_TETRA::iterator ittet;
376     double vol=0;
377     for (MG_TETRA* tet=mai->get_premier_tetra(ittet);tet!=NULL;tet=mai->get_suivant_tetra(ittet))
378     vol=vol+carte->calcul_volume_tetra_metrique(tet);
379     tab[0]=vol;
380     tab[1]=mai->get_nb_mg_tetra();
381     tab[2]=(tab[1]-tab[0])/tab[0]*100;
382 francois 514 MG_SOLUTION *sol=new MG_SOLUTION(mai,4,nom,1,"Comparaison_taille",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
383     gest->ajouter_mg_solution(sol);
384     sol->change_legende(0,(char*)"taille_reelle");
385     sol->change_legende(1,(char*)"taille_carte");
386     sol->change_legende(2,(char*)"erreur");
387     sol->change_legende(3,(char*)"erreur absolue");
388     LISTE_MG_NOEUD::iterator it;
389     int i=0;
390     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
391     {
392     double *xyz=no->get_coord();
393     double tenseur[9];
394 francois 532 carte->evaluer(xyz,tenseur);
395 francois 514 double cartetaille=1./sqrt(tenseur[0]);
396     int nbseg=no->get_lien_segment()->get_nb();
397     double taille=0.;
398 francois 532 int nbreelseg=0;
399 francois 514 for (int j=0;j<nbseg;j++)
400 francois 532 if (mai->get_mg_segmentid(no->get_lien_segment()->get(j)->get_id())!=NULL) {taille=taille+no->get_lien_segment()->get(j)->get_longueur();nbreelseg++;}
401     taille=taille/nbreelseg;
402 francois 514 double erreur=(taille-cartetaille)*100./cartetaille;
403     sol->ecrire(taille,i,0);
404     sol->ecrire(cartetaille,i,1);
405     sol->ecrire(erreur,i,2);
406     sol->ecrire(fabs(erreur),i,3);
407     i++;
408     }
409     }