ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_outil.cpp
Revision: 363
Committed: Thu Oct 18 22:12:03 2012 UTC (12 years, 6 months ago) by francois
File size: 52776 byte(s)
Log Message:
Mise a jour pour publi sur la comparaison

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�partement
8     // de g�nie m�canique de l'Universit� du Qu�bec �
9     // Trois Rivi�res
10     // Les librairies ne peuvent �tre utilis�es sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mailleur3d_outil.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26    
27    
28     //#pragma hdrstop
29    
30     #include <math.h>
31     #include <time.h>
32     #include "mailleur3d.h"
33     #include "mailleur3d_front.h"
34     #include "ot_mathematique.h"
35     #include "ot_boite_3D.h"
36     #include "m3d_noeud.h"
37     #include "m3d_tetra.h"
38     #include "m3d_triangle.h"
39 francois 335 #include "mg_geometrie_outils.h"
40 francois 283 #include "const.h"
41    
42     //---------------------------------------------------------------------------
43    
44     //#pragma package(smart_init)
45    
46    
47    
48    
49    
50    
51    
52     double MAILLEUR3D::angle_front(MG_FRONT_3D* ft1,MG_FRONT_3D* ft2)
53     {
54 francois 335 double angle=get_angle<MG_FRONT_3D*>(ft1,ft2);
55     return angle;
56 francois 283 }
57    
58    
59    
60     double MAILLEUR3D::angle_front(MG_FRONT_3D* ft,MG_SEGMENT* seg)
61     {
62     MG_NOEUD* noeud1;
63     MG_NOEUD* noeud2;
64     MG_NOEUD* noeud3;
65     MG_NOEUD* noeud4;
66    
67    
68     if (seg->get_noeud1()==ft->get_noeud1())
69     {
70     noeud1=ft->get_noeud1();
71     noeud2=ft->get_noeud2();
72     noeud3=ft->get_noeud3();
73     noeud4=seg->get_noeud2();
74     }
75     if (seg->get_noeud1()==ft->get_noeud2())
76     {
77     noeud1=ft->get_noeud2();
78     noeud2=ft->get_noeud3();
79     noeud3=ft->get_noeud1();
80     noeud4=seg->get_noeud2();
81     }
82     if (seg->get_noeud1()==ft->get_noeud3())
83     {
84     noeud1=ft->get_noeud3();
85     noeud2=ft->get_noeud1();
86     noeud3=ft->get_noeud2();
87     noeud4=seg->get_noeud2();
88     }
89     if (seg->get_noeud2()==ft->get_noeud1())
90     {
91     noeud1=ft->get_noeud1();
92     noeud2=ft->get_noeud2();
93     noeud3=ft->get_noeud3();
94     noeud4=seg->get_noeud1();
95     }
96     if (seg->get_noeud2()==ft->get_noeud2())
97     {
98     noeud1=ft->get_noeud2();
99     noeud2=ft->get_noeud3();
100     noeud3=ft->get_noeud1();
101     noeud4=seg->get_noeud1();
102     }
103     if (seg->get_noeud2()==ft->get_noeud3())
104     {
105     noeud1=ft->get_noeud3();
106     noeud2=ft->get_noeud1();
107     noeud3=ft->get_noeud2();
108     noeud4=seg->get_noeud1();
109     }
110    
111     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
112     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
113     OT_VECTEUR_3D n1n4(noeud4->get_x()-noeud1->get_x(),noeud4->get_y()-noeud1->get_y(),noeud4->get_z()-noeud1->get_z());
114     OT_VECTEUR_3D n1n=n1n2&n1n3;
115     OT_MATRICE_3D mat(n1n2,n1n3,n1n);
116     OT_MATRICE_3D matx(n1n4,n1n3,n1n);
117     OT_MATRICE_3D maty(n1n2,n1n4,n1n);
118     OT_MATRICE_3D matz(n1n2,n1n3,n1n4);
119     double det=mat.get_determinant();
120     double xsi=matx.get_determinant()/det;
121     double eta=maty.get_determinant()/det;
122     double psi=matz.get_determinant()/det;
123    
124     double proj[3];
125     proj[0]=(1.-xsi-eta)*noeud1->get_x()+xsi*noeud2->get_x()+eta*noeud3->get_x();
126     proj[1]=(1.-xsi-eta)*noeud1->get_y()+xsi*noeud2->get_y()+eta*noeud3->get_y();
127     proj[2]=(1.-xsi-eta)*noeud1->get_z()+xsi*noeud2->get_z()+eta*noeud3->get_z();
128     OT_VECTEUR_3D n1nproj(noeud1->get_x()-proj[0],noeud1->get_y()-proj[1],noeud1->get_z()-proj[2]);
129     //n1n4.norme();
130     //n1nproj.norme();
131     double ps=n1n4*n1nproj;
132     if (!(OPERATEUR::egal(ps,0.0,0.0001))) ps=ps/n1n4.get_longueur()/n1nproj.get_longueur();
133     else ps=0.;
134     if (ps>1.) ps=1.;
135     if (ps<-1.) ps=-1.;
136     double angle=acos(ps);
137     if ((xsi<0.) || (eta<0.) ) angle=angle+M_PI/2.;
138     if (psi<0.) angle=2*M_PI-angle;
139     return angle;
140    
141     }
142    
143    
144    
145    
146    
147     class MG_TETRA* MAILLEUR3D::insere_tetra(class MG_VOLUME* mgvol,class MG_FRONT_3D* ft,MG_NOEUD* noeud4,int type,TPL_MAP_ENTITE<class MG_TRIANGLE*>& liste_intersection)
148     {
149     clock_t cpu1=clock(); //debug
150     liste_intersection.vide();
151     MG_NOEUD* noeud1=ft->get_noeud1();
152     MG_NOEUD* noeud2=ft->get_noeud2();
153     MG_NOEUD* noeud3=ft->get_noeud3();
154    
155     // existence du tetra
156     MG_NOEUD* noeud;
157 francois 363 MG_TETRA* tet=mg_maillage->get_mg_tetra(noeud1,noeud2,noeud3,noeud4);
158 francois 283 if (tet!=NULL)
159     {
160     clock_t cpu2=clock(); //debug
161     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
162     nbfois[11]++;
163    
164     return NULL;
165     }
166     // validit� de la solution
167     TPL_MAP_ENTITE<MG_FRONT_3D*> liste;
168     double x=0.25*(noeud1->get_x()+noeud2->get_x()+noeud3->get_x()+noeud4->get_x());
169     double y=0.25*(noeud1->get_y()+noeud2->get_y()+noeud3->get_y()+noeud4->get_y());
170     double z=0.25*(noeud1->get_z()+noeud2->get_z()+noeud3->get_z()+noeud4->get_z());
171     double longueur=1.2*sqrt((x-noeud1->get_x())*(x-noeud1->get_x())+(y-noeud1->get_y())*(y-noeud1->get_y())+(z-noeud1->get_z())*(z-noeud1->get_z()));
172     octree_de_front->rechercher(x,y,z,longueur,liste);
173     int nb_liste=liste.get_nb();
174     for (int i=0;i<nb_liste;i++)
175     {
176     MG_FRONT_3D* fttmp=liste.get(i);
177     clock_t cpu11=clock(); //debug
178    
179     int inter=inter_tetra_triangle(noeud1,noeud2,noeud3,noeud4,fttmp->get_noeud1(),fttmp->get_noeud2(),fttmp->get_noeud3());
180     clock_t cpu22=clock(); //debug
181     cpu[12]=cpu[12]+(cpu22-cpu11)/CLK_TCK;
182     nbfois[12]++;
183    
184     if (inter==true)
185     liste_intersection.ajouter(fttmp->get_triangle());
186     }
187     int nb_inter=liste_intersection.get_nb();
188     if (nb_inter>0)
189     {
190     clock_t cpu2=clock(); //debug
191     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
192     nbfois[11]++;
193     return NULL;
194     }
195     // evaluation de la situation locale on ne cree pas deux tetra voisin de volume presque nul
196     MG_TRIANGLE* triangle1=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud3->get_id(),noeud2->get_id());
197     MG_TRIANGLE* triangle2=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud2->get_id(),noeud4->get_id());
198     MG_TRIANGLE* triangle3=mg_maillage->get_mg_triangle(noeud2->get_id(),noeud3->get_id(),noeud4->get_id());
199     MG_TRIANGLE* triangle4=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud4->get_id(),noeud3->get_id());
200     double vol1=-1.;
201     double vol2=-1.;
202     double vol3=-1.;
203     double vol4=-1.;
204     if (type==GENERATION_NOEUD)
205     {
206     if (triangle1!=NULL)
207     if (triangle1->get_type_entite()==IDM3D_TRIANGLE)
208     {
209     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle1;
210     MG_TETRA* tet=tri->get_voisin(0);
211     if (tet->get_type_entite()==IDM3D_TETRA)
212     {
213     M3D_TETRA* mtet=(M3D_TETRA*)tet;
214     vol1=mtet->get_volume();
215     }
216     }
217     if (triangle2!=NULL)
218     if (triangle2->get_type_entite()==IDM3D_TRIANGLE)
219     {
220     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle2;
221     MG_TETRA* tet=tri->get_voisin(0);
222     if (tet->get_type_entite()==IDM3D_TETRA)
223     {
224     M3D_TETRA* mtet=(M3D_TETRA*)tet;
225     vol2=mtet->get_volume();
226     }
227     }
228     if (triangle3!=NULL)
229     if (triangle3->get_type_entite()==IDM3D_TRIANGLE)
230     {
231     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle3;
232     MG_TETRA* tet=tri->get_voisin(0);
233     if (tet->get_type_entite()==IDM3D_TETRA)
234     {
235     M3D_TETRA* mtet=(M3D_TETRA*)tet;
236     vol3=mtet->get_volume();
237     }
238     }
239     if (triangle4!=NULL)
240     if (triangle4->get_type_entite()==IDM3D_TRIANGLE)
241     {
242     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle4;
243     MG_TETRA* tet=tri->get_voisin(0);
244     if (tet->get_type_entite()==IDM3D_TETRA)
245     {
246     M3D_TETRA* mtet=(M3D_TETRA*)tet;
247     vol4=mtet->get_volume();
248     }
249     }
250     double vol=calcule_volume(noeud1,noeud2,noeud3,noeud4);
251     // calcul du vol du tetra ideal
252     OT_VECTEUR_3D ab(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
253     OT_VECTEUR_3D ac(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
254     OT_VECTEUR_3D da(noeud1->get_x()-noeud4->get_x(),noeud1->get_y()-noeud4->get_y(),noeud1->get_z()-noeud4->get_z());
255     OT_VECTEUR_3D vec=ab&ac;
256     vec.norme();
257     double lg_tet_ideal=fabs(vec*da*ft->get_ifail()*sqrt(3./2.));
258     double vol_ideal=sqrt(2.)/12.*lg_tet_ideal*lg_tet_ideal*lg_tet_ideal;
259     if (vol<0.1*vol_ideal)
260     {
261     if ((vol1>0.) && (vol1<0.1*vol_ideal)) {
262     clock_t cpu2=clock(); //debug
263     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
264     nbfois[11]++;
265     return NULL;
266     }
267     if ((vol2>0.) && (vol2<0.1*vol_ideal)) {
268     clock_t cpu2=clock(); //debug
269     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
270     nbfois[11]++;
271     return NULL;
272     }
273     if ((vol3>0.) && (vol3<0.1*vol_ideal)) {
274     clock_t cpu2=clock(); //debug
275     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
276     nbfois[11]++;
277     return NULL;
278     }
279     if ((vol4>0.) && (vol4<0.1*vol_ideal)) {
280     clock_t cpu2=clock(); //debug
281     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
282     nbfois[11]++;
283     return NULL;
284     }
285     }
286     }
287    
288    
289    
290    
291     // insertion du tetra
292     if (triangle1==NULL) triangle1=insere_triangle(mgvol,noeud1,noeud3,noeud2,MAILLEUR_AUTO);
293     if (triangle2==NULL) triangle2=insere_triangle(mgvol,noeud1,noeud2,noeud4,MAILLEUR_AUTO);
294     if (triangle3==NULL) triangle3=insere_triangle(mgvol,noeud2,noeud3,noeud4,MAILLEUR_AUTO);
295     if (triangle4==NULL) triangle4=insere_triangle(mgvol,noeud1,noeud4,noeud3,MAILLEUR_AUTO);
296     MG_TETRA* tetra=cree_tetra(mgvol,noeud1,noeud2,noeud3,noeud4,triangle1,triangle2,triangle3,triangle4,MAILLEUR_AUTO);
297     mg_maillage->ajouter_mg_tetra(tetra);
298     if (triangle1->get_type_entite()==IDM3D_TRIANGLE)
299     {
300     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle1;
301     tri->ajouter_voisin(tetra);
302     }
303     if (triangle2->get_type_entite()==IDM3D_TRIANGLE)
304     {
305     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle2;
306     tri->ajouter_voisin(tetra);
307     }
308     if (triangle3->get_type_entite()==IDM3D_TRIANGLE)
309     {
310     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle3;
311     tri->ajouter_voisin(tetra);
312     }
313     if (triangle4->get_type_entite()==IDM3D_TRIANGLE)
314     {
315     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle4;
316     tri->ajouter_voisin(tetra);
317     }
318     clock_t cpu2=clock(); //debug
319     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
320     nbfois[11]++;
321    
322     return tetra;
323    
324     }
325    
326    
327    
328     class MG_TRIANGLE* MAILLEUR3D::insere_triangle(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,int origine)
329     {
330     clock_t cpu1=clock(); //debug
331     // existence du triangle
332     MG_TRIANGLE* triangle=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud3->get_id(),noeud2->get_id());
333     if (triangle!=NULL) return NULL;
334     // insertion du triangle
335     MG_SEGMENT* segment1=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
336     MG_SEGMENT* segment2=mg_maillage->get_mg_segment(noeud1->get_id(),noeud3->get_id());
337     MG_SEGMENT* segment3=mg_maillage->get_mg_segment(noeud2->get_id(),noeud3->get_id());
338     if (segment1==NULL) segment1=cree_segment(mgvol,noeud1,noeud2,origine);
339     if (segment2==NULL) segment2=cree_segment(mgvol,noeud1,noeud3,origine);
340     if (segment3==NULL) segment3=cree_segment(mgvol,noeud2,noeud3,origine);
341     MG_TRIANGLE* tri=cree_triangle(mgvol,noeud1,noeud2,noeud3,segment1,segment2,segment3,origine);
342     clock_t cpu2=clock(); //debug
343     cpu[6]=cpu[6]+(cpu2-cpu1)/CLK_TCK;
344     nbfois[6]++;
345     return tri;
346     }
347    
348    
349    
350     class MG_SEGMENT* MAILLEUR3D::insere_segment(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,int origine)
351     {
352     clock_t cpu1=clock(); //debug
353     //existence du segment
354     MG_SEGMENT* segment=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
355     if (segment!=NULL) return NULL;
356     // insertion du segment
357     MG_SEGMENT* seg=cree_segment(mgvol,noeud1,noeud2,origine);
358     clock_t cpu2=clock(); //debug
359     cpu[7]=cpu[7]+(cpu2-cpu1)/CLK_TCK;
360     nbfois[7]++;
361     return seg;
362     }
363    
364    
365    
366    
367     MG_TETRA* MAILLEUR3D::cree_tetra(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4,MG_TRIANGLE* triangle1,MG_TRIANGLE* triangle2,MG_TRIANGLE* triangle3,MG_TRIANGLE* triangle4,int origine)
368     {
369     M3D_TETRA* tetra=new M3D_TETRA(mgvol,noeud1,noeud2,noeud3,noeud4,triangle1,triangle2,triangle3,triangle4,origine);
370     mg_maillage->ajouter_mg_tetra(tetra);
371     return tetra;
372     }
373    
374    
375     MG_TRIANGLE* MAILLEUR3D::cree_triangle(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_SEGMENT* segment1,MG_SEGMENT* segment2,MG_SEGMENT* segment3,int origine)
376     {
377     M3D_TRIANGLE* tri=new M3D_TRIANGLE(mgvol,noeud1,noeud2,noeud3,segment1,segment2,segment3,origine);
378     mg_maillage->ajouter_mg_triangle(tri);
379     return tri;
380     }
381    
382    
383    
384     MG_SEGMENT* MAILLEUR3D::cree_segment(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,int origine)
385     {
386     MG_SEGMENT* seg=mg_maillage->ajouter_mg_segment(mgvol,noeud1,noeud2,origine);
387     return seg;
388     }
389    
390    
391    
392     double MAILLEUR3D::calcule_volume(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
393     {
394     OT_VECTEUR_3D ab(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
395     OT_VECTEUR_3D ac(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
396     OT_VECTEUR_3D da(noeud1->get_x()-noeud4->get_x(),noeud1->get_y()-noeud4->get_y(),noeud1->get_z()-noeud4->get_z());
397    
398     OT_VECTEUR_3D pvec=ab&ac;
399     double volume=pvec*da;
400     volume=fabs(volume)/3.;
401     return volume;
402     }
403    
404    
405    
406     double MAILLEUR3D::calcule_longueur_caracteristique(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
407     {
408    
409     OT_VECTEUR_3D ab(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
410     double lg=ab.get_longueur();
411     int nb=1;
412     if (noeud3!=NULL)
413     {
414     OT_VECTEUR_3D ac(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
415     OT_VECTEUR_3D bc(noeud3->get_x()-noeud2->get_x(),noeud3->get_y()-noeud2->get_y(),noeud3->get_z()-noeud2->get_z());
416     lg=lg+ac.get_longueur()+bc.get_longueur();
417     nb=3;
418     }
419     if (noeud4!=NULL)
420     {
421     OT_VECTEUR_3D da(noeud1->get_x()-noeud4->get_x(),noeud1->get_y()-noeud4->get_y(),noeud1->get_z()-noeud4->get_z());
422     OT_VECTEUR_3D bd(noeud4->get_x()-noeud2->get_x(),noeud4->get_y()-noeud2->get_y(),noeud4->get_z()-noeud2->get_z());
423     OT_VECTEUR_3D cd(noeud4->get_x()-noeud3->get_x(),noeud4->get_y()-noeud3->get_y(),noeud4->get_z()-noeud3->get_z());
424     lg=lg+da.get_longueur()+bd.get_longueur()+cd.get_longueur();
425     nb=6;
426     }
427     lg=lg*1./nb;
428     return lg;
429    
430     }
431    
432    
433    
434    
435     int MAILLEUR3D::genere_noeud(MG_VOLUME* mgvol,MG_FRONT_3D* ft,TPL_MAP_ENTITE<MG_NOEUD*> &liste_noeud,std::vector<CAS_FRONT*> &liste_cas)
436     {
437     clock_t cpu1=clock(); //debug
438     MG_NOEUD* noeud1=ft->get_noeud1();
439     MG_NOEUD* noeud2=ft->get_noeud2();
440     MG_NOEUD* noeud3=ft->get_noeud3();
441     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
442     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
443     OT_VECTEUR_3D normal=n1n2&n1n3;
444     normal.norme();
445     double xyz1[3]={noeud1->get_x(),noeud1->get_y(),noeud1->get_z()};
446     double xyz2[3]={noeud2->get_x(),noeud2->get_y(),noeud2->get_z()};
447     double xyz3[3]={noeud3->get_x(),noeud3->get_y(),noeud3->get_z()};
448     double hauteur=0.81649658*ft->get_triangle()->get_longueur();
449     double xyzg[3]={0.333333333333*(xyz1[0]+xyz2[0]+xyz3[0]),0.333333333333*(xyz1[1]+xyz2[1]+xyz3[1]),0.333333333333*(xyz1[2]+xyz2[2]+xyz3[2])};
450     double xyz4[3];
451     do
452     {
453     xyz4[0]=xyzg[0]+hauteur*normal.get_x();
454     xyz4[1]=xyzg[1]+hauteur*normal.get_y();
455     xyz4[2]=xyzg[2]+hauteur*normal.get_z();
456     hauteur=hauteur*0.9;
457     }
458     while (metrique->valide_parametre(xyz4)==0);
459     double l1=calcul_distance_metrique(xyz1,xyz2);
460     double l2=calcul_distance_metrique(xyz1,xyz3);
461     double l3=calcul_distance_metrique(xyz2,xyz3);
462     double l=0.333333333333333*(l1+l2+l3);
463     double longueur_desiree=0.81649658*(priorite_metrique+(1-priorite_metrique)*l);
464     longueur_desiree=longueur_desiree/ft->get_ifail();
465     ajuste_distance_metrique(xyzg,xyz4,longueur_desiree);
466     OT_VECTEUR_3D hauteurajustee(xyzg[0]-xyz4[0],xyzg[1]-xyz4[1],xyzg[2]-xyz4[2]);
467     hauteur=hauteurajustee.get_longueur();
468    
469     // recherche des voisins
470     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_front;
471     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_front_proche;
472     octree_de_front->rechercher(xyz4[0],xyz4[1],xyz4[2],hauteur*1.837117307,liste_front);
473     int nb_liste=liste_front.get_nb();
474     double disref=(priorite_metrique+(1-priorite_metrique)*l)/ft->get_ifail();
475     MG_NOEUD* noeudref=NULL;
476     for (int i=0;i<nb_liste;i++)
477     {
478     MG_FRONT_3D* ft2=liste_front.get(i);
479     for (int j=0;j<3;j++)
480     {
481     MG_NOEUD* noeud_tmp;
482     if (j==0) noeud_tmp=ft2->get_noeud1();
483     if (j==1) noeud_tmp=ft2->get_noeud2();
484     if (j==2) noeud_tmp=ft2->get_noeud3();
485     double *xyz_tmp=noeud_tmp->get_coord();
486     double dis=calcul_distance_metrique(xyz_tmp,xyz4,1);
487     if (dis<disref)
488     {
489     disref=dis;
490     noeudref=noeud_tmp;
491     }
492     }
493     if (ft2!=ft)
494     {
495     double dismin=evaluer_distance_noeud_triangle(xyz4[0],xyz4[1],xyz4[2],ft2->get_triangle());
496     if (dismin<hauteur) liste_front_proche.ajouter(ft2);
497     }
498     }
499     // il y a un noeud proche
500     if (noeudref!=NULL)
501     {
502     double dis2=calcul_distance_metrique(noeudref->get_coord(),xyzg,2);
503     if (dis2<longueur_desiree*1.5)
504     if (noeudref!=noeud1)
505     if (noeudref!=noeud2)
506     if (noeudref!=noeud3)
507     {
508     liste_noeud.ajouter(noeudref);
509     clock_t cpu2=clock(); //debug
510     cpu[8]=cpu[8]+(cpu2-cpu1)/CLK_TCK;
511     nbfois[8]++;
512     return EXISTE;
513     }
514     }
515     // il n y a pas de noeud proche mais il y a une face proche
516     int nb_proche=liste_front_proche.get_nb();
517     int nb_cas=liste_cas.size();
518     if (nb_proche>0)
519     {
520     for (int i=0;i<nb_proche;i++)
521     {
522     MG_FRONT_3D* fttmp=liste_front_proche.get(i);
523     int ok=0;
524     for (int j=0;j<nb_cas;j++)
525     {
526     MG_NOEUD* casnoeud=liste_cas[j]->mgnoeud;
527     if ((fttmp->get_noeud1()==casnoeud) || (fttmp->get_noeud2()==casnoeud) || (fttmp->get_noeud3()==casnoeud) )
528     {
529     ok=1;
530     break;
531     }
532     }
533     if (ok==1) continue;
534     MG_NOEUD* noeudtmp=fttmp->get_noeud1();
535     if (noeudtmp!=noeud1)
536     if (noeudtmp!=noeud2)
537     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
538     noeudtmp=fttmp->get_noeud2();
539     if (noeudtmp!=noeud1)
540     if (noeudtmp!=noeud2)
541     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
542     noeudtmp=fttmp->get_noeud3();
543     if (noeudtmp!=noeud1)
544     if (noeudtmp!=noeud2)
545     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
546    
547     }
548     clock_t cpu2=clock(); //debug
549     cpu[8]=cpu[8]+(cpu2-cpu1)/CLK_TCK;
550     nbfois[8]++;
551     if (liste_noeud.get_nb()>0) return MULTIEXISTE;
552     }
553     // il faut creer un noeud c est parfait c est qu on veut.
554     M3D_NOEUD* nouveau_noeud=new M3D_NOEUD(mgvol,xyz4[0],xyz4[1],xyz4[2],MAILLEUR_AUTO);
555     mg_maillage->ajouter_mg_noeud(nouveau_noeud);
556     liste_noeud.ajouter(nouveau_noeud);
557     clock_t cpu2=clock(); //debug
558     cpu[8]=cpu[8]+(cpu2-cpu1)/CLK_TCK;
559     nbfois[8]++;
560     return CREATION;
561     }
562    
563    
564    
565     double MAILLEUR3D::evaluer_distance_noeud_triangle(double x,double y,double z,MG_TRIANGLE* tri)
566     {
567     double eps=0.0001;
568     MG_NOEUD* noeud1=tri->get_noeud1();
569     MG_NOEUD* noeud2=tri->get_noeud2();
570     MG_NOEUD* noeud3=tri->get_noeud3();
571     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
572     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
573     OT_VECTEUR_3D n1n4(x-noeud1->get_x(),y-noeud1->get_y(),z-noeud1->get_z());
574     OT_VECTEUR_3D n1n=n1n2&n1n3;
575     OT_MATRICE_3D matbase(n1n2,n1n3,n1n);
576     OT_MATRICE_3D matxsi(n1n4,n1n3,n1n);
577     OT_MATRICE_3D mateta(n1n2,n1n4,n1n);
578     double xsi=matxsi.get_determinant()/matbase.get_determinant();
579     double eta=mateta.get_determinant()/matbase.get_determinant();
580     double dis;
581     if ((eta>-eps) && (xsi>-eps) && (eta+xsi<1.0+eps))
582     {
583     double xproj=(1-xsi-eta)*noeud1->get_x()+xsi*noeud2->get_x()+eta*noeud3->get_x();
584     double yproj=(1-xsi-eta)*noeud1->get_y()+xsi*noeud2->get_y()+eta*noeud3->get_y();
585     double zproj=(1-xsi-eta)*noeud1->get_z()+xsi*noeud2->get_z()+eta*noeud3->get_z();
586     OT_VECTEUR_3D vec(x-xproj,y-yproj,z-zproj);
587     dis=vec.get_longueur();
588     }
589     else
590     {
591     OT_VECTEUR_3D nn1(x-noeud1->get_x(),y-noeud1->get_y(),z-noeud1->get_z());
592     OT_VECTEUR_3D nn2(x-noeud2->get_x(),y-noeud2->get_y(),z-noeud2->get_z());
593     OT_VECTEUR_3D nn3(x-noeud3->get_x(),y-noeud3->get_y(),z-noeud3->get_z());
594     dis=0.3333333333333*(nn1.get_longueur()+nn2.get_longueur()+nn3.get_longueur());
595     }
596     return dis;
597     }
598    
599    
600     void MAILLEUR3D::detruit_tetra(MG_TRIANGLE* tri)
601     {
602     clock_t cpu1=clock(); //debug
603    
604     M3D_TRIANGLE* mtri;
605     //if (tri->get_type_entite()==IDMG_TRIANGLE) return;
606     //else mtri=(M3D_TRIANGLE*)tri;
607     mtri=(M3D_TRIANGLE*)tri;
608    
609     M3D_TETRA* tet=(M3D_TETRA*)mtri->get_voisin(0);
610     M3D_TRIANGLE* mtriangle1=(M3D_TRIANGLE*)tet->get_triangle1();
611     M3D_TRIANGLE* mtriangle2=(M3D_TRIANGLE*)tet->get_triangle2();
612     M3D_TRIANGLE* mtriangle3=(M3D_TRIANGLE*)tet->get_triangle3();
613     M3D_TRIANGLE* mtriangle4=(M3D_TRIANGLE*)tet->get_triangle4();
614    
615    
616     tet->etat_detruit();
617     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_de_front;
618     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_de_front2;
619     MG_FRONT_3D* fttet1=NULL;
620     MG_FRONT_3D* fttet2=NULL;
621     MG_FRONT_3D* fttet3=NULL;
622     MG_FRONT_3D* fttet4=NULL;
623    
624     if (mtriangle1->get_etat_front()==FRONT_ACTIF)
625     {
626     MG_FRONT_3D* fttmp=mtriangle1->get_mgfront();
627     fttet1=fttmp;
628     liste_de_front.ajouter(fttmp->get_front_voisin(0));
629     liste_de_front.ajouter(fttmp->get_front_voisin(1));
630     liste_de_front.ajouter(fttmp->get_front_voisin(2));
631     //supprimer_front_en_reculant(fttmp);
632     mtriangle1->supprimer_voisin(tet);
633     }
634     else
635     {
636     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud1(),tet->get_noeud2(),tet->get_noeud3(),mtriangle1);
637     ftn1->incremente_ifail();
638     mtriangle1->supprimer_voisin(tet);
639     liste_de_front2.ajouter(ftn1);
640     }
641     if (mtriangle2->get_etat_front()==FRONT_ACTIF)
642     {
643     MG_FRONT_3D* fttmp=mtriangle2->get_mgfront();
644     fttet2=fttmp;
645     liste_de_front.ajouter(fttmp->get_front_voisin(0));
646     liste_de_front.ajouter(fttmp->get_front_voisin(1));
647     liste_de_front.ajouter(fttmp->get_front_voisin(2));
648     //supprimer_front_en_reculant(fttmp);
649     mtriangle2->supprimer_voisin(tet);
650     }
651     else
652     {
653     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud1(),tet->get_noeud4(),tet->get_noeud2(),mtriangle2);
654     ftn1->incremente_ifail();
655     mtriangle2->supprimer_voisin(tet);
656     liste_de_front2.ajouter(ftn1);
657     }
658     if (mtriangle3->get_etat_front()==FRONT_ACTIF)
659     {
660     MG_FRONT_3D* fttmp=mtriangle3->get_mgfront();
661     fttet3=fttmp;
662     liste_de_front.ajouter(fttmp->get_front_voisin(0));
663     liste_de_front.ajouter(fttmp->get_front_voisin(1));
664     liste_de_front.ajouter(fttmp->get_front_voisin(2));
665     //supprimer_front_en_reculant(fttmp);
666     mtriangle3->supprimer_voisin(tet);
667     }
668     else
669     {
670     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud2(),tet->get_noeud4(),tet->get_noeud3(),mtriangle3);
671     ftn1->incremente_ifail();
672     mtriangle3->supprimer_voisin(tet);
673     liste_de_front2.ajouter(ftn1);
674     }
675     if (mtriangle4->get_etat_front()==FRONT_ACTIF)
676     {
677     MG_FRONT_3D* fttmp=mtriangle4->get_mgfront();
678     fttet4=fttmp;
679     liste_de_front.ajouter(fttmp->get_front_voisin(0));
680     liste_de_front.ajouter(fttmp->get_front_voisin(1));
681     liste_de_front.ajouter(fttmp->get_front_voisin(2));
682     //supprimer_front_en_reculant(fttmp);
683     mtriangle4->supprimer_voisin(tet);
684     }
685     else
686     {
687     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud1(),tet->get_noeud3(),tet->get_noeud4(),mtriangle4);
688     ftn1->incremente_ifail();
689     mtriangle4->supprimer_voisin(tet);
690     liste_de_front2.ajouter(ftn1);
691     }
692    
693     if (fttet1!=NULL)
694     {
695     liste_de_front.supprimer(fttet1);
696     supprimer_front_en_reculant(fttet1);
697     }
698     if (fttet2!=NULL)
699     {
700     liste_de_front.supprimer(fttet2);
701     supprimer_front_en_reculant(fttet2);
702     }
703     if (fttet3!=NULL)
704     {
705     liste_de_front.supprimer(fttet3);
706     supprimer_front_en_reculant(fttet3);
707     }
708     if (fttet4!=NULL)
709     {
710     liste_de_front.supprimer(fttet4);
711     supprimer_front_en_reculant(fttet4);
712     }
713     int nb_liste1=liste_de_front.get_nb();
714     for (int i=0;i<nb_liste1;i++)
715     if (liste_de_front.get(i)!=NULL)
716     mise_a_jour_voisin_front(liste_de_front.get(i));
717     int nb_liste2=liste_de_front2.get_nb();
718     for (int i=0;i<nb_liste2;i++)
719     {
720     mise_a_jour_voisin_front(liste_de_front2.get(i));
721     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(0));
722     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(1));
723     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(2));
724     }
725    
726     for (int k=0;k<4;k++)
727     {
728     MG_NOEUD* noeud;
729     if (k==0) noeud=tet->get_noeud1();
730     if (k==1) noeud=tet->get_noeud2();
731     if (k==2) noeud=tet->get_noeud3();
732     if (k==3) noeud=tet->get_noeud4();
733     int nb_tet=noeud->get_lien_tetra()->get_nb();
734    
735     if (noeud->get_type_entite()==IDM3D_NOEUD)
736     {
737     int test=false;
738     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud;
739     for (int i=0;i<nb_tet;i++)
740     {
741     MG_TETRA* tet=noeud->get_lien_tetra()->get(i);
742     if (tet->get_type_entite()==IDM3D_TETRA)
743     {
744     M3D_TETRA* mtet=(M3D_TETRA*)tet;
745     if (mtet->get_etat()==ACTIF) test=true;
746     }
747     else test=true;
748     }
749     if (test==false) mnoeud->etat_detruit();
750     }
751     }
752     clock_t cpu2=clock();
753     cpu[9]=cpu[9]+(cpu2-cpu1)/CLK_TCK;
754     nbfois[9]++;
755    
756     }
757    
758     double MAILLEUR3D::calcul_distance_metrique(MG_SEGMENT* seg,int pas)
759     {
760     double *xyz1=seg->get_noeud1()->get_coord();
761     double *xyz2=seg->get_noeud2()->get_coord();
762     return calcul_distance_metrique(xyz1,xyz2,pas);
763     }
764    
765     double MAILLEUR3D::calcul_distance_metrique(double *xyz1,double* xyz2,int pas)
766     {
767     double longueur=0.;
768     double dxyz[3];
769     dxyz[0]=xyz2[0]-xyz1[0];
770     dxyz[1]=xyz2[1]-xyz1[1];
771     dxyz[2]=xyz2[2]-xyz1[2];
772     for (int i=0;i<pas;i++)
773     {
774     double ti=1.0*i/pas;
775     double tii=1.0*(i+1)/pas;
776     double tgauss1=0.7886751345*tii+0.2113248654*ti;
777     double xyz[3];
778     xyz[0]=xyz1[0]+tgauss1*(xyz2[0]-xyz1[0]);
779     xyz[1]=xyz1[1]+tgauss1*(xyz2[1]-xyz1[1]);
780     xyz[2]=xyz1[2]+tgauss1*(xyz2[2]-xyz1[2]);
781     double tenseur[9];
782     metrique->evaluer(xyz,tenseur);
783     double val= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
784     longueur=longueur+0.5*(tii-ti)*val;
785     double tgauss2=0.7886751345*ti+0.2113248654*tii;
786     xyz[0]=xyz1[0]+tgauss2*(xyz2[0]-xyz1[0]);
787     xyz[1]=xyz1[1]+tgauss2*(xyz2[1]-xyz1[1]);
788     xyz[2]=xyz1[2]+tgauss2*(xyz2[2]-xyz1[2]);
789     metrique->evaluer(xyz,tenseur);
790     val= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
791     longueur=longueur+0.5*(tii-ti)*val;
792     }
793     return longueur;
794     }
795    
796     void MAILLEUR3D::ajuste_distance_metrique(double *xyz1,double *xyz2,double longueur_desiree,int pas)
797     {
798     double longueur=0,ancienne_longueur;
799     double ti,tii;
800     double dxyz[3];
801     dxyz[0]=xyz2[0]-xyz1[0];
802     dxyz[1]=xyz2[1]-xyz1[1];
803     dxyz[2]=xyz2[2]-xyz1[2];
804     int i=0;
805     do
806     {
807     ancienne_longueur=longueur;
808     ti=1.0*i/pas;
809     tii=1.0*(i+1)/pas;
810     double tgauss1=0.7886751345*tii+0.2113248654*ti;
811     double xyz[3];
812     xyz[0]=xyz1[0]+tgauss1*(xyz2[0]-xyz1[0]);
813     xyz[1]=xyz1[1]+tgauss1*(xyz2[1]-xyz1[1]);
814     xyz[2]=xyz1[2]+tgauss1*(xyz2[2]-xyz1[2]);
815     if (i+1>pas)
816     {
817     int val=metrique->valide_parametre(xyz);
818     if (!val) return;
819     }
820     double tenseur[9];
821     metrique->evaluer(xyz,tenseur);
822     double val= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
823     longueur=longueur+0.5*(tii-ti)*val;
824     double tgauss2=0.7886751345*ti+0.2113248654*tii;
825     xyz[0]=xyz1[0]+tgauss2*(xyz2[0]-xyz1[0]);
826     xyz[1]=xyz1[1]+tgauss2*(xyz2[1]-xyz1[1]);
827     xyz[2]=xyz1[2]+tgauss2*(xyz2[2]-xyz1[2]);
828     if (i+1>pas)
829     {
830     int val=metrique->valide_parametre(xyz);
831     if (!val) return;
832     }
833     metrique->evaluer(xyz,tenseur);
834     val= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
835     longueur=longueur+0.5*(tii-ti)*val;
836     i++;
837     }
838     while (longueur<longueur_desiree);
839     double t=ti+(tii-ti)*(longueur_desiree-ancienne_longueur)/(longueur-ancienne_longueur);
840     xyz2[0]=xyz1[0]+t*(xyz2[0]-xyz1[0]);
841     xyz2[1]=xyz1[1]+t*(xyz2[1]-xyz1[1]);
842     xyz2[2]=xyz1[2]+t*(xyz2[2]-xyz1[2]);
843     }
844    
845     void MAILLEUR3D::detruit_element_inactif(void)
846     {
847     clock_t cpu1=clock();
848     TPL_MAP_ENTITE<MG_TETRA*> lsttet;
849     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
850     LISTE_MG_TETRA::iterator it;
851    
852     for (MG_TETRA* tet=mg_maillage->get_premier_tetra(it);tet!=NULL;tet=mg_maillage->get_suivant_tetra(it))
853     {
854     M3D_TETRA* mtet=(M3D_TETRA*)tet;
855     if (mtet->get_etat()==DETRUIT)
856     lsttet.ajouter(tet);
857     }
858     LISTE_MG_NOEUD::iterator it2;
859     for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(it2);noeud!=NULL;noeud=mg_maillage->get_suivant_noeud(it2))
860     {
861     if (noeud->get_type_entite()==IDM3D_NOEUD)
862     {
863     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud;
864     if (mnoeud->get_etat()==DETRUIT)
865     lstnoeud.ajouter(noeud);
866     }
867     }
868     TPL_MAP_ENTITE<MG_TETRA*>::ITERATEUR it3;
869     for (MG_TETRA* tet=lsttet.get_premier(it3);tet!=NULL;tet=lsttet.get_suivant(it3))
870     mg_maillage->supprimer_mg_tetraid(tet->get_id());
871     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it4;
872     for (MG_NOEUD* noeud=lstnoeud.get_premier(it4);noeud!=NULL;noeud=lstnoeud.get_suivant(it4))
873     mg_maillage->supprimer_mg_noeudid(noeud->get_id());
874    
875     clock_t cpu2=clock();
876     cpu[10]=cpu[10]+(cpu2-cpu1)/CLK_TCK;
877     nbfois[10]++;
878     }
879    
880    
881    
882     double MAILLEUR3D::calcul_volume_tetra_metrique(MG_TETRA* tet)
883     {
884     double *xyz1=tet->get_noeud1()->get_coord();
885     double *xyz2=tet->get_noeud2()->get_coord();
886     double *xyz3=tet->get_noeud3()->get_coord();
887     double *xyz4=tet->get_noeud4()->get_coord();
888     /*double xyzm[3];
889     double xyzg[3];
890     xyzm[0]=(xyz1[0]+xyz2[0])/2.;
891     xyzm[1]=(xyz1[1]+xyz2[1])/2.;
892     xyzm[2]=(xyz1[2]+xyz2[2])/2.;
893     xyzg[0]=(xyz1[0]+xyz2[0]+xyz3[0])/3.;
894     xyzg[1]=(xyz1[1]+xyz2[1]+xyz3[1])/3.;
895     xyzg[2]=(xyz1[2]+xyz2[2]+xyz3[2])/3.;
896     double base=calcul_distance_metrique(xyz1,xyz2);
897     double hauteur=calcul_distance_metrique(xyzm,xyz3);
898     double hauteur2=calcul_distance_metrique(xyzg,xyz4);
899     double vol=base*hauteur*hauteur2*1.414213562;*/
900     double a=0.1381966012;
901     double b=0.5854101965;
902     double poids_gauss[4],xsi_gauss[4],eta_gauss[4],zeta_gauss[4];
903     poids_gauss[0]=0.041666666666666;
904     xsi_gauss[0]=a;
905     eta_gauss[0]=a;
906     zeta_gauss[0]=a;
907     poids_gauss[1]=0.041666666666666;
908     xsi_gauss[1]=a;
909     eta_gauss[1]=a;
910     zeta_gauss[1]=b;
911     poids_gauss[2]=0.041666666666666;
912     xsi_gauss[2]=a;
913     eta_gauss[2]=b;
914     zeta_gauss[2]=a;
915     poids_gauss[3]=0.041666666666666;
916     xsi_gauss[3]=b;
917     eta_gauss[3]=a;
918     zeta_gauss[3]=a;
919     OT_VECTEUR_3D vec1(xyz1,xyz2);
920     OT_VECTEUR_3D vec2(xyz1,xyz3);
921     OT_VECTEUR_3D vec3(xyz1,xyz4);
922     double facteur=(vec1&vec2)*vec3;
923     double vol=0.;
924     for (int j=0;j<4;j++)
925     {
926     double xyz[3];
927     xyz[0]=(1-xsi_gauss[j]-eta_gauss[j]-zeta_gauss[j])*xyz1[0]+xsi_gauss[j]*xyz2[0]+eta_gauss[j]*xyz3[0]+zeta_gauss[j]*xyz4[0];
928     xyz[1]=(1-xsi_gauss[j]-eta_gauss[j]-zeta_gauss[j])*xyz1[1]+xsi_gauss[j]*xyz2[1]+eta_gauss[j]*xyz3[1]+zeta_gauss[j]*xyz4[1];
929     xyz[2]=(1-xsi_gauss[j]-eta_gauss[j]-zeta_gauss[j])*xyz1[2]+xsi_gauss[j]*xyz2[2]+eta_gauss[j]*xyz3[2]+zeta_gauss[j]*xyz4[2];
930     double tenseur[9];
931     metrique->evaluer(xyz,tenseur);
932     double dens=1/sqrt(tenseur[0]);
933     dens=dens*dens*dens;
934     vol=vol+poids_gauss[j]*facteur*8.485281374/dens;
935     }
936    
937     return vol;
938     }
939    
940    
941     void MAILLEUR3D::analyse_maillage_obtenu(double &vol)
942     {
943     int nb=mg_maillage->get_nb_mg_tetra();
944     vol=0.;
945     for (int i=0;i<nb;i++)
946     {
947     MG_TETRA* tet=mg_maillage->get_mg_tetra(i);
948     vol=vol+calcul_volume_tetra_metrique(tet);
949     }
950     }
951    
952    
953     void MAILLEUR3D::insere_contrainte_tetra(MG_VOLUME* mgvol,TPL_LISTE_ENTITE<MG_TETRA*> *lsttet)
954     {
955     map<long,long,less<long> > lstcorrespondancenoeud;
956     int nbtet=lsttet->get_nb();
957     for (int i=0;i<nbtet;i++)
958     {
959     M3D_TETRA* tet=(M3D_TETRA*)lsttet->get(i);
960     double *xyz1=tet->get_noeud1()->get_coord();
961     double *xyz2=tet->get_noeud2()->get_coord();
962     double *xyz3=tet->get_noeud3()->get_coord();
963     double *xyz4=tet->get_noeud4()->get_coord();
964     double xyz[3];
965     xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0]+xyz4[0])*0.25;
966     xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1]+xyz4[1])*0.25;
967     xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2]+xyz4[2])*0.25;
968     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_trouvee;
969     OT_VECTEUR_3D vec1(xyz,xyz1);
970     OT_VECTEUR_3D vec2(xyz,xyz2);
971     OT_VECTEUR_3D vec3(xyz,xyz3);
972     OT_VECTEUR_3D vec4(xyz,xyz4);
973     double rayonrecherche=vec1.get_longueur();
974     if (vec2.get_longueur()>rayonrecherche) rayonrecherche=vec2.get_longueur();
975     if (vec3.get_longueur()>rayonrecherche) rayonrecherche=vec3.get_longueur();
976     if (vec4.get_longueur()>rayonrecherche) rayonrecherche=vec4.get_longueur();
977     rayonrecherche=rayonrecherche*1.1;
978     octree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
979     MG_NOEUD* noeudref1=NULL;
980     if (lstcorrespondancenoeud.find(tet->get_noeud1()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
981     noeudref1=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud1()->get_nouveau_numero()]);
982     MG_NOEUD* noeudref2=NULL;
983     if (lstcorrespondancenoeud.find(tet->get_noeud2()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
984     noeudref2=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud2()->get_nouveau_numero()]);
985     MG_NOEUD* noeudref3=NULL;
986     if (lstcorrespondancenoeud.find(tet->get_noeud3()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
987     noeudref3=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud3()->get_nouveau_numero()]);
988     MG_NOEUD* noeudref4=NULL;
989     if (lstcorrespondancenoeud.find(tet->get_noeud4()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
990     noeudref4=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud4()->get_nouveau_numero()]);
991     int nbtrouve=liste_trouvee.get_nb();
992     for (int j=0;j<nbtrouve;j++)
993     {
994     if ((noeudref1!=NULL) && (noeudref2!=NULL) && (noeudref3!=NULL) && (noeudref4!=NULL) ) break;
995     MG_FRONT_3D* ft=liste_trouvee.get(j);
996     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
997     lstnoeud.ajouter(ft->get_noeud1());
998     lstnoeud.ajouter(ft->get_noeud2());
999     lstnoeud.ajouter(ft->get_noeud3());
1000     if (noeudref1==NULL)
1001     {
1002     int nb=lstnoeud.get_nb();
1003     for (int k=0;k<nb;k++)
1004     {
1005     double *xyztmp=lstnoeud.get(k)->get_coord();
1006     OT_VECTEUR_3D vec(xyztmp,xyz1);
1007     double longueur=vec.get_longueur();
1008     if (longueur<1e-6*rayonrecherche)
1009     {
1010     noeudref1=lstnoeud.get(k);
1011     lstnoeud.supprimer(lstnoeud.get(k));
1012     break;
1013     }
1014     }
1015     }
1016     if (noeudref2==NULL)
1017     {
1018     int nb=lstnoeud.get_nb();
1019     for (int k=0;k<nb;k++)
1020     {
1021     double *xyztmp=lstnoeud.get(k)->get_coord();
1022     OT_VECTEUR_3D vec(xyztmp,xyz2);
1023     double longueur=vec.get_longueur();
1024     if (longueur<1e-6*rayonrecherche)
1025     {
1026     noeudref2=lstnoeud.get(k);
1027     lstnoeud.supprimer(lstnoeud.get(k));
1028     break;
1029     }
1030     }
1031     }
1032     if (noeudref3==NULL)
1033     {
1034     int nb=lstnoeud.get_nb();
1035     for (int k=0;k<nb;k++)
1036     {
1037     double *xyztmp=lstnoeud.get(k)->get_coord();
1038     OT_VECTEUR_3D vec(xyztmp,xyz3);
1039     double longueur=vec.get_longueur();
1040     if (longueur<1e-6*rayonrecherche)
1041     {
1042     noeudref3=lstnoeud.get(k);
1043     lstnoeud.supprimer(lstnoeud.get(k));
1044     break;
1045     }
1046     }
1047     }
1048     if (noeudref4==NULL)
1049     {
1050     int nb=lstnoeud.get_nb();
1051     for (int k=0;k<nb;k++)
1052     {
1053     double *xyztmp=lstnoeud.get(k)->get_coord();
1054     OT_VECTEUR_3D vec(xyztmp,xyz4);
1055     double longueur=vec.get_longueur();
1056     if (longueur<1e-6*rayonrecherche)
1057     {
1058     noeudref4=lstnoeud.get(k);
1059     lstnoeud.supprimer(lstnoeud.get(k));
1060     break;
1061     }
1062     }
1063     }
1064     }
1065     if (noeudref1==NULL)
1066     {
1067     noeudref1=mg_maillage->ajouter_mg_noeud(mgvol,xyz1[0],xyz1[1],xyz1[2],IMPOSE);
1068     if (tet->get_noeud1()->get_nouveau_numero()!=(-1))
1069     {
1070     noeudref1->change_nouveau_numero(tet->get_noeud1()->get_nouveau_numero());
1071     pair<long,long> tmp(noeudref1->get_nouveau_numero(),noeudref1->get_id());
1072     lstcorrespondancenoeud.insert(tmp);
1073     }
1074     }
1075     if (noeudref2==NULL)
1076     {
1077     noeudref2=mg_maillage->ajouter_mg_noeud(mgvol,xyz2[0],xyz2[1],xyz2[2],IMPOSE);
1078     if (tet->get_noeud2()->get_nouveau_numero()!=(-1))
1079     {
1080     noeudref2->change_nouveau_numero(tet->get_noeud2()->get_nouveau_numero());
1081     pair<long,long> tmp(noeudref2->get_nouveau_numero(),noeudref2->get_id());
1082     lstcorrespondancenoeud.insert(tmp);
1083     }
1084     }
1085     if (noeudref3==NULL)
1086     {
1087     noeudref3=mg_maillage->ajouter_mg_noeud(mgvol,xyz3[0],xyz3[1],xyz3[2],IMPOSE);
1088     if (tet->get_noeud3()->get_nouveau_numero()!=(-1))
1089     {
1090     noeudref3->change_nouveau_numero(tet->get_noeud3()->get_nouveau_numero());
1091     pair<long,long> tmp(noeudref3->get_nouveau_numero(),noeudref3->get_id());
1092     lstcorrespondancenoeud.insert(tmp);
1093     }
1094     }
1095     if (noeudref4==NULL)
1096     {
1097     noeudref4=mg_maillage->ajouter_mg_noeud(mgvol,xyz4[0],xyz4[1],xyz4[2],IMPOSE);
1098     if (tet->get_noeud4()->get_nouveau_numero()!=(-1))
1099     {
1100     noeudref4->change_nouveau_numero(tet->get_noeud4()->get_nouveau_numero());
1101     pair<long,long> tmp(noeudref4->get_nouveau_numero(),noeudref4->get_id());
1102     lstcorrespondancenoeud.insert(tmp);
1103     }
1104     }
1105     M3D_TRIANGLE* triangle1=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref3->get_id(),noeudref2->get_id());
1106     M3D_TRIANGLE* triangle2=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref2->get_id(),noeudref4->get_id());
1107     M3D_TRIANGLE* triangle3=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref2->get_id(),noeudref3->get_id(),noeudref4->get_id());
1108     M3D_TRIANGLE* triangle4=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref4->get_id(),noeudref3->get_id());
1109     if (triangle1==NULL) triangle1=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref3,noeudref2,IMPOSE);
1110     if (triangle2==NULL) triangle2=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref2,noeudref4,IMPOSE);
1111     if (triangle3==NULL) triangle3=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref2,noeudref3,noeudref4,IMPOSE);
1112     if (triangle4==NULL) triangle4=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref4,noeudref3,IMPOSE);
1113     MG_TETRA* tetra=cree_tetra(mgvol,noeudref1,noeudref2,noeudref3,noeudref4,triangle1,triangle2,triangle3,triangle4,IMPOSE);
1114     tetra->change_nouveau_numero(tet->get_nouveau_numero());
1115     mg_maillage->ajouter_mg_tetra(tetra);
1116     triangle1->ajouter_voisin(tetra);
1117     triangle2->ajouter_voisin(tetra);
1118     triangle3->ajouter_voisin(tetra);
1119     triangle4->ajouter_voisin(tetra);
1120     MG_FRONT_3D *ftref1=NULL;
1121     MG_FRONT_3D *ftref2=NULL;
1122     MG_FRONT_3D *ftref3=NULL;
1123     MG_FRONT_3D *ftref4=NULL;
1124     if (triangle1->get_etat_front()==FRONT_ACTIF) ftref1=triangle1->get_mgfront();
1125     if (triangle2->get_etat_front()==FRONT_ACTIF) ftref2=triangle2->get_mgfront();
1126     if (triangle3->get_etat_front()==FRONT_ACTIF) ftref3=triangle3->get_mgfront();
1127     if (triangle4->get_etat_front()==FRONT_ACTIF) ftref4=triangle4->get_mgfront();
1128     TPL_MAP_ENTITE<MG_FRONT_3D*> lstfront;
1129     MG_FRONT_3D *ft1=NULL;
1130     MG_FRONT_3D *ft2=NULL;
1131     MG_FRONT_3D *ft3=NULL;
1132     MG_FRONT_3D *ft4=NULL;
1133     if (ftref1==NULL) ft1=mise_a_jour_front(tetra,0,NONFORCE);
1134     else
1135     {
1136     lstfront.ajouter(ftref1->get_front_voisin(0));
1137     lstfront.ajouter(ftref1->get_front_voisin(1));
1138     lstfront.ajouter(ftref1->get_front_voisin(2));
1139     supprimer_front_en_avancant_sans_delete(ftref1);
1140     }
1141     if (ftref2==NULL) ft2=mise_a_jour_front(tetra,1,NONFORCE);
1142     else
1143     {
1144     lstfront.ajouter(ftref2->get_front_voisin(0));
1145     lstfront.ajouter(ftref2->get_front_voisin(1));
1146     lstfront.ajouter(ftref2->get_front_voisin(2));
1147     supprimer_front_en_avancant_sans_delete(ftref2);
1148     }
1149     if (ftref3==NULL) ft3=mise_a_jour_front(tetra,2,NONFORCE);
1150     else
1151     {
1152     lstfront.ajouter(ftref3->get_front_voisin(0));
1153     lstfront.ajouter(ftref3->get_front_voisin(1));
1154     lstfront.ajouter(ftref3->get_front_voisin(2));
1155     supprimer_front_en_avancant_sans_delete(ftref3);
1156     }
1157     if (ftref4==NULL) ft4=mise_a_jour_front(tetra,3,NONFORCE);
1158     else
1159     {
1160     lstfront.ajouter(ftref4->get_front_voisin(0));
1161     lstfront.ajouter(ftref4->get_front_voisin(1));
1162     lstfront.ajouter(ftref4->get_front_voisin(2));
1163     supprimer_front_en_avancant_sans_delete(ftref4);
1164     }
1165     if (ftref1!=NULL) {
1166     lstfront.supprimer(ftref1);
1167     delete ftref1;
1168     }
1169     if (ftref2!=NULL) {
1170     lstfront.supprimer(ftref2);
1171     delete ftref2;
1172     }
1173     if (ftref3!=NULL) {
1174     lstfront.supprimer(ftref3);
1175     delete ftref3;
1176     }
1177     if (ftref4!=NULL) {
1178     lstfront.supprimer(ftref4);
1179     delete ftref4;
1180     }
1181     if (ft1!=NULL)
1182     {
1183     mise_a_jour_voisin_front(ft1);
1184     lstfront.ajouter(ft1->get_front_voisin(0));
1185     lstfront.ajouter(ft1->get_front_voisin(1));
1186     lstfront.ajouter(ft1->get_front_voisin(2));
1187     }
1188     if (ft2!=NULL)
1189     {
1190     mise_a_jour_voisin_front(ft2);
1191     lstfront.ajouter(ft2->get_front_voisin(0));
1192     lstfront.ajouter(ft2->get_front_voisin(1));
1193     lstfront.ajouter(ft2->get_front_voisin(2));
1194     }
1195     if (ft3!=NULL)
1196     {
1197     mise_a_jour_voisin_front(ft3);
1198     lstfront.ajouter(ft3->get_front_voisin(0));
1199     lstfront.ajouter(ft3->get_front_voisin(1));
1200     lstfront.ajouter(ft3->get_front_voisin(2));
1201     }
1202     if (ft4!=NULL)
1203     {
1204     mise_a_jour_voisin_front(ft4);
1205     lstfront.ajouter(ft4->get_front_voisin(0));
1206     lstfront.ajouter(ft4->get_front_voisin(1));
1207     lstfront.ajouter(ft4->get_front_voisin(2));
1208     }
1209    
1210     for (int l=0;l<lstfront.get_nb();l++) mise_a_jour_voisin_front(lstfront.get(l));
1211    
1212     }
1213     }
1214    
1215     void MAILLEUR3D::insere_contrainte_triangle(MG_VOLUME* mgvol,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
1216     {
1217     int nbtri=lsttri->get_nb();
1218     for (int i=0;i<nbtri;i++)
1219     {
1220     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)lsttri->get(i);
1221     double *xyz1=tri->get_noeud1()->get_coord();
1222     double *xyz2=tri->get_noeud2()->get_coord();
1223     double *xyz3=tri->get_noeud3()->get_coord();
1224     double xyz[3];
1225     xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0])/3.;
1226     xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1])/3.;
1227     xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2])/3.;
1228     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_trouvee;
1229     OT_VECTEUR_3D vec1(xyz,xyz1);
1230     OT_VECTEUR_3D vec2(xyz,xyz2);
1231     OT_VECTEUR_3D vec3(xyz,xyz3);
1232     double rayonrecherche=vec1.get_longueur();
1233     if (vec2.get_longueur()>rayonrecherche) rayonrecherche=vec2.get_longueur();
1234     if (vec3.get_longueur()>rayonrecherche) rayonrecherche=vec3.get_longueur();
1235     rayonrecherche=rayonrecherche*1.1;
1236     octree_de_front->rechercher(xyz[0],xyz[2],xyz[2],rayonrecherche,liste_trouvee);
1237     MG_NOEUD* noeudref1=NULL;
1238     MG_NOEUD* noeudref2=NULL;
1239     MG_NOEUD* noeudref3=NULL;
1240     int nbtrouve=liste_trouvee.get_nb();
1241     for (int j=0;j<nbtrouve;j++)
1242     {
1243     MG_FRONT_3D* ft=liste_trouvee.get(j);
1244     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
1245     lstnoeud.ajouter(ft->get_noeud1());
1246     lstnoeud.ajouter(ft->get_noeud2());
1247     lstnoeud.ajouter(ft->get_noeud3());
1248     int nb=lstnoeud.get_nb();
1249     for (int k=0;k<nb;k++)
1250     {
1251     double *xyztmp=lstnoeud.get(k)->get_coord();
1252     OT_VECTEUR_3D vec(xyztmp,xyz1);
1253     double longueur=vec.get_longueur();
1254     if (longueur<1e-10*rayonrecherche)
1255     {
1256     noeudref1=lstnoeud.get(k);
1257     lstnoeud.supprimer(lstnoeud.get(k));
1258     break;
1259     }
1260     }
1261     nb=lstnoeud.get_nb();
1262     for (int k=0;k<nb;k++)
1263     {
1264     double *xyztmp=lstnoeud.get(k)->get_coord();
1265     OT_VECTEUR_3D vec(xyztmp,xyz2);
1266     double longueur=vec.get_longueur();
1267     if (longueur<1e-10*rayonrecherche)
1268     {
1269     noeudref2=lstnoeud.get(k);
1270     lstnoeud.supprimer(lstnoeud.get(k));
1271     break;
1272     }
1273     }
1274     nb=lstnoeud.get_nb();
1275     for (int k=0;k<nb;k++)
1276     {
1277     double *xyztmp=lstnoeud.get(k)->get_coord();
1278     OT_VECTEUR_3D vec(xyztmp,xyz3);
1279     double longueur=vec.get_longueur();
1280     if (longueur<1e-10*rayonrecherche)
1281     {
1282     noeudref3=lstnoeud.get(k);
1283     lstnoeud.supprimer(lstnoeud.get(k));
1284     break;
1285     }
1286     }
1287    
1288     }
1289     if (noeudref1==NULL)
1290     {
1291     noeudref1=mg_maillage->ajouter_mg_noeud(mgvol,xyz1[0],xyz1[1],xyz1[2],IMPOSE);
1292     noeudref1->change_nouveau_numero(tri->get_noeud1()->get_nouveau_numero());
1293     }
1294     if (noeudref2==NULL)
1295     {
1296     noeudref2=mg_maillage->ajouter_mg_noeud(mgvol,xyz2[0],xyz2[1],xyz2[2],IMPOSE);
1297     noeudref2->change_nouveau_numero(tri->get_noeud2()->get_nouveau_numero());
1298     }
1299     if (noeudref3==NULL)
1300     {
1301     noeudref3=mg_maillage->ajouter_mg_noeud(mgvol,xyz3[0],xyz3[1],xyz3[2],IMPOSE);
1302     noeudref3->change_nouveau_numero(tri->get_noeud3()->get_nouveau_numero());
1303     }
1304    
1305     MG_SEGMENT* segment1=mg_maillage->get_mg_segment(noeudref1->get_id(),noeudref2->get_id());
1306     MG_SEGMENT* segment2=mg_maillage->get_mg_segment(noeudref1->get_id(),noeudref3->get_id());
1307     MG_SEGMENT* segment3=mg_maillage->get_mg_segment(noeudref2->get_id(),noeudref3->get_id());
1308     if (segment1==NULL) segment1=cree_segment(mgvol,noeudref1,noeudref2,IMPOSE);
1309     if (segment2==NULL) segment2=cree_segment(mgvol,noeudref1,noeudref3,IMPOSE);
1310     if (segment3==NULL) segment3=cree_segment(mgvol,noeudref2,noeudref3,IMPOSE);
1311     MG_TRIANGLE* nvtri=cree_triangle(mgvol,noeudref1,noeudref2,noeudref3,segment1,segment2,segment3,IMPOSE);
1312     MG_TRIANGLE* nvtri2=cree_triangle(mgvol,noeudref1,noeudref3,noeudref2,segment1,segment2,segment3,IMPOSE);
1313     //MG_TRIANGLE* nvtri=insere_triangle(mgvol,noeudref1,noeudref2,noeudref3,IMPOSE);
1314     //MG_TRIANGLE* nvtri2=insere_triangle(mgvol,noeudref1,noeudref3,noeudref2,IMPOSE);
1315     MG_FRONT_3D *ft=ajouter_front_courant(NONFORCE,noeudref1,noeudref2,noeudref3,nvtri);
1316     MG_FRONT_3D *ft2=ajouter_front_courant(NONFORCE,noeudref1,noeudref3,noeudref2,nvtri2);
1317     mise_a_jour_voisin_front(ft);
1318     mise_a_jour_voisin_front(ft2);
1319     mise_a_jour_voisin_front(ft->get_front_voisin(0));
1320     mise_a_jour_voisin_front(ft->get_front_voisin(1));
1321     mise_a_jour_voisin_front(ft->get_front_voisin(2));
1322     mise_a_jour_voisin_front(ft2->get_front_voisin(0));
1323     mise_a_jour_voisin_front(ft2->get_front_voisin(1));
1324     mise_a_jour_voisin_front(ft2->get_front_voisin(2));
1325    
1326     }
1327    
1328    
1329    
1330    
1331     }
1332