ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_optimisation.cpp
Revision: 283
Committed: Tue Sep 13 21:11:20 2011 UTC (13 years, 8 months ago) by francois
File size: 20386 byte(s)
Log Message:
structure de l'écriture

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�e et Vincent FRANCOIS
5     // D�artement de G�ie M�anique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�artement
8     // de g�ie m�anique de l'Universit�du Qu�ec �
9     // Trois Rivi�es
10     // Les librairies ne peuvent �re utilis�s sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mailleur3d.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 �11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include "mailleur3d.h"
27     #include "ot_mathematique.h"
28     #include "m3d_tetra.h"
29     #include "m3d_noeud.h"
30     //#include "mg_gestionnaire.h"
31     #include <math.h>
32    
33     //---------------------------------------------------------------------------
34    
35     //#pragma package(smart_init)
36    
37     double get_volume(MG_TETRA* tet)
38     {
39     double *xyz1=tet->get_noeud1()->get_coord();
40     double *xyz2=tet->get_noeud2()->get_coord();
41     double *xyz3=tet->get_noeud3()->get_coord();
42     double *xyz4=tet->get_noeud4()->get_coord();
43     OT_VECTEUR_3D ab(xyz1,xyz2);
44     OT_VECTEUR_3D ac(xyz1,xyz3);
45     OT_VECTEUR_3D ad(xyz1,xyz4);
46     double vol=(ab&ac)*ad;
47     vol=vol/6.;
48     return vol;
49     }
50    
51     double get_volume(double *xyz1,double *xyz2,double *xyz3,double *xyz4)
52     {
53     OT_VECTEUR_3D ab(xyz1,xyz2);
54     OT_VECTEUR_3D ac(xyz1,xyz3);
55     OT_VECTEUR_3D ad(xyz1,xyz4);
56     double vol=(ab&ac)*ad;
57     vol=vol/6.;
58     return vol;
59     }
60    
61     void MAILLEUR3D::optimise(MG_VOLUME* mgvol,int& nbmauvais)
62     {
63     static int passe=0;
64     passe++;
65     //preparation
66     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
67     int nbtet=0;
68     for (MG_TETRA* tet=(MG_TETRA*)mgvol->get_lien_maillage()->get_premier(it);tet;tet=(MG_TETRA*)mgvol->get_lien_maillage()->get_suivant(it))
69     {
70     if (mg_maillage->get_mg_tetraid(tet->get_id())==NULL) continue;
71     M3D_TETRA* mtet=(M3D_TETRA*)tet;
72     double qual=OPERATEUR::qualite_tetra(mtet->get_noeud1()->get_coord(),mtet->get_noeud2()->get_coord(),mtet->get_noeud3()->get_coord(),mtet->get_noeud4()->get_coord());
73     mtet->change_qualite(qual);
74     if (qual<0.1*niveau_optimisation) nbtet++;
75     ajouter_ordre_tetra(mtet,0);
76     }
77     o3d_data();
78     o3d_data2();
79     //on commence
80    
81     for (int phase=0;phase<2;phase++)
82     {
83     char mess[255];
84     if (phase==0) sprintf(mess," Phase %d : %d a optimiser",2*passe-1+phase,nbtet);
85     if (phase==1) sprintf(mess," Phase %d",2*passe-1+phase);
86     if (affichageactif==1) affiche(mess);
87     while (lst_tetra[phase].size()>0)
88     {
89     ORDRE_TETRA::iterator i=lst_tetra[phase].begin();
90     M3D_TETRA* tet=(*i).second;
91     supprimer_ordre_tetra(tet);
92     double crit_avant=tet->get_qualite();
93     if (crit_avant<0.5)
94     {
95     double crit[4]={-1.,-1.,-1.,-1.};
96     M3D_NOEUD* no[4];
97     no[0]=(M3D_NOEUD*)tet->get_noeud1();
98     no[1]=(M3D_NOEUD*)tet->get_noeud2();
99     no[2]=(M3D_NOEUD*)tet->get_noeud3();
100     no[3]=(M3D_NOEUD*)tet->get_noeud4();
101     double x[4],y[4],z[4];
102     bouge_point(mgvol,no[0],crit[0],x[0],y[0],z[0]);
103     bouge_point(mgvol,no[1],crit[1],x[1],y[1],z[1]);
104     bouge_point(mgvol,no[2],crit[2],x[2],y[2],z[2]);
105     bouge_point(mgvol,no[3],crit[3],x[3],y[3],z[3]);
106     std::vector<double> vecteur_crit(crit,crit+4);
107     std::vector<double>::iterator it1 = max_element(vecteur_crit.begin(), vecteur_crit.end());
108     double crit_opt=*it1;
109     if (crit_opt>crit_avant)
110     {
111     int num=it1-vecteur_crit.begin();
112     no[num]->change_x(x[num]);
113     no[num]->change_y(y[num]);
114     no[num]->change_z(z[num]);
115     int nb=no[num]->get_lien_tetra()->get_nb();
116     for (int j=0;j<nb;j++)
117     {
118     M3D_TETRA* mtet=(M3D_TETRA*)no[num]->get_lien_tetra()->get(j);
119     double qual=OPERATEUR::qualite_tetra(mtet->get_noeud1()->get_coord(),mtet->get_noeud2()->get_coord(),mtet->get_noeud3()->get_coord(),mtet->get_noeud4()->get_coord());
120     mtet->change_qualite(qual);
121     }
122     crit_avant=crit_opt;
123     }
124     }
125     int coquille_non_optimise=1;
126     if (crit_avant<0.5)
127     {
128     COQUILLE coque[6];
129     double crit[6]={-1,-1,-1,-1,-1,-1};
130     remaille_coquille(tet->get_noeud1(),tet->get_noeud2(),crit[0],coque[0]);
131     remaille_coquille(tet->get_noeud1(),tet->get_noeud3(),crit[1],coque[1]);
132     remaille_coquille(tet->get_noeud1(),tet->get_noeud4(),crit[2],coque[2]);
133     remaille_coquille(tet->get_noeud2(),tet->get_noeud3(),crit[3],coque[3]);
134     remaille_coquille(tet->get_noeud2(),tet->get_noeud3(),crit[4],coque[4]);
135     remaille_coquille(tet->get_noeud3(),tet->get_noeud4(),crit[5],coque[5]);
136     std::vector<double> vecteur_crit(crit,crit+6);
137     std::vector<double>::iterator it1 = max_element(vecteur_crit.begin(), vecteur_crit.end());
138     double crit_opt=*it1;
139     if (crit_opt>crit_avant)
140     {
141     coquille_non_optimise=0;
142     int num=it1-vecteur_crit.begin();
143     for (int i=0;i<coque[num].taille;i++)
144     {
145     M3D_TETRA *tettmp=(M3D_TETRA*)coque[num].tet[i];
146     if (tet!=tettmp) supprimer_ordre_tetra(tettmp);
147     mg_maillage->supprimer_mg_tetraid(coque[num].tet[i]->get_id());
148     }
149     for (int i=0;i<2*coque[num].taille-4;i++)
150     {
151     MG_NOEUD* noeud1=coque[num].new_tetra[4*i];
152     MG_NOEUD* noeud2=coque[num].new_tetra[4*i+1];
153     MG_NOEUD* noeud3=coque[num].new_tetra[4*i+2];
154     MG_NOEUD* noeud4=coque[num].new_tetra[4*i+3];
155     MG_TRIANGLE* triangle1=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud3->get_id(),noeud2->get_id());
156     MG_TRIANGLE* triangle2=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud2->get_id(),noeud4->get_id());
157     MG_TRIANGLE* triangle3=mg_maillage->get_mg_triangle(noeud2->get_id(),noeud3->get_id(),noeud4->get_id());
158     MG_TRIANGLE* triangle4=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud4->get_id(),noeud3->get_id());
159     if (triangle1==NULL) triangle1=insere_triangle(mgvol,noeud1,noeud3,noeud2,MAILLEUR_AUTO);
160     if (triangle2==NULL) triangle2=insere_triangle(mgvol,noeud1,noeud2,noeud4,MAILLEUR_AUTO);
161     if (triangle3==NULL) triangle3=insere_triangle(mgvol,noeud2,noeud3,noeud4,MAILLEUR_AUTO);
162     if (triangle4==NULL) triangle4=insere_triangle(mgvol,noeud1,noeud4,noeud3,MAILLEUR_AUTO);
163     M3D_TETRA* mtet=new M3D_TETRA(mgvol,noeud1,noeud2,noeud3,noeud4,triangle1,triangle2,triangle3,triangle4,MAILLEUR_AUTO);
164     mg_maillage->ajouter_mg_tetra(mtet);
165     double qual=OPERATEUR::qualite_tetra(mtet->get_noeud1()->get_coord(),mtet->get_noeud2()->get_coord(),mtet->get_noeud3()->get_coord(),mtet->get_noeud4()->get_coord());
166     mtet->change_qualite(qual);
167     if (phase==0)
168     ajouter_ordre_tetra(mtet,1);
169     }
170    
171    
172     }
173    
174     }
175     if ((phase==0) && (coquille_non_optimise==1))
176     ajouter_ordre_tetra(tet,1);
177    
178     }
179    
180     }
181     int nb=0;
182     for (MG_TETRA* tet=(MG_TETRA*)mgvol->get_lien_maillage()->get_premier(it);tet;tet=(MG_TETRA*)mgvol->get_lien_maillage()->get_suivant(it))
183     {
184     if (mg_maillage->get_mg_tetraid(tet->get_id())==NULL) continue;
185     M3D_TETRA* mtet=(M3D_TETRA*)tet;
186     if (mtet->get_qualite()<0.1*niveau_optimisation) nb++;
187     }
188    
189     nbmauvais=nb;
190    
191     }
192    
193    
194    
195    
196    
197     int MAILLEUR3D::bouge_point(MG_VOLUME* mgvol,M3D_NOEUD* noeud,double& crit,double& x,double& y, double& z)
198     {
199     if (noeud->get_lien_topologie()!=mgvol) return 0;
200     if (noeud->get_origine()!=MAILLEUR_AUTO) return 0;
201    
202     double xopt=0.;
203     double yopt=0.;
204     double zopt=0.;
205     double qual_dep=1.;
206     int nb_tet=noeud->get_lien_tetra()->get_nb();
207     double tab_coord[3000];
208     double gamma=0;
209     for (int i=0;i<nb_tet;i++)
210     {
211     M3D_TETRA* tet=(M3D_TETRA*)noeud->get_lien_tetra()->get(i);
212     qual_dep=std::min(qual_dep,tet->get_qualite());
213     MG_NOEUD* no1=tet->get_noeud1();
214     MG_NOEUD* no2=tet->get_noeud2();
215     MG_NOEUD* no3=tet->get_noeud3();
216     MG_NOEUD* no4=tet->get_noeud4();
217     MG_NOEUD *noeud1,*noeud2,*noeud3;
218     if (no1==noeud)
219     {
220     noeud1=no2;
221     noeud2=no4;
222     noeud3=no3;
223     }
224     if (no2==noeud)
225     {
226     noeud1=no1;
227     noeud2=no3;
228     noeud3=no4;
229     }
230     if (no3==noeud)
231     {
232     noeud1=no1;
233     noeud2=no4;
234     noeud3=no2;
235     }
236     if (no4==noeud)
237     {
238     noeud1=no1;
239     noeud2=no2;
240     noeud3=no3;
241     }
242     double xyzi[3];
243     double *xyz1=noeud1->get_coord();
244     double *xyz2=noeud2->get_coord();
245     double *xyz3=noeud3->get_coord();
246     xyzi[0]=(xyz1[0]+xyz2[0]+xyz3[0])/3.;
247     xyzi[1]=(xyz1[1]+xyz2[1]+xyz3[1])/3.;
248     xyzi[2]=(xyz1[2]+xyz2[2]+xyz3[2])/3.;
249     OT_VECTEUR_3D v12(xyz1,xyz2);
250     OT_VECTEUR_3D v13(xyz1,xyz3);
251     OT_VECTEUR_3D v23(xyz2,xyz3);
252     OT_VECTEUR_3D normal=v12&v13;
253     double perimetre=v12.get_longueur()+v13.get_longueur()+v23.get_longueur();
254     double hauteur = (perimetre/3.) * 0.8 ;
255     normal.norme();
256     tab_coord[3*i]=xyzi[0]+normal.get_x()*hauteur;
257     tab_coord[3*i+1]=xyzi[1]+normal.get_y()*hauteur;
258     tab_coord[3*i+2]=xyzi[2]+normal.get_z()*hauteur;
259     if (tet->get_qualite()> 1e-10) gamma=gamma+1./tet->get_qualite()/tet->get_qualite();
260     }
261     gamma=1./gamma;
262     for (int i=0;i<nb_tet;i++)
263     {
264     M3D_TETRA* tet=(M3D_TETRA*)noeud->get_lien_tetra()->get(i);
265     if (tet->get_qualite()> 1e-10)
266     {
267     double alpha=gamma/tet->get_qualite()/tet->get_qualite();
268     xopt=xopt+alpha*tab_coord[3*i];
269     yopt=yopt+alpha*tab_coord[3*i+1];
270     zopt=zopt+alpha*tab_coord[3*i+2];
271     }
272    
273     }
274     double delta[3]={xopt-noeud->get_x(),yopt-noeud->get_y(),zopt-noeud->get_z()};
275     double bmin=0.,bmax=1.;
276     double vieuxx=noeud->get_x();
277     double vieuxy=noeud->get_y();
278     double vieuxz=noeud->get_z();
279     double qualini=0.;
280     for (int iteration=0;iteration<5;iteration++)
281     {
282     double alpha=(bmin+bmax)*0.5;
283     noeud->change_x(vieuxx+alpha*delta[0]);
284     noeud->change_y(vieuxy+alpha*delta[1]);
285     noeud->change_z(vieuxz+alpha*delta[2]);
286     double qualcour=1.;
287     for (int i=0;i<nb_tet;i++)
288     {
289     M3D_TETRA* mtet=(M3D_TETRA*)noeud->get_lien_tetra()->get(i);
290     double qual=OPERATEUR::qualite_tetra(mtet->get_noeud1()->get_coord(),mtet->get_noeud2()->get_coord(),mtet->get_noeud3()->get_coord(),mtet->get_noeud4()->get_coord());
291     qualcour=std::min(qualcour,qual);
292     }
293     double alpha_eps=(bmin+bmax)*0.5-(bmax-bmin)/50.;
294     noeud->change_x(vieuxx+alpha_eps*delta[0]);
295     noeud->change_y(vieuxy+alpha_eps*delta[1]);
296     noeud->change_z(vieuxz+alpha_eps*delta[2]);
297     double qualcour_eps=1.;
298     for (int i=0;i<nb_tet;i++)
299     {
300     M3D_TETRA* mtet=(M3D_TETRA*)noeud->get_lien_tetra()->get(i);
301     double qual=OPERATEUR::qualite_tetra(mtet->get_noeud1()->get_coord(),mtet->get_noeud2()->get_coord(),mtet->get_noeud3()->get_coord(),mtet->get_noeud4()->get_coord());
302     qualcour_eps=std::min(qualcour_eps,qual);
303     }
304     if (qualcour>qualcour_eps) bmin =alpha;
305     else bmax=alpha;
306     qualini=std::max(qualini,qualcour);
307     }
308     noeud->change_x(vieuxx);
309     noeud->change_y(vieuxy);
310     noeud->change_z(vieuxz);
311     if (qualini>qual_dep)
312     {
313     x=vieuxx+(bmin+bmax)*0.5*delta[0];
314     y=vieuxy+(bmin+bmax)*0.5*delta[1];
315     z=vieuxz+(bmin+bmax)*0.5*delta[2];
316     crit=qualini;
317     return 1;
318     }
319     return 0;
320     }
321    
322    
323    
324     void MAILLEUR3D::remaille_coquille(MG_NOEUD* noeud1,MG_NOEUD* noeud2, double& crit, COQUILLE& coque)
325     {
326     //recherche du segment a supprimer
327     MG_NOEUD* noeud;
328     if (noeud1->get_id()>noeud2->get_id()) noeud=noeud2;
329     else noeud=noeud1;
330     int nb=noeud->get_lien_petit_segment()->get_nb();
331     for (int i=0;i<nb;i++)
332     {
333     MG_SEGMENT* seg=noeud->get_lien_petit_segment()->get(i);
334     if ( ((seg->get_noeud1()==noeud1) && (seg->get_noeud2()==noeud2)) || ((seg->get_noeud1()==noeud2) && (seg->get_noeud2()==noeud1)))
335     if ((seg->get_lien_topologie()->get_dimension()!=3) || (seg->get_origine()!=MAILLEUR_AUTO))
336     {
337     coque.taille=0;
338     crit=0.;
339     return;
340     }
341     }
342     //recherche des tetra qui s enroule autour du segment
343     int nb1=noeud1->get_lien_tetra()->get_nb();
344     int nb2=noeud2->get_lien_tetra()->get_nb();
345     MG_TETRA* coq[100];
346     int nb_coq=0;
347     for (int i=0;i<nb1;i++)
348     for (int j=0;j<nb2;j++)
349     if (noeud1->get_lien_tetra()->get(i)==noeud2->get_lien_tetra()->get(j))
350     {
351     coq[nb_coq]=noeud1->get_lien_tetra()->get(i);
352     nb_coq++;
353     }
354     if ((nb_coq<4) || (nb_coq>10))
355     {
356     coque.taille=0;
357     crit=0.;
358     return;
359     }
360     //recherche des noeuds qui compose la coquille
361     MG_NOEUD* tet_noeud[50];
362     int nb_tet_noeud=0;
363     coque.taille=nb_coq;
364     for (int i=0;i<nb_coq;i++)
365     {
366     coque.tet[i]=coq[i];
367     if ((coq[i]->get_noeud1()!=noeud1) && (coq[i]->get_noeud1()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->get_noeud1();
368     if ((coq[i]->get_noeud2()!=noeud1) && (coq[i]->get_noeud2()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->get_noeud2();
369     if ((coq[i]->get_noeud3()!=noeud1) && (coq[i]->get_noeud3()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->get_noeud3();
370     if ((coq[i]->get_noeud4()!=noeud1) && (coq[i]->get_noeud4()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->get_noeud4();
371     coque.volume=coque.volume+fabs(get_volume(coq[i]));
372     }
373     //ordonnancement des noeuds qui compose la coquille en polygone
374     MG_NOEUD* polygone[20];
375     int nb_poly=2;
376     polygone[0]=tet_noeud[0];
377     tet_noeud[0]=NULL;
378     polygone[1]=tet_noeud[1];
379     tet_noeud[1]=NULL;
380     while (nb_poly!=nb_coq+1)
381     {
382     for (int j=0;j<nb_coq;j++)
383     {
384     if (tet_noeud[2*j]==polygone[nb_poly-1])
385     {
386     polygone[nb_poly++]=tet_noeud[2*j+1];
387     tet_noeud[2*j]=NULL;
388     tet_noeud[2*j+1]=NULL;
389     }
390     if (tet_noeud[2*j+1]==polygone[nb_poly-1])
391     {
392     polygone[nb_poly++]=tet_noeud[2*j];
393     tet_noeud[2*j]=NULL;
394     tet_noeud[2*j+1]=NULL;
395     }
396    
397     }
398     }
399     //etude du positionnement du polygone
400     double vol1=get_volume(polygone[0]->get_coord(),polygone[1]->get_coord(),polygone[nb_poly-1]->get_coord(),noeud1->get_coord());
401     double vol2=get_volume(polygone[0]->get_coord(),polygone[nb_poly-1]->get_coord(),polygone[1]->get_coord(),noeud2->get_coord());
402     if (vol1*vol2<0.)
403     {
404     crit=0.;
405     coque.taille=0;
406     return;
407     }
408     MG_NOEUD *noeuda=noeud1;
409     MG_NOEUD *noeudb=noeud2;
410     if (vol1<0.)
411     {
412     noeuda=noeud2;
413     noeudb=noeud1;
414     }
415     //Examen des solutions
416     int nb_solution,nb_triangle;
417     if (nb_coq==4) {
418     nb_solution=2;
419     nb_triangle=4;
420     }
421     if (nb_coq==5) {
422     nb_solution=5;
423     nb_triangle=10;
424     }
425     if (nb_coq==6) {
426     nb_solution=14;
427     nb_triangle=20;
428     }
429     if (nb_coq==7) {
430     nb_solution=42;
431     nb_triangle=35;
432     }
433     if (nb_coq==8) {
434     nb_solution=132;
435     nb_triangle=56;
436     }
437     if (nb_coq==9) {
438     nb_solution=429;
439     nb_triangle=84;
440     }
441     if (nb_coq==10) {
442     nb_solution=1430;
443     nb_triangle=120;
444     }
445     double crit_triangle[120];
446     for (int i=0;i<nb_triangle;i++)
447     {
448     double crit1=OPERATEUR::qualite_tetra(polygone[tab_face[nb_coq-4][i][0]]->get_coord(),polygone[tab_face[nb_coq-4][i][1]]->get_coord(),polygone[tab_face[nb_coq-4][i][2]]->get_coord(),noeuda->get_coord());
449     double crit2=OPERATEUR::qualite_tetra(polygone[tab_face[nb_coq-4][i][0]]->get_coord(),polygone[tab_face[nb_coq-4][i][2]]->get_coord(),polygone[tab_face[nb_coq-4][i][1]]->get_coord(),noeudb->get_coord());
450     crit_triangle[i]=std::min(crit1,crit2);
451     }
452     /* examen de chaque solution */
453     double crit_opt=0.;
454     int numero_solution= -1;
455     double crit_solution[1430];
456     for (int i=0;i<nb_solution;i++)
457     {
458     double volume=0.;
459     for (int j=0;j<nb_coq-2;j++)
460     {
461     MG_NOEUD* noa=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][i][j]][0]];
462     MG_NOEUD* nob=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][i][j]][1]];
463     MG_NOEUD* noc=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][i][j]][2]];
464     MG_NOEUD* nod=noeuda;
465     volume=volume+fabs(get_volume(noa->get_coord(),nob->get_coord(),noc->get_coord(),nod->get_coord()));
466     nod=noeudb;
467     volume=volume+fabs(get_volume(noa->get_coord(),nob->get_coord(),noc->get_coord(),nod->get_coord()));
468     }
469     double eps=0.0018*pow(volume,0.666666666);
470     if (OPERATEUR::egal(volume,coque.volume,eps))
471     {
472     crit_solution[i]=1.;
473     for (int j=0;j<nb_coq-2;j++)
474     crit_solution[i]=std::min(crit_solution[i],crit_triangle[tab_solution[nb_coq-4][i][j]]);
475     }
476     else crit_solution[i]=0.;
477     if (crit_opt<crit_solution[i])
478     {
479     crit_opt=crit_solution[i];
480     numero_solution=i;
481     }
482    
483     }
484     if (numero_solution==(-1))
485     {
486     crit=0.;
487     coque.taille=0;
488     return;
489     }
490     crit=crit_opt;
491     for (int j=0;j<nb_coq-2;j++)
492     {
493     MG_NOEUD* noa=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][numero_solution][j]][0]];
494     MG_NOEUD* nob=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][numero_solution][j]][1]];
495     MG_NOEUD* noc=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][numero_solution][j]][2]];
496     coque.new_tetra[8*j]=noa;
497     coque.new_tetra[8*j+1]=nob;
498     coque.new_tetra[8*j+2]=noc;
499     coque.new_tetra[8*j+3]=noeuda;
500     coque.new_tetra[8*j+4]=noa;
501     coque.new_tetra[8*j+5]=noc;
502     coque.new_tetra[8*j+6]=nob;
503     coque.new_tetra[8*j+7]=noeudb;
504     }
505     }
506    
507    
508     void MAILLEUR3D::ajouter_ordre_tetra(M3D_TETRA* tet,int num)
509     {
510     std::pair<double,M3D_TETRA*> tmp(pow(tet->get_qualite(),1-2*num),tet);
511     ORDRE_TETRA::iterator p=lst_tetra[num].insert(tmp);
512     lst_tetraid[num][tet->get_id()]=p;
513     }
514    
515     void MAILLEUR3D::supprimer_ordre_tetra(M3D_TETRA* tet)
516     {
517     int num=0;
518     ORDRE_TETRA_PARID::iterator it=lst_tetraid[num].find(tet->get_id());
519     if (it==lst_tetraid[num].end())
520     {
521     num=1;
522     it=lst_tetraid[num].find(tet->get_id());
523     }
524     if (it==lst_tetraid[num].end()) return;
525     lst_tetra[num].erase(it->second);
526     lst_tetraid[num].erase(it);
527     }
528    
529    
530     void MAILLEUR3D::change_niveau_optimisation(int num)
531     {
532     niveau_optimisation=num;
533     }
534    
535     int MAILLEUR3D::get_niveau_optimisation(void)
536     {
537     return niveau_optimisation;
538     }
539