ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 558
Committed: Fri Oct 3 21:35:13 2014 UTC (10 years, 8 months ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_front.cpp
File size: 46162 byte(s)
Log Message:
robustesse des mailleurs 3D amélioree

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4 francois 190 // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6 5 //------------------------------------------------------------
7 francois 190 // 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 5 // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mailleur3d_front.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20 francois 190 // Version du 02/03/2006 � 11H23
21 5 //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26    
27    
28     //#pragma hdrstop
29    
30     #include <math.h>
31     #include "ot_mathematique.h"
32     #include "mailleur3d_front.h"
33     #include "m3d_noeud.h"
34     #include "m3d_triangle.h"
35     #include "m3d_tetra.h"
36     #include "const.h"
37 francois 35 #include "mg_gestionnaire.h"
38 5
39     //---------------------------------------------------------------------------
40    
41     //#pragma package(smart_init)
42    
43    
44    
45     #include <fstream>
46    
47     CAS_FRONT::CAS_FRONT(int type_cas,MG_NOEUD* noeud,int numero_cote)
48     {
49     type=type_cas;
50     degre=0;
51     mgnoeud=noeud;
52     liaison[0]=0;
53     liaison[1]=0;
54     liaison[2]=0;
55     angle[0]=0.;
56     angle[1]=0.;
57     angle[2]=0.;
58     traite=PASTRAITE;
59     }
60    
61     CAS_FRONT::~CAS_FRONT()
62     {
63     }
64    
65    
66    
67     void MAILLEUR3D::progresse_front(MG_VOLUME* mgvol)
68     {
69     char mess[255];
70 francois 532 int couche=0;
71 francois 35 if (affichageactif==1)
72     {
73     char mess[500];
74 francois 558 sprintf(mess," Initialisation du front. Reste %d fronts ",get_nb_front(front_attente)+get_nb_front_courant());
75     affiche(mess);
76 francois 494 if (savedbg) mg_maillage->get_gestionnaire()->enregistrer(nomfichierdbg);
77 francois 35 }
78 francois 61 if (activelog) ini_log();
79 francois 558 passe=0;
80 5 while (get_nb_front(front_attente)+get_nb_front_courant()!=0)
81     {
82     std::vector<CAS_FRONT*> liste_cas;
83 francois 558 passe++;
84 francois 552 int numfront=premier_front_courant();
85 francois 61 if (activelog)
86     if (numfront==(-1)) genere_log(1); else genere_log(0);
87 5 if (numfront==(-1))
88     {
89 francois 61 couche++;
90 francois 558 int nb=get_nb_front(front_attente);
91 5 for (int i=0;i<nb;i++)
92 francois 558 {
93     MG_FRONT_3D* fttmp=get_premier_front(front_attente);
94     if (nb>100) fttmp->ini_ifail();
95     echange_de_front(fttmp,NONFORCE);
96     }
97     detruit_element_inactif();
98 5 numfront=premier_front_courant();
99 francois 35 if (affichageactif==1)
100     {
101     char mess[500];
102 francois 558 sprintf(mess," Couche numero %d terminee. Reste %d fronts. Iteration %d.",couche,nb,passe);
103 francois 425 affiche(mess);
104 francois 558 }
105     if (savedbg) mg_maillage->get_gestionnaire()->enregistrer(nomfichierdbg);
106 5 }
107     if (numfront==(-1)) continue;
108 francois 552 MG_FRONT_3D* ft=get_premier_front(front_courant[numfront]);
109 5
110     int bouclebis;
111     do
112     {
113     // recherche des cas de front
114     //ADJACENCE
115     bouclebis=false;
116     MG_NOEUD* noeudtmp;
117     MG_FRONT_3D* fttmp=ft->get_front_voisin(0);
118     if ((fttmp->get_noeud1()!=ft->get_noeud1()) && (fttmp->get_noeud1()!=ft->get_noeud2())) noeudtmp=fttmp->get_noeud1();
119     else if ((fttmp->get_noeud2()!=ft->get_noeud1()) && (fttmp->get_noeud2()!=ft->get_noeud2())) noeudtmp=fttmp->get_noeud2();
120     else if ((fttmp->get_noeud3()!=ft->get_noeud1()) && (fttmp->get_noeud3()!=ft->get_noeud2())) noeudtmp=fttmp->get_noeud3();
121     insere_cas_front(ADJACENT,noeudtmp,0,ft->get_angle_voisin(0),liste_cas);
122     fttmp=ft->get_front_voisin(1);
123     if ((fttmp->get_noeud1()!=ft->get_noeud1()) && (fttmp->get_noeud1()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud1();
124     else if ((fttmp->get_noeud2()!=ft->get_noeud1()) && (fttmp->get_noeud2()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud2();
125     else if ((fttmp->get_noeud3()!=ft->get_noeud1()) && (fttmp->get_noeud3()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud3();
126     insere_cas_front(ADJACENT,noeudtmp,1,ft->get_angle_voisin(1),liste_cas);
127     fttmp=ft->get_front_voisin(2);
128     if ((fttmp->get_noeud1()!=ft->get_noeud2()) && (fttmp->get_noeud1()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud1();
129     else if ((fttmp->get_noeud2()!=ft->get_noeud2()) && (fttmp->get_noeud2()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud2();
130     else if ((fttmp->get_noeud3()!=ft->get_noeud2()) && (fttmp->get_noeud3()!=ft->get_noeud3())) noeudtmp=fttmp->get_noeud3();
131     insere_cas_front(ADJACENT,noeudtmp,2,ft->get_angle_voisin(2),liste_cas);
132     //LIE
133     MG_NOEUD* mgnoeud1=ft->get_noeud1();
134     MG_NOEUD* mgnoeud2=ft->get_noeud2();
135     MG_NOEUD* mgnoeud3=ft->get_noeud3();
136     int nb_seg=mgnoeud1->get_lien_segment()->get_nb();
137     for (int i=0;i<nb_seg;i++)
138     {
139     MG_SEGMENT* seg=mgnoeud1->get_lien_segment()->get(i);
140     MG_NOEUD* noeudtmp;
141     if (seg->get_noeud1()==mgnoeud1) noeudtmp=seg->get_noeud2(); else noeudtmp=seg->get_noeud1();
142     int etat=ACTIF;
143     if (noeudtmp->get_type_entite()==IDM3D_NOEUD)
144     {
145     M3D_NOEUD* m3dno=(M3D_NOEUD*)noeudtmp;
146     etat=m3dno->get_etat();
147     }
148     if (etat==ACTIF)
149     if (noeudtmp!=mgnoeud2)
150     if (noeudtmp!=mgnoeud3)
151     {
152     double angle=angle_front(ft,seg);
153     insere_cas_front(LIE,noeudtmp,0,angle,liste_cas);
154     }
155    
156     }
157     nb_seg=mgnoeud2->get_lien_segment()->get_nb();
158     for (int i=0;i<nb_seg;i++)
159     {
160     MG_SEGMENT* seg=mgnoeud2->get_lien_segment()->get(i);
161     MG_NOEUD* noeudtmp;
162     if (seg->get_noeud1()==mgnoeud2) noeudtmp=seg->get_noeud2(); else noeudtmp=seg->get_noeud1();
163     int etat=ACTIF;
164     if (noeudtmp->get_type_entite()==IDM3D_NOEUD)
165     {
166     M3D_NOEUD* m3dno=(M3D_NOEUD*)noeudtmp;
167     etat=m3dno->get_etat();
168     }
169     if (etat==ACTIF)
170     if (noeudtmp!=mgnoeud1)
171     if (noeudtmp!=mgnoeud3)
172     {
173     double angle=angle_front(ft,seg);
174     insere_cas_front(LIE,noeudtmp,1,angle,liste_cas);
175     }
176    
177     }
178     nb_seg=mgnoeud3->get_lien_segment()->get_nb();
179     for (int i=0;i<nb_seg;i++)
180     {
181     MG_SEGMENT* seg=mgnoeud3->get_lien_segment()->get(i);
182     MG_NOEUD* noeudtmp;
183     if (seg->get_noeud1()==mgnoeud3) noeudtmp=seg->get_noeud2(); else noeudtmp=seg->get_noeud1();
184     int etat=ACTIF;
185     if (noeudtmp->get_type_entite()==IDM3D_NOEUD)
186     {
187     M3D_NOEUD* m3dno=(M3D_NOEUD*)noeudtmp;
188     etat=m3dno->get_etat();
189     }
190     if (etat==ACTIF)
191     if (noeudtmp!=mgnoeud1)
192     if (noeudtmp!=mgnoeud2)
193     {
194     double angle=angle_front(ft,seg);
195     insere_cas_front(LIE,noeudtmp,0,angle,liste_cas);
196     }
197    
198     }
199 francois 190 // classement des diff�rents cas
200 5 int nb_cas=liste_cas.size();
201     std::vector<CAS_FRONT*> liste_classe_cas[8];
202     // insertion du cas general
203     liste_classe_cas[GENERAL].insert(liste_classe_cas[GENERAL].end(),NULL);
204     for (int j=0;j<nb_cas;j++)
205     {
206     CAS_FRONT* cas=liste_cas[j];
207     if ((cas->type==ADJACENT) && (cas->degre==3))
208     {
209     cas->type=ADJACENT3;
210     double angle=4*M_PI;
211     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
212     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
213     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
214     if (angle<M_PI) liste_classe_cas[ADJACENT3].insert(liste_classe_cas[ADJACENT3].end(),cas);
215     }
216     if ((cas->type==ADJACENT) && (cas->degre==2))
217     {
218     cas->type=ADJACENT2;
219     double angle=4*M_PI;
220     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
221     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
222     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
223     if (angle<M_PI) liste_classe_cas[ADJACENT2].insert(liste_classe_cas[ADJACENT2].end(),cas);
224     }
225     if ((cas->type==ADJACENT) && (cas->degre==1))
226     {
227     cas->type=ADJACENT1;
228     double angle=4*M_PI;
229     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
230     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
231     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
232     if (angle<1.396263401) liste_classe_cas[ADJACENT1].insert(liste_classe_cas[ADJACENT1].end(),cas);
233     else liste_classe_cas[AUTRECAS].insert(liste_classe_cas[AUTRECAS].end(),cas);
234     }
235     if ((cas->type==LIE) && (cas->degre==3))
236     {
237     cas->type=LIE3;
238     double angle=4*M_PI;
239     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
240     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
241     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
242     if (angle<M_PI) liste_classe_cas[LIE3].insert(liste_classe_cas[LIE3].end(),cas);
243    
244     }
245     if ((cas->type==LIE) && (cas->degre==2))
246     {
247     cas->type=LIE2;
248     double angle=4*M_PI;
249     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
250     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
251     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
252     if (angle<1.396263401) liste_classe_cas[LIE2].insert(liste_classe_cas[LIE2].end(),cas);
253     else liste_classe_cas[AUTRECAS].insert(liste_classe_cas[AUTRECAS].end(),cas);
254     }
255     if ((cas->type==LIE) && (cas->degre==1))
256     {
257     cas->type=LIE1;
258     double angle=4*M_PI;
259     if (cas->liaison[0]==1) angle=std::min(angle,cas->angle[0]);
260     if (cas->liaison[1]==1) angle=std::min(angle,cas->angle[1]);
261     if (cas->liaison[2]==1) angle=std::min(angle,cas->angle[2]);
262     if (angle<1.396263401) liste_classe_cas[LIE1].insert(liste_classe_cas[LIE1].end(),cas);
263     else liste_classe_cas[AUTRECAS].insert(liste_classe_cas[AUTRECAS].end(),cas);
264     }
265    
266     }
267     //traitement des differemts cas de fronts
268     int solution=PASTROUVE;
269     CAS_FRONT *cas=NULL;
270     if ((liste_classe_cas[ADJACENT3].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,ADJACENT3,ft,liste_cas,liste_classe_cas[ADJACENT3],&cas);
271     if ((liste_classe_cas[ADJACENT2].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,ADJACENT2,ft,liste_cas,liste_classe_cas[ADJACENT2],&cas);
272     if ((liste_classe_cas[ADJACENT1].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,ADJACENT1,ft,liste_cas,liste_classe_cas[ADJACENT1],&cas);
273     if ((liste_classe_cas[LIE3].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,LIE3,ft,liste_cas,liste_classe_cas[LIE3],&cas);
274     if ((liste_classe_cas[LIE2].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,LIE2,ft,liste_cas,liste_classe_cas[LIE2],&cas);
275     if ((liste_classe_cas[LIE1].size()>0)&&(solution==PASTROUVE)) solution=traite_front(mgvol,LIE1,ft,liste_cas,liste_classe_cas[LIE1],&cas);
276     if ((liste_classe_cas[GENERAL].size()>0)&&(solution==PASTROUVE))
277     {
278     solution=traite_front(mgvol,GENERAL,ft,liste_cas,liste_classe_cas[GENERAL],&cas);
279     if (solution==AUTRECASATRAITER)
280     {
281     int type=cas->type;
282     std::vector<CAS_FRONT*> liste_classe_cas_temp;
283     liste_classe_cas_temp.insert(liste_classe_cas_temp.end(),cas);
284     solution=traite_front(mgvol,type,ft,liste_cas,liste_classe_cas_temp,&cas); // pb icitte a compte=531
285     }
286     if (solution==PASTROUVE)
287     {
288     ft->incremente_ifail();
289     echange_de_front(ft,ft->get_numero_front()+1);
290     }
291     if (solution==DESTRUCTION)
292     bouclebis=true;
293     }
294    
295     efface_cas_front(liste_cas,liste_classe_cas);
296     }
297     while (bouclebis==true);
298     refresh();
299     }
300 francois 61 if (activelog) fin_log();
301 francois 558 sprintf(mess," Maillage terminé en %d couches et %d iterations",couche+1,passe);
302     affiche(mess);
303 5
304     }
305    
306     int MAILLEUR3D::traite_front(MG_VOLUME* mgvol,int type,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
307     {
308     int num;
309     switch (type)
310     {
311     case ADJACENT3:num=traite_front_adjacent3(mgvol,ft,liste_cas,liste_classe_cas,cas);break;
312     case ADJACENT2:num=traite_front_adjacent2(mgvol,ft,liste_cas,liste_classe_cas,cas);break;
313     case ADJACENT1:num=traite_front_adjacent1(mgvol,ft,liste_cas,liste_classe_cas,cas);break;
314     case LIE3:
315     case LIE2:
316     case LIE1:num=traite_front_lie(mgvol,ft,liste_cas,liste_classe_cas,cas);break;
317     case GENERAL:num=traite_front_general(mgvol,ft,liste_cas,liste_classe_cas,cas);break;
318     }
319     return num;
320     }
321    
322    
323    
324     int MAILLEUR3D::traite_front_adjacent3(MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
325     {
326     TPL_MAP_ENTITE<class MG_TRIANGLE*> liste_intersection;
327     MG_NOEUD* noeud=liste_classe_cas[0]->mgnoeud;
328     MG_TETRA* tet=insere_tetra(mgvol,ft,noeud,NOEUD_EXISTANT,liste_intersection);
329     liste_classe_cas[0]->traite=TRAITE;
330     if (tet==NULL) return PASTROUVE;
331     MG_FRONT_3D* ft1=ft->get_front_voisin(0);
332     MG_FRONT_3D* ft2=ft->get_front_voisin(1);
333     MG_FRONT_3D* ft3=ft->get_front_voisin(2);
334     supprimer_front_en_avancant(ft1);
335     supprimer_front_en_avancant(ft2);
336     supprimer_front_en_avancant(ft3);
337     supprimer_front_en_avancant(ft);
338     return TROUVE;
339     }
340    
341     int MAILLEUR3D::traite_front_adjacent2(MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
342     {
343     TPL_MAP_ENTITE<class MG_TRIANGLE*> liste_intersection;
344     MG_NOEUD* noeud=liste_classe_cas[0]->mgnoeud;
345     MG_TETRA* tet=insere_tetra(mgvol,ft,noeud,NOEUD_EXISTANT,liste_intersection);
346     liste_classe_cas[0]->traite=TRAITE;
347     if (tet==NULL) return PASTROUVE;
348     MG_FRONT_3D* ft1;
349     MG_FRONT_3D* ft2;
350     MG_FRONT_3D* ft3;
351     MG_FRONT_3D* ftn1;
352     if (liste_classe_cas[0]->liaison[0]==0)
353     {
354     ft1=ft->get_front_voisin(1);
355     ft2=ft->get_front_voisin(2);
356     ft3=ft->get_front_voisin(0);
357     ftn1=mise_a_jour_front(tet,1);
358     }
359     if (liste_classe_cas[0]->liaison[1]==0)
360     {
361     ft1=ft->get_front_voisin(0);
362     ft2=ft->get_front_voisin(2);
363     ft3=ft->get_front_voisin(1);
364     ftn1=mise_a_jour_front(tet,3);
365     }
366     if (liste_classe_cas[0]->liaison[2]==0)
367     {
368     ft1=ft->get_front_voisin(0);
369     ft2=ft->get_front_voisin(1);
370     ft3=ft->get_front_voisin(2);
371     ftn1=mise_a_jour_front(tet,2);
372     }
373     supprimer_front_en_avancant(ft1);
374     supprimer_front_en_avancant(ft2);
375     supprimer_front_en_avancant(ft);
376     mise_a_jour_voisin_front(ft3);
377     mise_a_jour_voisin_front(ftn1);
378     mise_a_jour_voisin_front(ftn1->get_front_voisin(0));
379     mise_a_jour_voisin_front(ftn1->get_front_voisin(1));
380     mise_a_jour_voisin_front(ftn1->get_front_voisin(2));
381     return TROUVE;
382     }
383    
384     int MAILLEUR3D::traite_front_adjacent1(MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
385     {
386     TPL_MAP_ENTITE<class MG_TRIANGLE*> liste_intersection;
387     int nb_cas=liste_classe_cas.size();
388     double *qual;
389     liste_classe_cas[0]->traite=TRAITE;
390     qual=new double[nb_cas];
391     double xyz1[3]={ft->get_noeud1()->get_x(),ft->get_noeud1()->get_y(),ft->get_noeud1()->get_z()};
392     double xyz2[3]={ft->get_noeud2()->get_x(),ft->get_noeud2()->get_y(),ft->get_noeud2()->get_z()};
393     double xyz3[3]={ft->get_noeud3()->get_x(),ft->get_noeud3()->get_y(),ft->get_noeud3()->get_z()};
394     for (int i=0;i<nb_cas;i++)
395     {
396     MG_NOEUD* noeud=liste_classe_cas[i]->mgnoeud;
397     double xyz[3]={noeud->get_x(),noeud->get_y(),noeud->get_z()};
398     qual[i]=OPERATEUR::qualite_tetra(xyz1,xyz2,xyz3,xyz);
399     }
400     int fin=0;
401     MG_TETRA* tet;
402 francois 35 int num;
403 5 while (fin==0)
404     {
405 francois 35 double* pos_max=std::max_element(qual,qual+nb_cas);
406 5 if (*pos_max==0.0) {delete [] qual;return PASTROUVE;}
407 francois 35 num=pos_max-qual;
408 5 MG_NOEUD* noeud=liste_classe_cas[num]->mgnoeud;
409     tet=insere_tetra(mgvol,ft,noeud,NOEUD_EXISTANT,liste_intersection);
410     if (tet!=NULL) fin=1;
411     qual[num]=0.;
412     }
413     MG_FRONT_3D* ft1;
414     MG_FRONT_3D* ft2;
415     MG_FRONT_3D* ft3;
416     MG_FRONT_3D* ftn1;
417     MG_FRONT_3D* ftn2;
418 francois 35 if (liste_classe_cas[num]->liaison[0]==1)
419 5 {
420     ft1=ft->get_front_voisin(0);
421     ft2=ft->get_front_voisin(1);
422     ft3=ft->get_front_voisin(2);
423     ftn1=mise_a_jour_front(tet,2);
424     ftn2=mise_a_jour_front(tet,3);
425     }
426 francois 35 if (liste_classe_cas[num]->liaison[1]==1)
427 5 {
428     ft1=ft->get_front_voisin(1);
429     ft2=ft->get_front_voisin(0);
430     ft3=ft->get_front_voisin(2);
431     ftn1=mise_a_jour_front(tet,1);
432     ftn2=mise_a_jour_front(tet,2);
433     }
434 francois 35 if (liste_classe_cas[num]->liaison[2]==1)
435 5 {
436     ft1=ft->get_front_voisin(2);
437     ft2=ft->get_front_voisin(0);
438     ft3=ft->get_front_voisin(1);
439     ftn1=mise_a_jour_front(tet,1);
440     ftn2=mise_a_jour_front(tet,3);
441     }
442     supprimer_front_en_avancant(ft);
443     supprimer_front_en_avancant(ft1);
444     mise_a_jour_voisin_front(ft2);
445     mise_a_jour_voisin_front(ft3);
446     mise_a_jour_voisin_front(ftn1);
447     mise_a_jour_voisin_front(ftn2);
448     mise_a_jour_voisin_front(ftn1->get_front_voisin(0));
449     mise_a_jour_voisin_front(ftn1->get_front_voisin(1));
450     mise_a_jour_voisin_front(ftn1->get_front_voisin(2));
451     mise_a_jour_voisin_front(ftn2->get_front_voisin(0));
452     mise_a_jour_voisin_front(ftn2->get_front_voisin(1));
453     mise_a_jour_voisin_front(ftn2->get_front_voisin(2));
454     delete [] qual;
455     return TROUVE;
456     }
457    
458     int MAILLEUR3D::traite_front_lie(MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
459     {
460     TPL_MAP_ENTITE<class MG_TRIANGLE*> liste_intersection;
461     int nb_cas=liste_classe_cas.size();
462     double *qual;
463     liste_classe_cas[0]->traite=TRAITE;
464     qual=new double[nb_cas];
465     double xyz1[3]={ft->get_noeud1()->get_x(),ft->get_noeud1()->get_y(),ft->get_noeud1()->get_z()};
466     double xyz2[3]={ft->get_noeud2()->get_x(),ft->get_noeud2()->get_y(),ft->get_noeud2()->get_z()};
467     double xyz3[3]={ft->get_noeud3()->get_x(),ft->get_noeud3()->get_y(),ft->get_noeud3()->get_z()};
468     for (int i=0;i<nb_cas;i++)
469     {
470     MG_NOEUD* noeud=liste_classe_cas[i]->mgnoeud;
471     double xyz[3]={noeud->get_x(),noeud->get_y(),noeud->get_z()};
472     qual[i]=OPERATEUR::qualite_tetra(xyz1,xyz2,xyz3,xyz);
473     }
474     int fin=0;
475     MG_TETRA* tet;
476     while (fin==0)
477     {
478 francois 35 double* pos_max=std::max_element(qual,qual+nb_cas);
479 5 if (*pos_max==0.0) {delete [] qual;return PASTROUVE;}
480     int num=pos_max-qual;
481     MG_NOEUD* noeud=liste_classe_cas[num]->mgnoeud;
482     tet=insere_tetra(mgvol,ft,noeud,NOEUD_EXISTANT,liste_intersection);
483     if (tet!=NULL) fin=1;
484     qual[num]=0.;
485     }
486     MG_FRONT_3D* ft1=ft->get_front_voisin(0);
487     MG_FRONT_3D* ft2=ft->get_front_voisin(1);
488     MG_FRONT_3D* ft3=ft->get_front_voisin(2);
489     MG_FRONT_3D* ftn1=mise_a_jour_front(tet,1);
490     MG_FRONT_3D* ftn2=mise_a_jour_front(tet,2);
491     MG_FRONT_3D* ftn3=mise_a_jour_front(tet,3);
492     supprimer_front_en_avancant(ft);
493     mise_a_jour_voisin_front(ft1);
494     mise_a_jour_voisin_front(ft2);
495     mise_a_jour_voisin_front(ft3);
496     mise_a_jour_voisin_front(ftn1);
497     mise_a_jour_voisin_front(ftn2);
498     mise_a_jour_voisin_front(ftn3);
499     mise_a_jour_voisin_front(ftn1->get_front_voisin(0));
500     mise_a_jour_voisin_front(ftn1->get_front_voisin(1));
501     mise_a_jour_voisin_front(ftn1->get_front_voisin(2));
502     mise_a_jour_voisin_front(ftn2->get_front_voisin(0));
503     mise_a_jour_voisin_front(ftn2->get_front_voisin(1));
504     mise_a_jour_voisin_front(ftn2->get_front_voisin(2));
505     mise_a_jour_voisin_front(ftn3->get_front_voisin(0));
506     mise_a_jour_voisin_front(ftn3->get_front_voisin(1));
507     mise_a_jour_voisin_front(ftn3->get_front_voisin(2));
508     delete [] qual;
509     return TROUVE;
510     }
511    
512     int MAILLEUR3D::traite_front_general(MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas)
513     {
514     TPL_MAP_ENTITE<class MG_TRIANGLE*> liste_intersection;
515     TPL_MAP_ENTITE<class MG_NOEUD*> liste_noeud;
516    
517     MG_NOEUD* noeud_candidat;
518 francois 35 int mode=genere_noeud(mgvol,ft,liste_noeud,liste_cas);
519 5 if (mode==CREATION) noeud_candidat=liste_noeud.get(0);
520     if (mode==EXISTE)
521     {
522     noeud_candidat=liste_noeud.get(0);
523     int nb_cas=liste_cas.size();
524     for (int i=0;i<nb_cas;i++)
525     if (liste_cas[i]->mgnoeud==noeud_candidat)
526     if (liste_cas[i]->traite==PASTRAITE)
527     {
528     *cas=liste_cas[i];
529     return AUTRECASATRAITER;
530     }
531     else return PASTROUVE;
532     }
533     MG_TETRA* tet=NULL;
534     if (mode==MULTIEXISTE)
535     {
536     double *qual;
537     int nb_noeud_candidat=liste_noeud.get_nb();
538     qual=new double[nb_noeud_candidat];
539 francois 35 //int nb_cas=liste_cas.size();
540 5 for (int i=0;i<nb_noeud_candidat;i++)
541     {
542 francois 35 //qual[i]=-1.;
543     /*for (int j=0;j<nb_cas;j++)
544 5 {
545 francois 35 MG_NOEUD* casnoeud=liste_cas[j]->mgnoeud;
546     if (liste_noeud.get(i)==casnoeud) qual[i]=-100.;
547     }*/
548     //if (qual[i]!=-100.)
549     // {
550 5 double xyz1[3]={ft->get_noeud1()->get_x(),ft->get_noeud1()->get_y(),ft->get_noeud1()->get_z()};
551     double xyz2[3]={ft->get_noeud2()->get_x(),ft->get_noeud2()->get_y(),ft->get_noeud2()->get_z()};
552     double xyz3[3]={ft->get_noeud3()->get_x(),ft->get_noeud3()->get_y(),ft->get_noeud3()->get_z()};
553     MG_NOEUD* noeud=liste_noeud.get(i);
554     double xyz[3]={noeud->get_x(),noeud->get_y(),noeud->get_z()};
555     qual[i]=OPERATEUR::qualite_tetra(xyz1,xyz2,xyz3,xyz);
556 francois 35 // }
557 5 }
558     for (int i=0;i<nb_noeud_candidat;i++)
559     {
560     if (tet==NULL)
561     {
562 francois 35 double* max_i=std::max_element(qual,qual+nb_noeud_candidat);
563 5 if (*max_i>0.)
564     {
565 francois 35 int pos_max=max_i-qual;
566 5 qual[pos_max]=-100.;
567     MG_NOEUD* noeud=liste_noeud.get(pos_max);
568     liste_intersection.vide();
569     tet=insere_tetra(mgvol,ft,noeud,mode,liste_intersection);
570     if ((tet==NULL) && (liste_intersection.get_nb()>0))
571     {
572     int traite_reussi=traite_destruction(ft,liste_intersection);
573     if (noeud->get_type_entite()==IDM3D_NOEUD)
574     {
575     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud;
576     mnoeud->etat_actif();
577     }
578     if (traite_reussi==true)
579     {
580     delete [] qual;
581     return DESTRUCTION;
582     }
583     }
584     }
585     }
586     }
587     if (tet==NULL)
588     {
589     delete [] qual;
590     return PASTROUVE;
591     }
592     }
593     else tet=insere_tetra(mgvol,ft,noeud_candidat,mode,liste_intersection);
594     if ((tet==NULL) && (liste_intersection.get_nb()>0))
595     {
596     int traite_reussi=traite_destruction(ft,liste_intersection);
597     if (noeud_candidat->get_type_entite()==IDM3D_NOEUD)
598     {
599     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud_candidat;
600     mnoeud->etat_actif();
601     }
602     if (traite_reussi==true)
603     {
604     if (mode==CREATION)
605     tet=insere_tetra(mgvol,ft,noeud_candidat,mode,liste_intersection);
606     else
607     return DESTRUCTION;
608     }
609     }
610    
611     if (tet!=NULL)
612     {
613     MG_FRONT_3D* ft1=ft->get_front_voisin(0);
614     MG_FRONT_3D* ft2=ft->get_front_voisin(1);
615     MG_FRONT_3D* ft3=ft->get_front_voisin(2);
616     MG_FRONT_3D* ftn1=mise_a_jour_front(tet,1);
617     MG_FRONT_3D* ftn2=mise_a_jour_front(tet,2);
618     MG_FRONT_3D* ftn3=mise_a_jour_front(tet,3);
619     supprimer_front_en_avancant(ft);
620     mise_a_jour_voisin_front(ft1);
621     mise_a_jour_voisin_front(ft2);
622     mise_a_jour_voisin_front(ft3);
623     mise_a_jour_voisin_front(ftn1);
624     mise_a_jour_voisin_front(ftn2);
625     mise_a_jour_voisin_front(ftn3);
626     mise_a_jour_voisin_front(ftn1->get_front_voisin(0));
627     mise_a_jour_voisin_front(ftn1->get_front_voisin(1));
628     mise_a_jour_voisin_front(ftn1->get_front_voisin(2));
629     mise_a_jour_voisin_front(ftn2->get_front_voisin(0));
630     mise_a_jour_voisin_front(ftn2->get_front_voisin(1));
631     mise_a_jour_voisin_front(ftn2->get_front_voisin(2));
632     mise_a_jour_voisin_front(ftn3->get_front_voisin(0));
633     mise_a_jour_voisin_front(ftn3->get_front_voisin(1));
634     mise_a_jour_voisin_front(ftn3->get_front_voisin(2));
635     if (mode==CREATION) mg_maillage->ajouter_mg_noeud(noeud_candidat);
636     }
637     else
638     {
639 francois 35 if (mode==CREATION) mg_maillage->supprimer_mg_noeudid(noeud_candidat->get_id());
640 5 return PASTROUVE;
641     }
642    
643     return TROUVE;
644     }
645    
646    
647    
648    
649    
650    
651     void MAILLEUR3D::insere_cas_front(int type,MG_NOEUD* noeud,int numero_cote,double angle,std::vector<CAS_FRONT*>& liste_cas)
652     {
653    
654     std::vector<CAS_FRONT*>::iterator i;
655     std::vector<CAS_FRONT*>::iterator nouveau = liste_cas.end();
656    
657     for (i=liste_cas.begin();i!=liste_cas.end();i++)
658     {
659     if ((*i)->mgnoeud==noeud) nouveau=i;
660     }
661    
662     CAS_FRONT* cas;
663     if (nouveau==liste_cas.end()) // etait nouveau==NULL
664     {
665     cas=new CAS_FRONT(type,noeud,numero_cote);
666     liste_cas.insert(liste_cas.end(),cas);
667     }
668     else
669     {
670     cas=(*nouveau);
671     if ((cas->type==ADJACENT) && (type==LIE)) return;
672     }
673    
674     cas->liaison[numero_cote]=1;
675     cas->angle[numero_cote]=angle;
676     cas->degre=cas->liaison[0]+cas->liaison[1]+cas->liaison[2];
677     }
678    
679    
680    
681     void MAILLEUR3D::efface_cas_front(std::vector<CAS_FRONT*>& liste_cas,std::vector<CAS_FRONT*> liste_classe_cas[8])
682     {
683     for (std::vector<CAS_FRONT*>::iterator i=liste_cas.begin();i!=liste_cas.end();i++)
684     {
685     delete *i;
686     }
687     liste_cas.clear();
688    
689     }
690    
691    
692    
693 francois 54 MG_FRONT_3D* MAILLEUR3D::mise_a_jour_front(MG_TETRA* tet,int cote, int numfront)
694 5 {
695     MG_FRONT_3D* ft;
696    
697 francois 54 if (cote==0) ft=ajouter_front_courant(numfront,tet->get_noeud1(),tet->get_noeud3(),tet->get_noeud2(),tet->get_triangle1());
698     if (cote==1) ft=ajouter_front_courant(numfront,tet->get_noeud1(),tet->get_noeud2(),tet->get_noeud4(),tet->get_triangle2());
699     if (cote==2) ft=ajouter_front_courant(numfront,tet->get_noeud2(),tet->get_noeud3(),tet->get_noeud4(),tet->get_triangle3());
700     if (cote==3) ft=ajouter_front_courant(numfront,tet->get_noeud1(),tet->get_noeud4(),tet->get_noeud3(),tet->get_triangle4());
701 5
702     return ft;
703     }
704    
705    
706     void MAILLEUR3D::mise_a_jour_voisin_front(MG_FRONT_3D* ft)
707     {
708     MG_NOEUD* mgnoeud1=ft->get_noeud1();
709     MG_NOEUD* mgnoeud2=ft->get_noeud2();
710     MG_NOEUD* mgnoeud3=ft->get_noeud3();
711     static int nbpasse=0;
712     nbpasse++;
713     ft->changer_front_voisin(NULL,0);
714     ft->changer_front_voisin(NULL,1);
715     ft->changer_front_voisin(NULL,2);
716     for (int j=0;j<mgnoeud1->get_lien_triangle()->get_nb();j++)
717     for (int k=0;k<mgnoeud2->get_lien_triangle()->get_nb();k++)
718     {
719     M3D_TRIANGLE* tri1=(M3D_TRIANGLE*)mgnoeud1->get_lien_triangle()->get(j);
720     M3D_TRIANGLE* tri2=(M3D_TRIANGLE*)mgnoeud2->get_lien_triangle()->get(k);
721     if (tri1==tri2)
722     if (tri1->get_etat_front()==FRONT_ACTIF)
723     if (tri1->get_mgfront()!=ft)
724     {
725     MG_FRONT_3D* ft2=tri1->get_mgfront();
726     if (ft->get_front_voisin(0)==NULL)
727     {
728     ft->changer_front_voisin(ft2,0);
729     ft->changer_angle_voisin(angle_front(ft,ft2),0);
730     }
731     else
732     {
733     double angle=angle_front(ft,ft2);
734     if (angle<ft->get_angle_voisin(0))
735     {
736     ft->changer_front_voisin(ft2,0);
737     ft->changer_angle_voisin(angle,0);
738     }
739     }
740     }
741     }
742     for (int j=0;j<mgnoeud1->get_lien_triangle()->get_nb();j++)
743     for (int k=0;k<mgnoeud3->get_lien_triangle()->get_nb();k++)
744     {
745     M3D_TRIANGLE* tri1=(M3D_TRIANGLE*)mgnoeud1->get_lien_triangle()->get(j);
746     M3D_TRIANGLE* tri2=(M3D_TRIANGLE*)mgnoeud3->get_lien_triangle()->get(k);
747     if (tri1==tri2)
748     if (tri1->get_etat_front()==FRONT_ACTIF)
749     if (tri1->get_mgfront()!=ft)
750     {
751     MG_FRONT_3D* ft2=tri1->get_mgfront();
752     if (ft->get_front_voisin(1)==NULL)
753     {
754     ft->changer_front_voisin(ft2,1);
755     ft->changer_angle_voisin(angle_front(ft,ft2),1);
756     }
757     else
758     {
759     double angle=angle_front(ft,ft2);
760     if (angle<ft->get_angle_voisin(1))
761     {
762     ft->changer_front_voisin(ft2,1);
763     ft->changer_angle_voisin(angle,1);
764     }
765     }
766     }
767     }
768     for (int j=0;j<mgnoeud2->get_lien_triangle()->get_nb();j++)
769     for (int k=0;k<mgnoeud3->get_lien_triangle()->get_nb();k++)
770     {
771     M3D_TRIANGLE* tri1=(M3D_TRIANGLE*)mgnoeud2->get_lien_triangle()->get(j);
772     M3D_TRIANGLE* tri2=(M3D_TRIANGLE*)mgnoeud3->get_lien_triangle()->get(k);
773     if (tri1==tri2)
774     if (tri1->get_etat_front()==FRONT_ACTIF)
775     if (tri1->get_mgfront()!=ft)
776     {
777     MG_FRONT_3D* ft2=tri1->get_mgfront();
778     if (ft->get_front_voisin(2)==NULL)
779     {
780     ft->changer_front_voisin(ft2,2);
781     ft->changer_angle_voisin(angle_front(ft,ft2),2);
782     }
783     else
784     {
785     double angle=angle_front(ft,ft2);
786     if (angle<ft->get_angle_voisin(2))
787     {
788     ft->changer_front_voisin(ft2,2);
789     ft->changer_angle_voisin(angle,2);
790     }
791     }
792     }
793     }
794     if ( (ft->get_front_voisin(0)==NULL) || (ft->get_front_voisin(1)==NULL)|| (ft->get_front_voisin(2)==NULL))
795     refresh();
796     }
797    
798    
799    
800    
801     int MAILLEUR3D::traite_destruction(MG_FRONT_3D* ft,TPL_MAP_ENTITE<class MG_TRIANGLE*>& liste_intersection)
802     {
803 francois 552 TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it;
804     MG_TETRA* tetbase=((M3D_TRIANGLE*)(ft->get_triangle()))->get_voisin(0);
805     for (MG_TRIANGLE* mtri=liste_intersection.get_premier(it);mtri!=NULL;mtri=liste_intersection.get_suivant(it))
806     {
807     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)mtri;
808     if (tri->get_nb_voisin()>0)
809     if (tri->get_voisin(0)==tetbase)
810     return false;
811     if (tri->get_nb_voisin()>1)
812     if (tri->get_voisin(1)==tetbase)
813     return false;
814     }
815     for (MG_TRIANGLE* mtri=liste_intersection.get_premier(it);mtri!=NULL;mtri=liste_intersection.get_suivant(it))
816 5 {
817 francois 552 M3D_TRIANGLE* tri=(M3D_TRIANGLE*)mtri;
818 francois 420 if (tri->get_frontiere()==1) return false;
819     if (tri->get_lien_topologie()!=NULL)
820     if (tri->get_lien_topologie()->get_dimension()==2) return false;
821     if (typedestruction==LIMITEDETRUIRE)
822 francois 190 if (tri->get_origine()!=MAILLEUR_AUTO) return false;
823 5 }
824 francois 552 for (MG_TRIANGLE* mtri=liste_intersection.get_premier(it);mtri!=NULL;mtri=liste_intersection.get_suivant(it))
825 5 {
826 francois 552 M3D_TRIANGLE* tri=(M3D_TRIANGLE*)mtri;
827     if (tri->get_nb_voisin()==1)
828     detruit_tetra(tri);
829 5 }
830     return true;
831     }
832    
833 francois 61
834     void MAILLEUR3D::ini_log(void)
835 5 {
836 francois 61 char chaine[500];
837     sprintf(chaine,"%s.pfj",nomlog.c_str());
838     inlog=fopen(chaine,"wt");
839     fclose(inlog);
840     sprintf(chaine,"%s.frt2",nomlog.c_str());
841     inlog=fopen(chaine,"wb");
842     }
843    
844     void MAILLEUR3D::fin_log(void)
845     {
846     fclose(inlog);
847     char chaine[500];
848     sprintf(chaine,"%s.frt1",nomlog.c_str());
849     inlog=fopen(chaine,"wb");
850 5 int nbnoeud=mg_maillage->get_nb_mg_noeud();
851 francois 61 int nbseg=0;
852     int nbsegment=mg_maillage->get_nb_mg_segment();
853     for (int i=0;i<nbsegment;i++) if (mg_maillage->get_mg_segment(i)->get_lien_topologie()->get_dimension()==1) nbseg++;
854 5 int nbtriangle=mg_maillage->get_nb_mg_triangle();
855 francois 61 int nbtriangle2d=0;
856     for (int i=0;i<nbtriangle;i++) if (mg_maillage->get_mg_triangle(i)->get_lien_topologie()->get_dimension()==2) nbtriangle2d++;
857     fwrite(&nbnoeud,sizeof(int),1,inlog);
858     fwrite(&nbseg,sizeof(int),1,inlog);
859     fwrite(&nbtriangle2d,sizeof(int),1,inlog);
860     fwrite(&nbtriangle,sizeof(int),1,inlog);
861 5 for (int i=0;i<nbnoeud;i++)
862     {
863     MG_NOEUD* noeud=mg_maillage->get_mg_noeud(i);
864 francois 61 unsigned long num=noeud->get_id();
865     fwrite(&num,sizeof(unsigned long),1,inlog);
866     double *xyz=noeud->get_coord();
867     fwrite(xyz,sizeof(double),3,inlog);
868 5 }
869 francois 61 for (int i=0;i<nbsegment;i++)
870     {
871     MG_SEGMENT* seg=mg_maillage->get_mg_segment(i);
872     if (seg->get_lien_topologie()->get_dimension()!=1) continue;
873     unsigned long num[3];
874     num[0]=seg->get_id();
875     num[1]=seg->get_noeud1()->get_id();
876     num[2]=seg->get_noeud2()->get_id();
877     fwrite(num,sizeof(unsigned long),3,inlog);
878     }
879 5 for (int i=0;i<nbtriangle;i++)
880     {
881     MG_TRIANGLE* tri=mg_maillage->get_mg_triangle(i);
882 francois 61 unsigned long num[4];
883     num[0]=tri->get_id();
884     num[1]=tri->get_noeud1()->get_id();
885     num[2]=tri->get_noeud2()->get_id();
886     num[3]=tri->get_noeud3()->get_id();
887     fwrite(num,sizeof(unsigned long),4,inlog);
888 5 }
889 francois 61
890    
891     fclose(inlog);
892     }
893    
894    
895     void MAILLEUR3D::genere_log(int fincouche)
896     {
897 5 for (int i=0;i<12;i++)
898     {
899     int nb_front;
900     if (i!=11) nb_front=get_nb_front(front_courant[i]);
901     else nb_front=get_nb_front(front_attente);
902 francois 552 FRONT::iterator it;
903     FRONT& frontactif=front_courant[i];
904     if (i==11) frontactif=front_attente;
905     for (MG_FRONT_3D *ft=get_premier_front(frontactif,it);ft!=NULL;ft!=get_suivant_front(frontactif,it))
906     {
907 francois 61 unsigned long num=ft->get_triangle()->get_id();
908     fwrite(&num,sizeof(unsigned long),1,inlog);
909 5 }
910    
911     }
912 francois 61 unsigned long num=fincouche;
913     fwrite(&num,sizeof(unsigned long),1,inlog);
914 5 }
915    
916     int MAILLEUR3D::test_front(void)
917     {
918     int erreur=0;
919     int nbnoeud=mg_maillage->get_nb_mg_noeud();
920     //int nbfront=get_nb_front(front_attente)+get_nb_front_courant();
921     //int nbtriangle=mg_maillage->get_nb_mg_triangle();
922    
923    
924     /*ofstream o("c:\\home\\dessin\\step\\voidf_2D.mai",ios::out|ios::trunc);
925     o.precision(16);
926     o.setf(ios::showpoint);
927     o << nbnoeud << " " << nbfront << endl;*/
928 francois 552 /*for (int i=0;i<nbnoeud;i++)
929 5 {
930     MG_NOEUD* noeud=mg_maillage->get_mg_noeud(i);
931     // o << i+1 << " " << noeud->get_x() << " " << noeud->get_y() << " " << noeud->get_z() << endl;
932     noeud->change_nouveau_numero(i+1);
933 francois 552 }*/
934 5 for (int i=0;i<12;i++)
935     {
936 francois 552 FRONT::iterator it;
937     FRONT& frontactif=front_courant[i];
938     if (i==11) frontactif=front_attente;
939     for (MG_FRONT_3D *ft=get_premier_front(frontactif,it);ft!=NULL;ft=get_suivant_front(frontactif,it))
940     {
941     MG_NOEUD* noeud1=ft->get_noeud1();
942 5 MG_NOEUD* noeud2=ft->get_noeud2();
943     MG_NOEUD* noeud3=ft->get_noeud3();
944 francois 552 if (((M3D_TRIANGLE*)(ft->get_triangle()))->get_etat_front()!=FRONT_ACTIF)
945     erreur=-100;
946     if (((M3D_TRIANGLE*)(ft->get_triangle()))->get_nb_voisin()>1)
947     erreur=-101;
948    
949     if ((noeud1->get_type_entite()!=IDM3D_NOEUD) && (noeud1->get_type_entite()!=IDMG_NOEUD))
950     erreur=-10;
951     if ((noeud2->get_type_entite()!=IDM3D_NOEUD) && (noeud2->get_type_entite()!=IDMG_NOEUD))
952     erreur=-11;
953     if ((noeud3->get_type_entite()!=IDM3D_NOEUD) && (noeud3->get_type_entite()!=IDMG_NOEUD))
954     erreur=-12;
955 5 OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
956     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
957     OT_VECTEUR_3D n=n1n2&n1n3;
958     n.norme();
959     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)ft->get_triangle();
960     if (tri->get_nb_voisin()==1)
961     {
962     MG_TETRA* tet=tri->get_voisin(0);
963     MG_NOEUD* noeud4;
964     if (tet->get_noeud1()!=ft->get_noeud1())
965     if (tet->get_noeud1()!=ft->get_noeud2())
966     if (tet->get_noeud1()!=ft->get_noeud3())
967     noeud4=tet->get_noeud1();
968    
969     if (tet->get_noeud2()!=ft->get_noeud1())
970     if (tet->get_noeud2()!=ft->get_noeud2())
971     if (tet->get_noeud2()!=ft->get_noeud3())
972     noeud4=tet->get_noeud2();
973     if (tet->get_noeud3()!=ft->get_noeud1())
974     if (tet->get_noeud3()!=ft->get_noeud2())
975     if (tet->get_noeud3()!=ft->get_noeud3())
976     noeud4=tet->get_noeud3();
977    
978     if (tet->get_noeud4()!=ft->get_noeud1())
979     if (tet->get_noeud4()!=ft->get_noeud2())
980     if (tet->get_noeud4()!=ft->get_noeud3())
981     noeud4=tet->get_noeud4();
982     OT_VECTEUR_3D n1n4(noeud4->get_x()-noeud1->get_x(),noeud4->get_y()-noeud1->get_y(),noeud4->get_z()-noeud1->get_z());
983     n1n4.norme();
984     double ps=n1n4*n;
985     if (ps>0.0001)
986     erreur=tet->get_id();
987     }
988     MG_FRONT_3D* ft1=ft->get_front_voisin(0);
989     MG_FRONT_3D* ft2=ft->get_front_voisin(1);
990     MG_FRONT_3D* ft3=ft->get_front_voisin(2);
991     MG_FRONT_3D* ft11=ft1->get_front_voisin(0);
992     MG_FRONT_3D* ft12=ft1->get_front_voisin(1);
993     MG_FRONT_3D* ft13=ft1->get_front_voisin(2);
994     MG_FRONT_3D* ft21=ft2->get_front_voisin(0);
995     MG_FRONT_3D* ft22=ft2->get_front_voisin(1);
996     MG_FRONT_3D* ft23=ft2->get_front_voisin(2);
997     MG_FRONT_3D* ft31=ft3->get_front_voisin(0);
998     MG_FRONT_3D* ft32=ft3->get_front_voisin(1);
999     MG_FRONT_3D* ft33=ft3->get_front_voisin(2);
1000     if ((ft11!=ft) && (ft12!=ft) && (ft13!=ft) )
1001     erreur=-1;
1002     if ((ft21!=ft) && (ft22!=ft) && (ft23!=ft) )
1003     erreur=-2;
1004     if ((ft31!=ft) && (ft32!=ft) && (ft33!=ft) )
1005     erreur=-3;
1006     // o << "3 " << noeud1->get_nouveau_numero() << " " << noeud2->get_nouveau_numero() << " " << noeud3->get_nouveau_numero() << endl;
1007     }
1008     }
1009    
1010     return erreur;
1011     }