ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_optimisation.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
File size: 22094 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

File Contents

# User Rev Content
1 francois 35 //------------------------------------------------------------
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 francois 61 void MAILLEUR3D::optimise(MG_VOLUME* mgvol,int& nbmauvais)
62 francois 35 {
63 francois 61 static int passe=0;
64     passe++;
65 francois 35 //preparation
66 francois 125 TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
67 francois 61 int nbtet=0;
68 francois 125 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 francois 35 {
70 francois 125 if (mg_maillage->get_mg_tetraid(tet->get_id())==NULL) continue;
71     M3D_TETRA* mtet=(M3D_TETRA*)tet;
72 francois 35 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 francois 61 if (qual<0.1*niveau_optimisation) nbtet++;
75 francois 35 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 francois 129 if (phase==0) sprintf(mess," Phase %d : %d a optimiser",2*passe-1+phase,nbtet);
85 francois 61 if (phase==1) sprintf(mess," Phase %d",2*passe-1+phase);
86 francois 54 if (affichageactif==1) affiche(mess);
87 francois 35 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 francois 125 if (crit_opt>crit_avant)
140 francois 35 {
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 francois 54 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 francois 35 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 francois 125
171 francois 35
172     }
173 francois 125
174 francois 35 }
175 francois 125 if ((phase==0) && (coquille_non_optimise==1))
176 francois 35 ajouter_ordre_tetra(tet,1);
177    
178     }
179    
180     }
181 francois 61 int nb=0;
182 francois 125 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 francois 61 {
184 francois 125 if (mg_maillage->get_mg_tetraid(tet->get_id())==NULL) continue;
185     M3D_TETRA* mtet=(M3D_TETRA*)tet;
186 francois 61 if (mtet->get_qualite()<0.1*niveau_optimisation) nb++;
187     }
188 francois 35
189 francois 61 nbmauvais=nb;
190 francois 35
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 francois 54 if (noeud->get_origine()!=MAILLEUR_AUTO) return 0;
201 francois 35
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; else bmax=alpha;
305     qualini=std::max(qualini,qualcour);
306     }
307     noeud->change_x(vieuxx);
308     noeud->change_y(vieuxy);
309     noeud->change_z(vieuxz);
310     if (qualini>qual_dep)
311     {
312     x=vieuxx+(bmin+bmax)*0.5*delta[0];
313     y=vieuxy+(bmin+bmax)*0.5*delta[1];
314     z=vieuxz+(bmin+bmax)*0.5*delta[2];
315     crit=qualini;
316     return 1;
317     }
318     return 0;
319     }
320    
321    
322    
323     void MAILLEUR3D::remaille_coquille(MG_NOEUD* noeud1,MG_NOEUD* noeud2, double& crit, COQUILLE& coque)
324     {
325     //recherche du segment a supprimer
326     MG_NOEUD* noeud;
327     if (noeud1->get_id()>noeud2->get_id()) noeud=noeud2; else noeud=noeud1;
328     int nb=noeud->get_lien_petit_segment()->get_nb();
329     for (int i=0;i<nb;i++)
330     {
331     MG_SEGMENT* seg=noeud->get_lien_petit_segment()->get(i);
332     if ( ((seg->get_noeud1()==noeud1) && (seg->get_noeud2()==noeud2)) || ((seg->get_noeud1()==noeud2) && (seg->get_noeud2()==noeud1)))
333 francois 54 if ((seg->get_lien_topologie()->get_dimension()!=3) || (seg->get_origine()!=MAILLEUR_AUTO))
334 francois 35 {
335     coque.taille=0;
336     crit=0.;
337     return;
338     }
339     }
340     //recherche des tetra qui s enroule autour du segment
341     int nb1=noeud1->get_lien_tetra()->get_nb();
342     int nb2=noeud2->get_lien_tetra()->get_nb();
343     MG_TETRA* coq[100];
344     int nb_coq=0;
345     for (int i=0;i<nb1;i++)
346     for (int j=0;j<nb2;j++)
347     if (noeud1->get_lien_tetra()->get(i)==noeud2->get_lien_tetra()->get(j))
348     {
349     coq[nb_coq]=noeud1->get_lien_tetra()->get(i);
350     nb_coq++;
351     }
352     if ((nb_coq<4) || (nb_coq>10))
353     {
354     coque.taille=0;
355     crit=0.;
356     return;
357     }
358     //recherche des noeuds qui compose la coquille
359     MG_NOEUD* tet_noeud[50];
360     int nb_tet_noeud=0;
361     coque.taille=nb_coq;
362     for (int i=0;i<nb_coq;i++)
363     {
364     coque.tet[i]=coq[i];
365     if ((coq[i]->get_noeud1()!=noeud1) && (coq[i]->get_noeud1()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->get_noeud1();
366     if ((coq[i]->get_noeud2()!=noeud1) && (coq[i]->get_noeud2()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->get_noeud2();
367     if ((coq[i]->get_noeud3()!=noeud1) && (coq[i]->get_noeud3()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->get_noeud3();
368     if ((coq[i]->get_noeud4()!=noeud1) && (coq[i]->get_noeud4()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->get_noeud4();
369     coque.volume=coque.volume+fabs(get_volume(coq[i]));
370     }
371     //ordonnancement des noeuds qui compose la coquille en polygone
372     MG_NOEUD* polygone[20];
373     int nb_poly=2;
374     polygone[0]=tet_noeud[0]; tet_noeud[0]=NULL;
375     polygone[1]=tet_noeud[1];tet_noeud[1]=NULL;
376     while (nb_poly!=nb_coq+1)
377     {
378     for (int j=0;j<nb_coq;j++)
379     {
380     if (tet_noeud[2*j]==polygone[nb_poly-1])
381     {
382     polygone[nb_poly++]=tet_noeud[2*j+1];
383     tet_noeud[2*j]=NULL;
384     tet_noeud[2*j+1]=NULL;
385     }
386     if (tet_noeud[2*j+1]==polygone[nb_poly-1])
387     {
388     polygone[nb_poly++]=tet_noeud[2*j];
389     tet_noeud[2*j]=NULL;
390     tet_noeud[2*j+1]=NULL;
391     }
392    
393     }
394     }
395     //etude du positionnement du polygone
396     double vol1=get_volume(polygone[0]->get_coord(),polygone[1]->get_coord(),polygone[nb_poly-1]->get_coord(),noeud1->get_coord());
397     double vol2=get_volume(polygone[0]->get_coord(),polygone[nb_poly-1]->get_coord(),polygone[1]->get_coord(),noeud2->get_coord());
398     if (vol1*vol2<0.)
399     {
400     crit=0.;
401     coque.taille=0;
402     return;
403     }
404     MG_NOEUD *noeuda=noeud1;
405     MG_NOEUD *noeudb=noeud2;
406     if (vol1<0.)
407     {
408     noeuda=noeud2;
409     noeudb=noeud1;
410     }
411     //Examen des solutions
412     int nb_solution,nb_triangle;
413     if (nb_coq==4) {nb_solution=2;nb_triangle=4;}
414     if (nb_coq==5) {nb_solution=5;nb_triangle=10;}
415     if (nb_coq==6) {nb_solution=14;nb_triangle=20;}
416     if (nb_coq==7) {nb_solution=42;nb_triangle=35;}
417     if (nb_coq==8) {nb_solution=132;nb_triangle=56;}
418     if (nb_coq==9) {nb_solution=429;nb_triangle=84;}
419     if (nb_coq==10) {nb_solution=1430;nb_triangle=120;}
420     double crit_triangle[120];
421     for (int i=0;i<nb_triangle;i++)
422     {
423     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());
424     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());
425     crit_triangle[i]=std::min(crit1,crit2);
426     }
427     /* examen de chaque solution */
428     double crit_opt=0.;
429     int numero_solution= -1;
430     double crit_solution[1430];
431     for (int i=0;i<nb_solution;i++)
432     {
433     double volume=0.;
434     for (int j=0;j<nb_coq-2;j++)
435     {
436     MG_NOEUD* noa=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][i][j]][0]];
437     MG_NOEUD* nob=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][i][j]][1]];
438     MG_NOEUD* noc=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][i][j]][2]];
439     MG_NOEUD* nod=noeuda;
440     volume=volume+fabs(get_volume(noa->get_coord(),nob->get_coord(),noc->get_coord(),nod->get_coord()));
441     nod=noeudb;
442     volume=volume+fabs(get_volume(noa->get_coord(),nob->get_coord(),noc->get_coord(),nod->get_coord()));
443     }
444     double eps=0.0018*pow(volume,0.666666666);
445     if (OPERATEUR::egal(volume,coque.volume,eps))
446     {
447     crit_solution[i]=1.;
448     for (int j=0;j<nb_coq-2;j++)
449     crit_solution[i]=std::min(crit_solution[i],crit_triangle[tab_solution[nb_coq-4][i][j]]);
450     }
451     else crit_solution[i]=0.;
452     if (crit_opt<crit_solution[i])
453     {
454     crit_opt=crit_solution[i];
455     numero_solution=i;
456     }
457    
458     }
459     if (numero_solution==(-1))
460     {
461     crit=0.;
462     coque.taille=0;
463     return;
464     }
465     crit=crit_opt;
466     for (int j=0;j<nb_coq-2;j++)
467     {
468     MG_NOEUD* noa=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][numero_solution][j]][0]];
469     MG_NOEUD* nob=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][numero_solution][j]][1]];
470     MG_NOEUD* noc=polygone[tab_face[nb_coq-4][tab_solution[nb_coq-4][numero_solution][j]][2]];
471     coque.new_tetra[8*j]=noa;
472     coque.new_tetra[8*j+1]=nob;
473     coque.new_tetra[8*j+2]=noc;
474     coque.new_tetra[8*j+3]=noeuda;
475     coque.new_tetra[8*j+4]=noa;
476     coque.new_tetra[8*j+5]=noc;
477     coque.new_tetra[8*j+6]=nob;
478     coque.new_tetra[8*j+7]=noeudb;
479     }
480     }
481    
482    
483     void MAILLEUR3D::ajouter_ordre_tetra(M3D_TETRA* tet,int num)
484     {
485     std::pair<double,M3D_TETRA*> tmp(pow(tet->get_qualite(),1-2*num),tet);
486     ORDRE_TETRA::iterator p=lst_tetra[num].insert(tmp);
487     lst_tetraid[num][tet->get_id()]=p;
488     }
489    
490     void MAILLEUR3D::supprimer_ordre_tetra(M3D_TETRA* tet)
491     {
492     int num=0;
493 francois 102 ORDRE_TETRA_PARID::iterator it=lst_tetraid[num].find(tet->get_id());
494     if (it==lst_tetraid[num].end())
495 francois 35 {
496     num=1;
497 francois 102 it=lst_tetraid[num].find(tet->get_id());
498 francois 35 }
499 francois 102 if (it==lst_tetraid[num].end()) return;
500     lst_tetra[num].erase(it->second);
501     lst_tetraid[num].erase(it);
502 francois 35 }
503 francois 61
504    
505     void MAILLEUR3D::change_niveau_optimisation(int num)
506     {
507     niveau_optimisation=num;
508     }
509    
510     int MAILLEUR3D::get_niveau_optimisation(void)
511     {
512     return niveau_optimisation;
513     }
514