ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_front.cpp
Revision: 425
Committed: Tue Sep 24 22:01:46 2013 UTC (11 years, 11 months ago) by francois
File size: 46678 byte(s)
Log Message:
ajout d'une procedure d'analyse de qualité de maillage + amelioration de la sortie sur terminal des informations dans les mailleurs

File Contents

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