ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 5
Committed: Tue Jun 12 20:26:34 2007 UTC (17 years, 11 months ago)
Original Path: magic/lib/mailleur/mailleur/src/mailleur3d_front.cpp
File size: 44854 byte(s)
Log Message:

File Contents

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