ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 552
Committed: Fri Sep 26 19:47:13 2014 UTC (10 years, 9 months ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_front.cpp
File size: 47006 byte(s)
Log Message:
1 oubli du precedent commit

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