ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 791
Committed: Fri Mar 18 21:23:00 2016 UTC (9 years, 1 month ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_front.cpp
File size: 46325 byte(s)
Log Message:
Transferts de la definition des origines dans le namespace MAGiC

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