ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_outil.cpp
Revision: 388
Committed: Tue Feb 12 15:43:42 2013 UTC (12 years, 6 months ago) by francois
File size: 53076 byte(s)
Log Message:
Meilleuire structuration du calcul de l'angle matière entre deux triangles

File Contents

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