ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 1189
Committed: Tue Feb 4 17:26:49 2025 UTC (3 months ago) by francois
File size: 50079 byte(s)
Log Message:
Version 5.0 de MAGIC. Integration de ALGLIB pour faire de l'optimisation. ALGLIB se download automatiquement en executant un script dans le repertoire config update_magic.bash


File Contents

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