ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_outil.cpp
Revision: 951
Committed: Fri Aug 10 15:17:17 2018 UTC (6 years, 9 months ago) by couturad
Original Path: magic/lib/mailleur_auto/src/mailleur3d_outil.cpp
File size: 49823 byte(s)
Log Message:
-> Ajout de Project Chrono (voir CMakeLists.txt).
-> Ajout d'un générateur de microstructure basé sur la dynamique des corps rigides (MSTRUCT_GENERATEUR_DCR).
-> Ajout d'un opérateur de décallage de la topologie (MG_CG_OP_TRANSF_DECALLAGE).
-> Retrait de «using namespace std»  (conflit avec namespace chrono) et modification des fichiers affectés.
-> Modification de mailleur2d.cpp afin d'enregistrer un fichier MAGiC (void.magic) lorsque le nombre d'itération dépasse la valeur maximale.

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
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_outil.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 "mailleur3d.h"
32     #include "mailleur3d_front.h"
33     #include "ot_mathematique.h"
34 francois 481 #include "ot_boite_3d.h"
35 francois 283 #include "m3d_noeud.h"
36     #include "m3d_tetra.h"
37     #include "m3d_triangle.h"
38 francois 335 #include "mg_geometrie_outils.h"
39 francois 388 #include "tpl_fonctions_generiques.h"
40 francois 283 #include "const.h"
41    
42     //---------------------------------------------------------------------------
43    
44     //#pragma package(smart_init)
45    
46    
47    
48    
49    
50    
51    
52     double MAILLEUR3D::angle_front(MG_FRONT_3D* ft1,MG_FRONT_3D* ft2)
53     {
54 francois 388 MG_NOEUD* noeud1=ft1->get_noeud1();
55     MG_NOEUD* noeud2=ft1->get_noeud2();
56     MG_NOEUD* noeud3=ft1->get_noeud3();
57     MG_NOEUD* noeud4=ft2->get_noeud1();
58     MG_NOEUD* noeud5=ft2->get_noeud2();
59     MG_NOEUD* noeud6=ft2->get_noeud3();
60     return get_angle_par_noeud<MG_NOEUD*>(noeud1,noeud2,noeud3,noeud4,noeud5,noeud6);
61 francois 283 }
62    
63    
64    
65     double MAILLEUR3D::angle_front(MG_FRONT_3D* ft,MG_SEGMENT* seg)
66     {
67     MG_NOEUD* noeud1;
68     MG_NOEUD* noeud2;
69     MG_NOEUD* noeud3;
70     MG_NOEUD* noeud4;
71    
72    
73     if (seg->get_noeud1()==ft->get_noeud1())
74     {
75     noeud1=ft->get_noeud1();
76     noeud2=ft->get_noeud2();
77     noeud3=ft->get_noeud3();
78     noeud4=seg->get_noeud2();
79     }
80     if (seg->get_noeud1()==ft->get_noeud2())
81     {
82     noeud1=ft->get_noeud2();
83     noeud2=ft->get_noeud3();
84     noeud3=ft->get_noeud1();
85     noeud4=seg->get_noeud2();
86     }
87     if (seg->get_noeud1()==ft->get_noeud3())
88     {
89     noeud1=ft->get_noeud3();
90     noeud2=ft->get_noeud1();
91     noeud3=ft->get_noeud2();
92     noeud4=seg->get_noeud2();
93     }
94     if (seg->get_noeud2()==ft->get_noeud1())
95     {
96     noeud1=ft->get_noeud1();
97     noeud2=ft->get_noeud2();
98     noeud3=ft->get_noeud3();
99     noeud4=seg->get_noeud1();
100     }
101     if (seg->get_noeud2()==ft->get_noeud2())
102     {
103     noeud1=ft->get_noeud2();
104     noeud2=ft->get_noeud3();
105     noeud3=ft->get_noeud1();
106     noeud4=seg->get_noeud1();
107     }
108     if (seg->get_noeud2()==ft->get_noeud3())
109     {
110     noeud1=ft->get_noeud3();
111     noeud2=ft->get_noeud1();
112     noeud3=ft->get_noeud2();
113     noeud4=seg->get_noeud1();
114     }
115    
116     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
117     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
118     OT_VECTEUR_3D n1n4(noeud4->get_x()-noeud1->get_x(),noeud4->get_y()-noeud1->get_y(),noeud4->get_z()-noeud1->get_z());
119     OT_VECTEUR_3D n1n=n1n2&n1n3;
120     OT_MATRICE_3D mat(n1n2,n1n3,n1n);
121     OT_MATRICE_3D matx(n1n4,n1n3,n1n);
122     OT_MATRICE_3D maty(n1n2,n1n4,n1n);
123     OT_MATRICE_3D matz(n1n2,n1n3,n1n4);
124     double det=mat.get_determinant();
125     double xsi=matx.get_determinant()/det;
126     double eta=maty.get_determinant()/det;
127     double psi=matz.get_determinant()/det;
128    
129     double proj[3];
130     proj[0]=(1.-xsi-eta)*noeud1->get_x()+xsi*noeud2->get_x()+eta*noeud3->get_x();
131     proj[1]=(1.-xsi-eta)*noeud1->get_y()+xsi*noeud2->get_y()+eta*noeud3->get_y();
132     proj[2]=(1.-xsi-eta)*noeud1->get_z()+xsi*noeud2->get_z()+eta*noeud3->get_z();
133     OT_VECTEUR_3D n1nproj(noeud1->get_x()-proj[0],noeud1->get_y()-proj[1],noeud1->get_z()-proj[2]);
134 francois 419 //n1n4.norme();
135     //n1nproj.norme();
136 francois 283 double ps=n1n4*n1nproj;
137     if (!(OPERATEUR::egal(ps,0.0,0.0001))) ps=ps/n1n4.get_longueur()/n1nproj.get_longueur();
138     else ps=0.;
139     if (ps>1.) ps=1.;
140     if (ps<-1.) ps=-1.;
141     double angle=acos(ps);
142     if ((xsi<0.) || (eta<0.) ) angle=angle+M_PI/2.;
143     if (psi<0.) angle=2*M_PI-angle;
144     return angle;
145    
146     }
147    
148    
149    
150    
151    
152     class MG_TETRA* MAILLEUR3D::insere_tetra(class MG_VOLUME* mgvol,class MG_FRONT_3D* ft,MG_NOEUD* noeud4,int type,TPL_MAP_ENTITE<class MG_TRIANGLE*>& liste_intersection)
153     {
154     liste_intersection.vide();
155     MG_NOEUD* noeud1=ft->get_noeud1();
156     MG_NOEUD* noeud2=ft->get_noeud2();
157     MG_NOEUD* noeud3=ft->get_noeud3();
158    
159     // existence du tetra
160     MG_NOEUD* noeud;
161 francois 363 MG_TETRA* tet=mg_maillage->get_mg_tetra(noeud1,noeud2,noeud3,noeud4);
162 francois 283 if (tet!=NULL)
163     return NULL;
164     // validit� de la solution
165     TPL_MAP_ENTITE<MG_FRONT_3D*> liste;
166     double x=0.25*(noeud1->get_x()+noeud2->get_x()+noeud3->get_x()+noeud4->get_x());
167     double y=0.25*(noeud1->get_y()+noeud2->get_y()+noeud3->get_y()+noeud4->get_y());
168     double z=0.25*(noeud1->get_z()+noeud2->get_z()+noeud3->get_z()+noeud4->get_z());
169     double longueur=1.2*sqrt((x-noeud1->get_x())*(x-noeud1->get_x())+(y-noeud1->get_y())*(y-noeud1->get_y())+(z-noeud1->get_z())*(z-noeud1->get_z()));
170 francois 632 ntree_de_front->rechercher(x,y,z,longueur,liste);
171 francois 283 int nb_liste=liste.get_nb();
172     for (int i=0;i<nb_liste;i++)
173     {
174     MG_FRONT_3D* fttmp=liste.get(i);
175 francois 553 /*if (passetmp>=256957)
176     if (i==32)
177     {
178     double *xyz1=noeud1->get_coord();
179     double *xyz2=noeud2->get_coord();
180     double *xyz3=noeud3->get_coord();
181     double *xyz4=noeud4->get_coord();
182     double *xyz4bis=fttmp->get_noeud3()->get_coord();
183     double xx=fttmp->get_noeud3()->get_x();
184     double yy=fttmp->get_noeud3()->get_y();
185     double zz=fttmp->get_noeud3()->get_z();
186     double xx2=noeud4->get_x();
187     double yy2=noeud4->get_y();
188     double zz2=noeud4->get_z();
189     int res=OPERATEUR::estdansletetra(xyz1,xyz2,xyz3,xyz4,xx,yy,zz);
190     int res2=OPERATEUR::estdansletetra(xyz1,xyz2,xyz4bis,xyz3,xx2,yy2,zz2);
191     }*/
192 francois 283 int inter=inter_tetra_triangle(noeud1,noeud2,noeud3,noeud4,fttmp->get_noeud1(),fttmp->get_noeud2(),fttmp->get_noeud3());
193 francois 419
194 francois 283 if (inter==true)
195     liste_intersection.ajouter(fttmp->get_triangle());
196     }
197     int nb_inter=liste_intersection.get_nb();
198     if (nb_inter>0)
199     return NULL;
200     // evaluation de la situation locale on ne cree pas deux tetra voisin de volume presque nul
201     MG_TRIANGLE* triangle1=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud3->get_id(),noeud2->get_id());
202     MG_TRIANGLE* triangle2=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud2->get_id(),noeud4->get_id());
203     MG_TRIANGLE* triangle3=mg_maillage->get_mg_triangle(noeud2->get_id(),noeud3->get_id(),noeud4->get_id());
204     MG_TRIANGLE* triangle4=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud4->get_id(),noeud3->get_id());
205     double vol1=-1.;
206     double vol2=-1.;
207     double vol3=-1.;
208     double vol4=-1.;
209     if (type==GENERATION_NOEUD)
210     {
211     if (triangle1!=NULL)
212     if (triangle1->get_type_entite()==IDM3D_TRIANGLE)
213     {
214     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle1;
215     MG_TETRA* tet=tri->get_voisin(0);
216     if (tet->get_type_entite()==IDM3D_TETRA)
217     {
218     M3D_TETRA* mtet=(M3D_TETRA*)tet;
219     vol1=mtet->get_volume();
220     }
221     }
222     if (triangle2!=NULL)
223     if (triangle2->get_type_entite()==IDM3D_TRIANGLE)
224     {
225     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle2;
226     MG_TETRA* tet=tri->get_voisin(0);
227     if (tet->get_type_entite()==IDM3D_TETRA)
228     {
229     M3D_TETRA* mtet=(M3D_TETRA*)tet;
230     vol2=mtet->get_volume();
231     }
232     }
233     if (triangle3!=NULL)
234     if (triangle3->get_type_entite()==IDM3D_TRIANGLE)
235     {
236     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle3;
237     MG_TETRA* tet=tri->get_voisin(0);
238     if (tet->get_type_entite()==IDM3D_TETRA)
239     {
240     M3D_TETRA* mtet=(M3D_TETRA*)tet;
241     vol3=mtet->get_volume();
242     }
243     }
244     if (triangle4!=NULL)
245     if (triangle4->get_type_entite()==IDM3D_TRIANGLE)
246     {
247     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle4;
248     MG_TETRA* tet=tri->get_voisin(0);
249     if (tet->get_type_entite()==IDM3D_TETRA)
250     {
251     M3D_TETRA* mtet=(M3D_TETRA*)tet;
252     vol4=mtet->get_volume();
253     }
254     }
255     double vol=calcule_volume(noeud1,noeud2,noeud3,noeud4);
256     // calcul du vol du tetra ideal
257     OT_VECTEUR_3D ab(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
258     OT_VECTEUR_3D ac(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
259     OT_VECTEUR_3D da(noeud1->get_x()-noeud4->get_x(),noeud1->get_y()-noeud4->get_y(),noeud1->get_z()-noeud4->get_z());
260     OT_VECTEUR_3D vec=ab&ac;
261     vec.norme();
262     double lg_tet_ideal=fabs(vec*da*ft->get_ifail()*sqrt(3./2.));
263     double vol_ideal=sqrt(2.)/12.*lg_tet_ideal*lg_tet_ideal*lg_tet_ideal;
264     if (vol<0.1*vol_ideal)
265     {
266 francois 419 if ((vol1>0.) && (vol1<0.1*vol_ideal))
267 francois 283 return NULL;
268 francois 419 if ((vol2>0.) && (vol2<0.1*vol_ideal))
269     return NULL;
270     if ((vol3>0.) && (vol3<0.1*vol_ideal))
271 francois 283 return NULL;
272 francois 419 if ((vol4>0.) && (vol4<0.1*vol_ideal))
273 francois 283 return NULL;
274 francois 419
275 francois 283 }
276     }
277    
278    
279    
280    
281     // insertion du tetra
282 francois 791 if (triangle1==NULL) triangle1=insere_triangle(mgvol,noeud1,noeud3,noeud2,MAGIC::ORIGINE::MAILLEUR_AUTO);
283     if (triangle2==NULL) triangle2=insere_triangle(mgvol,noeud1,noeud2,noeud4,MAGIC::ORIGINE::MAILLEUR_AUTO);
284     if (triangle3==NULL) triangle3=insere_triangle(mgvol,noeud2,noeud3,noeud4,MAGIC::ORIGINE::MAILLEUR_AUTO);
285     if (triangle4==NULL) triangle4=insere_triangle(mgvol,noeud1,noeud4,noeud3,MAGIC::ORIGINE::MAILLEUR_AUTO);
286     MG_TETRA* tetra=cree_tetra(mgvol,noeud1,noeud2,noeud3,noeud4,triangle1,triangle2,triangle3,triangle4,MAGIC::ORIGINE::MAILLEUR_AUTO);
287 francois 283 mg_maillage->ajouter_mg_tetra(tetra);
288     if (triangle1->get_type_entite()==IDM3D_TRIANGLE)
289     {
290     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle1;
291     tri->ajouter_voisin(tetra);
292     }
293     if (triangle2->get_type_entite()==IDM3D_TRIANGLE)
294     {
295     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle2;
296     tri->ajouter_voisin(tetra);
297     }
298     if (triangle3->get_type_entite()==IDM3D_TRIANGLE)
299     {
300     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle3;
301     tri->ajouter_voisin(tetra);
302     }
303     if (triangle4->get_type_entite()==IDM3D_TRIANGLE)
304     {
305     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle4;
306     tri->ajouter_voisin(tetra);
307     }
308 francois 419
309 francois 283 return tetra;
310    
311     }
312    
313    
314    
315     class MG_TRIANGLE* MAILLEUR3D::insere_triangle(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,int origine)
316     {
317 francois 419 // existence du triangle
318 francois 283 MG_TRIANGLE* triangle=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud3->get_id(),noeud2->get_id());
319     if (triangle!=NULL) return NULL;
320     // insertion du triangle
321     MG_SEGMENT* segment1=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
322     MG_SEGMENT* segment2=mg_maillage->get_mg_segment(noeud1->get_id(),noeud3->get_id());
323     MG_SEGMENT* segment3=mg_maillage->get_mg_segment(noeud2->get_id(),noeud3->get_id());
324     if (segment1==NULL) segment1=cree_segment(mgvol,noeud1,noeud2,origine);
325     if (segment2==NULL) segment2=cree_segment(mgvol,noeud1,noeud3,origine);
326     if (segment3==NULL) segment3=cree_segment(mgvol,noeud2,noeud3,origine);
327     MG_TRIANGLE* tri=cree_triangle(mgvol,noeud1,noeud2,noeud3,segment1,segment2,segment3,origine);
328     return tri;
329     }
330    
331    
332    
333     class MG_SEGMENT* MAILLEUR3D::insere_segment(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,int origine)
334     {
335 francois 419
336 francois 283 //existence du segment
337     MG_SEGMENT* segment=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
338     if (segment!=NULL) return NULL;
339     // insertion du segment
340     MG_SEGMENT* seg=cree_segment(mgvol,noeud1,noeud2,origine);
341     return seg;
342     }
343    
344    
345    
346    
347     MG_TETRA* MAILLEUR3D::cree_tetra(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4,MG_TRIANGLE* triangle1,MG_TRIANGLE* triangle2,MG_TRIANGLE* triangle3,MG_TRIANGLE* triangle4,int origine)
348     {
349     M3D_TETRA* tetra=new M3D_TETRA(mgvol,noeud1,noeud2,noeud3,noeud4,triangle1,triangle2,triangle3,triangle4,origine);
350     mg_maillage->ajouter_mg_tetra(tetra);
351     return tetra;
352     }
353    
354    
355     MG_TRIANGLE* MAILLEUR3D::cree_triangle(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_SEGMENT* segment1,MG_SEGMENT* segment2,MG_SEGMENT* segment3,int origine)
356     {
357     M3D_TRIANGLE* tri=new M3D_TRIANGLE(mgvol,noeud1,noeud2,noeud3,segment1,segment2,segment3,origine);
358     mg_maillage->ajouter_mg_triangle(tri);
359     return tri;
360     }
361    
362    
363    
364     MG_SEGMENT* MAILLEUR3D::cree_segment(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,int origine)
365     {
366     MG_SEGMENT* seg=mg_maillage->ajouter_mg_segment(mgvol,noeud1,noeud2,origine);
367     return seg;
368     }
369    
370    
371    
372     double MAILLEUR3D::calcule_volume(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
373     {
374     OT_VECTEUR_3D ab(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
375     OT_VECTEUR_3D ac(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
376     OT_VECTEUR_3D da(noeud1->get_x()-noeud4->get_x(),noeud1->get_y()-noeud4->get_y(),noeud1->get_z()-noeud4->get_z());
377    
378     OT_VECTEUR_3D pvec=ab&ac;
379     double volume=pvec*da;
380     volume=fabs(volume)/3.;
381     return volume;
382     }
383    
384    
385    
386     double MAILLEUR3D::calcule_longueur_caracteristique(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
387     {
388    
389     OT_VECTEUR_3D ab(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
390     double lg=ab.get_longueur();
391     int nb=1;
392     if (noeud3!=NULL)
393     {
394     OT_VECTEUR_3D ac(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
395     OT_VECTEUR_3D bc(noeud3->get_x()-noeud2->get_x(),noeud3->get_y()-noeud2->get_y(),noeud3->get_z()-noeud2->get_z());
396     lg=lg+ac.get_longueur()+bc.get_longueur();
397     nb=3;
398     }
399     if (noeud4!=NULL)
400     {
401     OT_VECTEUR_3D da(noeud1->get_x()-noeud4->get_x(),noeud1->get_y()-noeud4->get_y(),noeud1->get_z()-noeud4->get_z());
402     OT_VECTEUR_3D bd(noeud4->get_x()-noeud2->get_x(),noeud4->get_y()-noeud2->get_y(),noeud4->get_z()-noeud2->get_z());
403     OT_VECTEUR_3D cd(noeud4->get_x()-noeud3->get_x(),noeud4->get_y()-noeud3->get_y(),noeud4->get_z()-noeud3->get_z());
404     lg=lg+da.get_longueur()+bd.get_longueur()+cd.get_longueur();
405     nb=6;
406     }
407     lg=lg*1./nb;
408     return lg;
409    
410     }
411    
412 francois 532 double MAILLEUR3D::calcul_distance_metrique_segment(MG_SEGMENT *seg,int pas)
413     {
414     double l;
415     bool res=seg->get_distance_metrique(&l);
416     if (res==false)
417     {
418     l=metrique->calcul_distance_metrique(seg,pas);
419     seg->change_distance_metrique(l);
420     }
421     return l;
422     }
423 francois 283
424    
425     int MAILLEUR3D::genere_noeud(MG_VOLUME* mgvol,MG_FRONT_3D* ft,TPL_MAP_ENTITE<MG_NOEUD*> &liste_noeud,std::vector<CAS_FRONT*> &liste_cas)
426     {
427     MG_NOEUD* noeud1=ft->get_noeud1();
428     MG_NOEUD* noeud2=ft->get_noeud2();
429     MG_NOEUD* noeud3=ft->get_noeud3();
430     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
431     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
432 francois 553 OT_VECTEUR_3D normalnonnorme=n1n2&n1n3;
433     OT_VECTEUR_3D normal=normalnonnorme;
434 francois 283 normal.norme();
435     double xyz1[3]={noeud1->get_x(),noeud1->get_y(),noeud1->get_z()};
436     double xyz2[3]={noeud2->get_x(),noeud2->get_y(),noeud2->get_z()};
437     double xyz3[3]={noeud3->get_x(),noeud3->get_y(),noeud3->get_z()};
438     double hauteur=0.81649658*ft->get_triangle()->get_longueur();
439     double xyzg[3]={0.333333333333*(xyz1[0]+xyz2[0]+xyz3[0]),0.333333333333*(xyz1[1]+xyz2[1]+xyz3[1]),0.333333333333*(xyz1[2]+xyz2[2]+xyz3[2])};
440     double xyz4[3];
441     do
442     {
443     xyz4[0]=xyzg[0]+hauteur*normal.get_x();
444     xyz4[1]=xyzg[1]+hauteur*normal.get_y();
445     xyz4[2]=xyzg[2]+hauteur*normal.get_z();
446     hauteur=hauteur*0.9;
447     }
448     while (metrique->valide_parametre(xyz4)==0);
449 francois 532 double l1=calcul_distance_metrique_segment(ft->get_triangle()->get_segment1(),pas);
450     double l2=calcul_distance_metrique_segment(ft->get_triangle()->get_segment2(),pas);
451     double l3=calcul_distance_metrique_segment(ft->get_triangle()->get_segment3(),pas);
452 francois 283 double l=0.333333333333333*(l1+l2+l3);
453     double longueur_desiree=0.81649658*(priorite_metrique+(1-priorite_metrique)*l);
454     longueur_desiree=longueur_desiree/ft->get_ifail();
455 francois 632 int res=metrique->ajuste_distance_metrique(xyzg,xyz4,longueur_desiree,pas);
456     if (res==0) return PASTROUVE;
457 francois 283 OT_VECTEUR_3D hauteurajustee(xyzg[0]-xyz4[0],xyzg[1]-xyz4[1],xyzg[2]-xyz4[2]);
458     hauteur=hauteurajustee.get_longueur();
459    
460     // recherche des voisins
461     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_front;
462     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_front_proche;
463 francois 632 ntree_de_front->rechercher(xyz4[0],xyz4[1],xyz4[2],hauteur*1.837117307,liste_front);
464 francois 283 int nb_liste=liste_front.get_nb();
465     double disref=(priorite_metrique+(1-priorite_metrique)*l)/ft->get_ifail();
466     MG_NOEUD* noeudref=NULL;
467     for (int i=0;i<nb_liste;i++)
468     {
469     MG_FRONT_3D* ft2=liste_front.get(i);
470     for (int j=0;j<3;j++)
471     {
472     MG_NOEUD* noeud_tmp;
473     if (j==0) noeud_tmp=ft2->get_noeud1();
474     if (j==1) noeud_tmp=ft2->get_noeud2();
475     if (j==2) noeud_tmp=ft2->get_noeud3();
476     double *xyz_tmp=noeud_tmp->get_coord();
477 francois 553 // ici il faut verifier que ;'on pogne un noeud du bon coté du front
478     OT_VECTEUR_3D vec(xyz_tmp[0]-xyzg[0],xyz_tmp[1]-xyzg[1],xyz_tmp[2]-xyzg[2]);
479     double eps=0.333333333333333*(vec.diff()+n1n2.diff()+n1n3.diff());
480     eps=6.*eps*EPS_BASE_RELATIVE;
481     if (vec*normalnonnorme<eps) continue;
482 francois 532 double dis=metrique->calcul_distance_metrique(xyz_tmp,xyz4,1);
483 francois 283 if (dis<disref)
484     {
485     disref=dis;
486     noeudref=noeud_tmp;
487     }
488     }
489     if (ft2!=ft)
490     {
491     double dismin=evaluer_distance_noeud_triangle(xyz4[0],xyz4[1],xyz4[2],ft2->get_triangle());
492     if (dismin<hauteur) liste_front_proche.ajouter(ft2);
493     }
494     }
495     // il y a un noeud proche
496     if (noeudref!=NULL)
497     {
498 francois 532 double dis2=metrique->calcul_distance_metrique(noeudref->get_coord(),xyzg,2);
499 francois 283 if (dis2<longueur_desiree*1.5)
500     if (noeudref!=noeud1)
501     if (noeudref!=noeud2)
502     if (noeudref!=noeud3)
503     {
504     liste_noeud.ajouter(noeudref);
505     return EXISTE;
506     }
507     }
508     // il n y a pas de noeud proche mais il y a une face proche
509     int nb_proche=liste_front_proche.get_nb();
510     int nb_cas=liste_cas.size();
511     if (nb_proche>0)
512     {
513     for (int i=0;i<nb_proche;i++)
514     {
515     MG_FRONT_3D* fttmp=liste_front_proche.get(i);
516     int ok=0;
517     for (int j=0;j<nb_cas;j++)
518     {
519     MG_NOEUD* casnoeud=liste_cas[j]->mgnoeud;
520     if ((fttmp->get_noeud1()==casnoeud) || (fttmp->get_noeud2()==casnoeud) || (fttmp->get_noeud3()==casnoeud) )
521     {
522     ok=1;
523     break;
524     }
525     }
526     if (ok==1) continue;
527     MG_NOEUD* noeudtmp=fttmp->get_noeud1();
528     if (noeudtmp!=noeud1)
529     if (noeudtmp!=noeud2)
530     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
531     noeudtmp=fttmp->get_noeud2();
532     if (noeudtmp!=noeud1)
533     if (noeudtmp!=noeud2)
534     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
535     noeudtmp=fttmp->get_noeud3();
536     if (noeudtmp!=noeud1)
537     if (noeudtmp!=noeud2)
538     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
539    
540     }
541     if (liste_noeud.get_nb()>0) return MULTIEXISTE;
542     }
543     // il faut creer un noeud c est parfait c est qu on veut.
544 francois 791 M3D_NOEUD* nouveau_noeud=new M3D_NOEUD(mgvol,xyz4[0],xyz4[1],xyz4[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
545 francois 283 mg_maillage->ajouter_mg_noeud(nouveau_noeud);
546     liste_noeud.ajouter(nouveau_noeud);
547     return CREATION;
548     }
549    
550    
551    
552     double MAILLEUR3D::evaluer_distance_noeud_triangle(double x,double y,double z,MG_TRIANGLE* tri)
553     {
554     double eps=0.0001;
555     MG_NOEUD* noeud1=tri->get_noeud1();
556     MG_NOEUD* noeud2=tri->get_noeud2();
557     MG_NOEUD* noeud3=tri->get_noeud3();
558     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
559     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
560     OT_VECTEUR_3D n1n4(x-noeud1->get_x(),y-noeud1->get_y(),z-noeud1->get_z());
561     OT_VECTEUR_3D n1n=n1n2&n1n3;
562     OT_MATRICE_3D matbase(n1n2,n1n3,n1n);
563     OT_MATRICE_3D matxsi(n1n4,n1n3,n1n);
564     OT_MATRICE_3D mateta(n1n2,n1n4,n1n);
565     double xsi=matxsi.get_determinant()/matbase.get_determinant();
566     double eta=mateta.get_determinant()/matbase.get_determinant();
567     double dis;
568     if ((eta>-eps) && (xsi>-eps) && (eta+xsi<1.0+eps))
569     {
570     double xproj=(1-xsi-eta)*noeud1->get_x()+xsi*noeud2->get_x()+eta*noeud3->get_x();
571     double yproj=(1-xsi-eta)*noeud1->get_y()+xsi*noeud2->get_y()+eta*noeud3->get_y();
572     double zproj=(1-xsi-eta)*noeud1->get_z()+xsi*noeud2->get_z()+eta*noeud3->get_z();
573     OT_VECTEUR_3D vec(x-xproj,y-yproj,z-zproj);
574     dis=vec.get_longueur();
575     }
576     else
577     {
578     OT_VECTEUR_3D nn1(x-noeud1->get_x(),y-noeud1->get_y(),z-noeud1->get_z());
579     OT_VECTEUR_3D nn2(x-noeud2->get_x(),y-noeud2->get_y(),z-noeud2->get_z());
580     OT_VECTEUR_3D nn3(x-noeud3->get_x(),y-noeud3->get_y(),z-noeud3->get_z());
581     dis=0.3333333333333*(nn1.get_longueur()+nn2.get_longueur()+nn3.get_longueur());
582     }
583     return dis;
584     }
585    
586    
587     void MAILLEUR3D::detruit_tetra(MG_TRIANGLE* tri)
588     {
589 francois 419
590 francois 283 M3D_TRIANGLE* mtri;
591     //if (tri->get_type_entite()==IDMG_TRIANGLE) return;
592     //else mtri=(M3D_TRIANGLE*)tri;
593     mtri=(M3D_TRIANGLE*)tri;
594    
595     M3D_TETRA* tet=(M3D_TETRA*)mtri->get_voisin(0);
596     M3D_TRIANGLE* mtriangle1=(M3D_TRIANGLE*)tet->get_triangle1();
597     M3D_TRIANGLE* mtriangle2=(M3D_TRIANGLE*)tet->get_triangle2();
598     M3D_TRIANGLE* mtriangle3=(M3D_TRIANGLE*)tet->get_triangle3();
599     M3D_TRIANGLE* mtriangle4=(M3D_TRIANGLE*)tet->get_triangle4();
600 francois 558 tet->etat_detruit();
601     lsttet_a_detruire.ajouter(tet);
602 francois 283 TPL_MAP_ENTITE<MG_FRONT_3D*> liste_de_front;
603     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_de_front2;
604     MG_FRONT_3D* fttet1=NULL;
605     MG_FRONT_3D* fttet2=NULL;
606     MG_FRONT_3D* fttet3=NULL;
607     MG_FRONT_3D* fttet4=NULL;
608    
609     if (mtriangle1->get_etat_front()==FRONT_ACTIF)
610     {
611     MG_FRONT_3D* fttmp=mtriangle1->get_mgfront();
612     fttet1=fttmp;
613     liste_de_front.ajouter(fttmp->get_front_voisin(0));
614     liste_de_front.ajouter(fttmp->get_front_voisin(1));
615     liste_de_front.ajouter(fttmp->get_front_voisin(2));
616     //supprimer_front_en_reculant(fttmp);
617     mtriangle1->supprimer_voisin(tet);
618     }
619     else
620     {
621     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud1(),tet->get_noeud2(),tet->get_noeud3(),mtriangle1);
622     ftn1->incremente_ifail();
623     mtriangle1->supprimer_voisin(tet);
624     liste_de_front2.ajouter(ftn1);
625     }
626     if (mtriangle2->get_etat_front()==FRONT_ACTIF)
627     {
628     MG_FRONT_3D* fttmp=mtriangle2->get_mgfront();
629     fttet2=fttmp;
630     liste_de_front.ajouter(fttmp->get_front_voisin(0));
631     liste_de_front.ajouter(fttmp->get_front_voisin(1));
632     liste_de_front.ajouter(fttmp->get_front_voisin(2));
633     //supprimer_front_en_reculant(fttmp);
634     mtriangle2->supprimer_voisin(tet);
635     }
636     else
637     {
638     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud1(),tet->get_noeud4(),tet->get_noeud2(),mtriangle2);
639     ftn1->incremente_ifail();
640     mtriangle2->supprimer_voisin(tet);
641     liste_de_front2.ajouter(ftn1);
642     }
643     if (mtriangle3->get_etat_front()==FRONT_ACTIF)
644     {
645     MG_FRONT_3D* fttmp=mtriangle3->get_mgfront();
646     fttet3=fttmp;
647     liste_de_front.ajouter(fttmp->get_front_voisin(0));
648     liste_de_front.ajouter(fttmp->get_front_voisin(1));
649     liste_de_front.ajouter(fttmp->get_front_voisin(2));
650     //supprimer_front_en_reculant(fttmp);
651     mtriangle3->supprimer_voisin(tet);
652     }
653     else
654     {
655     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud2(),tet->get_noeud4(),tet->get_noeud3(),mtriangle3);
656     ftn1->incremente_ifail();
657     mtriangle3->supprimer_voisin(tet);
658     liste_de_front2.ajouter(ftn1);
659     }
660     if (mtriangle4->get_etat_front()==FRONT_ACTIF)
661     {
662     MG_FRONT_3D* fttmp=mtriangle4->get_mgfront();
663     fttet4=fttmp;
664     liste_de_front.ajouter(fttmp->get_front_voisin(0));
665     liste_de_front.ajouter(fttmp->get_front_voisin(1));
666     liste_de_front.ajouter(fttmp->get_front_voisin(2));
667     //supprimer_front_en_reculant(fttmp);
668     mtriangle4->supprimer_voisin(tet);
669     }
670     else
671     {
672     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud1(),tet->get_noeud3(),tet->get_noeud4(),mtriangle4);
673     ftn1->incremente_ifail();
674     mtriangle4->supprimer_voisin(tet);
675     liste_de_front2.ajouter(ftn1);
676     }
677    
678     if (fttet1!=NULL)
679     {
680     liste_de_front.supprimer(fttet1);
681     supprimer_front_en_reculant(fttet1);
682     }
683     if (fttet2!=NULL)
684     {
685     liste_de_front.supprimer(fttet2);
686     supprimer_front_en_reculant(fttet2);
687     }
688     if (fttet3!=NULL)
689     {
690     liste_de_front.supprimer(fttet3);
691     supprimer_front_en_reculant(fttet3);
692     }
693     if (fttet4!=NULL)
694     {
695     liste_de_front.supprimer(fttet4);
696     supprimer_front_en_reculant(fttet4);
697     }
698     int nb_liste1=liste_de_front.get_nb();
699     for (int i=0;i<nb_liste1;i++)
700     if (liste_de_front.get(i)!=NULL)
701     mise_a_jour_voisin_front(liste_de_front.get(i));
702     int nb_liste2=liste_de_front2.get_nb();
703     for (int i=0;i<nb_liste2;i++)
704     {
705     mise_a_jour_voisin_front(liste_de_front2.get(i));
706     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(0));
707     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(1));
708     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(2));
709     }
710    
711     for (int k=0;k<4;k++)
712     {
713     MG_NOEUD* noeud;
714     if (k==0) noeud=tet->get_noeud1();
715     if (k==1) noeud=tet->get_noeud2();
716     if (k==2) noeud=tet->get_noeud3();
717     if (k==3) noeud=tet->get_noeud4();
718     int nb_tet=noeud->get_lien_tetra()->get_nb();
719    
720     if (noeud->get_type_entite()==IDM3D_NOEUD)
721     {
722     int test=false;
723     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud;
724     for (int i=0;i<nb_tet;i++)
725     {
726     MG_TETRA* tet=noeud->get_lien_tetra()->get(i);
727     if (tet->get_type_entite()==IDM3D_TETRA)
728     {
729     M3D_TETRA* mtet=(M3D_TETRA*)tet;
730     if (mtet->get_etat()==ACTIF) test=true;
731     }
732     else test=true;
733     }
734 francois 558 if (test==false)
735     {
736     mnoeud->etat_detruit();
737     lstnoeud_a_detruire.ajouter(mnoeud);
738     }
739 francois 283 }
740     }
741 francois 419
742 francois 283 }
743    
744    
745    
746    
747 francois 532
748 francois 283 void MAILLEUR3D::detruit_element_inactif(void)
749     {
750 francois 558 /* LISTE_MG_TETRA::iterator it;
751 francois 283
752     for (MG_TETRA* tet=mg_maillage->get_premier_tetra(it);tet!=NULL;tet=mg_maillage->get_suivant_tetra(it))
753     {
754     M3D_TETRA* mtet=(M3D_TETRA*)tet;
755     if (mtet->get_etat()==DETRUIT)
756     lsttet.ajouter(tet);
757     }
758     LISTE_MG_NOEUD::iterator it2;
759     for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(it2);noeud!=NULL;noeud=mg_maillage->get_suivant_noeud(it2))
760     {
761     if (noeud->get_type_entite()==IDM3D_NOEUD)
762     {
763     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud;
764     if (mnoeud->get_etat()==DETRUIT)
765     lstnoeud.ajouter(noeud);
766     }
767 francois 558 }*/
768 francois 283 TPL_MAP_ENTITE<MG_TETRA*>::ITERATEUR it3;
769 francois 558 for (MG_TETRA* tet=lsttet_a_detruire.get_premier(it3);tet!=NULL;tet=lsttet_a_detruire.get_suivant(it3))
770     supprimer_mg_tetra(tet);
771 francois 283 TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it4;
772 francois 558 for (MG_NOEUD* noeud=lstnoeud_a_detruire.get_premier(it4);noeud!=NULL;noeud=lstnoeud_a_detruire.get_suivant(it4))
773 francois 283 mg_maillage->supprimer_mg_noeudid(noeud->get_id());
774 francois 558 lstnoeud_a_detruire.vide();
775     lsttet_a_detruire.vide();
776 francois 419
777 francois 283 }
778    
779    
780    
781    
782    
783 francois 424 void MAILLEUR3D::analyse_maillage_obtenu(double &vol,int *tab,double borne1,double borne2,double borne3)
784 francois 283 {
785 francois 424 vol=0.;tab[0]=0;tab[1]=0;tab[2]=0;tab[3]=0;
786     LISTE_MG_TETRA::iterator it;
787     for (MG_TETRA* tet=mg_maillage->get_premier_tetra(it);tet!=NULL;tet=mg_maillage->get_suivant_tetra(it))
788 francois 283 {
789 francois 532 vol=vol+metrique->calcul_volume_tetra_metrique(tet);
790 francois 424 double qual=OPERATEUR::qualite_tetra(tet->get_noeud1()->get_coord(),tet->get_noeud2()->get_coord(),tet->get_noeud3()->get_coord(),tet->get_noeud4()->get_coord());
791     if (qual>=borne3) tab[3]++;
792     else if (qual>=borne2) tab[2]++;
793     else if (qual>=borne1) tab[1]++;
794     else tab[0]++;
795 francois 283 }
796     }
797    
798    
799     void MAILLEUR3D::insere_contrainte_tetra(MG_VOLUME* mgvol,TPL_LISTE_ENTITE<MG_TETRA*> *lsttet)
800     {
801 couturad 951 std::map<long,long,std::less<long> > lstcorrespondancenoeud;
802 francois 283 int nbtet=lsttet->get_nb();
803     for (int i=0;i<nbtet;i++)
804     {
805     M3D_TETRA* tet=(M3D_TETRA*)lsttet->get(i);
806     double *xyz1=tet->get_noeud1()->get_coord();
807     double *xyz2=tet->get_noeud2()->get_coord();
808     double *xyz3=tet->get_noeud3()->get_coord();
809     double *xyz4=tet->get_noeud4()->get_coord();
810     double xyz[3];
811     xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0]+xyz4[0])*0.25;
812     xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1]+xyz4[1])*0.25;
813     xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2]+xyz4[2])*0.25;
814     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_trouvee;
815     OT_VECTEUR_3D vec1(xyz,xyz1);
816     OT_VECTEUR_3D vec2(xyz,xyz2);
817     OT_VECTEUR_3D vec3(xyz,xyz3);
818     OT_VECTEUR_3D vec4(xyz,xyz4);
819     double rayonrecherche=vec1.get_longueur();
820     if (vec2.get_longueur()>rayonrecherche) rayonrecherche=vec2.get_longueur();
821     if (vec3.get_longueur()>rayonrecherche) rayonrecherche=vec3.get_longueur();
822     if (vec4.get_longueur()>rayonrecherche) rayonrecherche=vec4.get_longueur();
823     rayonrecherche=rayonrecherche*1.1;
824 francois 632 ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
825 francois 283 MG_NOEUD* noeudref1=NULL;
826     if (lstcorrespondancenoeud.find(tet->get_noeud1()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
827     noeudref1=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud1()->get_nouveau_numero()]);
828     MG_NOEUD* noeudref2=NULL;
829     if (lstcorrespondancenoeud.find(tet->get_noeud2()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
830     noeudref2=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud2()->get_nouveau_numero()]);
831     MG_NOEUD* noeudref3=NULL;
832     if (lstcorrespondancenoeud.find(tet->get_noeud3()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
833     noeudref3=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud3()->get_nouveau_numero()]);
834     MG_NOEUD* noeudref4=NULL;
835     if (lstcorrespondancenoeud.find(tet->get_noeud4()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
836     noeudref4=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud4()->get_nouveau_numero()]);
837     int nbtrouve=liste_trouvee.get_nb();
838     for (int j=0;j<nbtrouve;j++)
839     {
840     if ((noeudref1!=NULL) && (noeudref2!=NULL) && (noeudref3!=NULL) && (noeudref4!=NULL) ) break;
841     MG_FRONT_3D* ft=liste_trouvee.get(j);
842     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
843     lstnoeud.ajouter(ft->get_noeud1());
844     lstnoeud.ajouter(ft->get_noeud2());
845     lstnoeud.ajouter(ft->get_noeud3());
846     if (noeudref1==NULL)
847     {
848     int nb=lstnoeud.get_nb();
849     for (int k=0;k<nb;k++)
850     {
851     double *xyztmp=lstnoeud.get(k)->get_coord();
852     OT_VECTEUR_3D vec(xyztmp,xyz1);
853     double longueur=vec.get_longueur();
854     if (longueur<1e-6*rayonrecherche)
855     {
856     noeudref1=lstnoeud.get(k);
857     lstnoeud.supprimer(lstnoeud.get(k));
858     break;
859     }
860     }
861     }
862     if (noeudref2==NULL)
863     {
864     int nb=lstnoeud.get_nb();
865     for (int k=0;k<nb;k++)
866     {
867     double *xyztmp=lstnoeud.get(k)->get_coord();
868     OT_VECTEUR_3D vec(xyztmp,xyz2);
869     double longueur=vec.get_longueur();
870     if (longueur<1e-6*rayonrecherche)
871     {
872     noeudref2=lstnoeud.get(k);
873     lstnoeud.supprimer(lstnoeud.get(k));
874     break;
875     }
876     }
877     }
878     if (noeudref3==NULL)
879     {
880     int nb=lstnoeud.get_nb();
881     for (int k=0;k<nb;k++)
882     {
883     double *xyztmp=lstnoeud.get(k)->get_coord();
884     OT_VECTEUR_3D vec(xyztmp,xyz3);
885     double longueur=vec.get_longueur();
886     if (longueur<1e-6*rayonrecherche)
887     {
888     noeudref3=lstnoeud.get(k);
889     lstnoeud.supprimer(lstnoeud.get(k));
890     break;
891     }
892     }
893     }
894     if (noeudref4==NULL)
895     {
896     int nb=lstnoeud.get_nb();
897     for (int k=0;k<nb;k++)
898     {
899     double *xyztmp=lstnoeud.get(k)->get_coord();
900     OT_VECTEUR_3D vec(xyztmp,xyz4);
901     double longueur=vec.get_longueur();
902     if (longueur<1e-6*rayonrecherche)
903     {
904     noeudref4=lstnoeud.get(k);
905     lstnoeud.supprimer(lstnoeud.get(k));
906     break;
907     }
908     }
909     }
910     }
911     if (noeudref1==NULL)
912     {
913 francois 791 noeudref1=mg_maillage->ajouter_mg_noeud(mgvol,xyz1[0],xyz1[1],xyz1[2],MAGIC::ORIGINE::IMPOSE);
914 francois 283 if (tet->get_noeud1()->get_nouveau_numero()!=(-1))
915     {
916     noeudref1->change_nouveau_numero(tet->get_noeud1()->get_nouveau_numero());
917 couturad 951 std::pair<long,long> tmp(noeudref1->get_nouveau_numero(),noeudref1->get_id());
918 francois 283 lstcorrespondancenoeud.insert(tmp);
919     }
920     }
921     if (noeudref2==NULL)
922     {
923 francois 791 noeudref2=mg_maillage->ajouter_mg_noeud(mgvol,xyz2[0],xyz2[1],xyz2[2],MAGIC::ORIGINE::IMPOSE);
924 francois 283 if (tet->get_noeud2()->get_nouveau_numero()!=(-1))
925     {
926     noeudref2->change_nouveau_numero(tet->get_noeud2()->get_nouveau_numero());
927 couturad 951 std::pair<long,long> tmp(noeudref2->get_nouveau_numero(),noeudref2->get_id());
928 francois 283 lstcorrespondancenoeud.insert(tmp);
929     }
930     }
931     if (noeudref3==NULL)
932     {
933 francois 791 noeudref3=mg_maillage->ajouter_mg_noeud(mgvol,xyz3[0],xyz3[1],xyz3[2],MAGIC::ORIGINE::IMPOSE);
934 francois 283 if (tet->get_noeud3()->get_nouveau_numero()!=(-1))
935     {
936     noeudref3->change_nouveau_numero(tet->get_noeud3()->get_nouveau_numero());
937 couturad 951 std::pair<long,long> tmp(noeudref3->get_nouveau_numero(),noeudref3->get_id());
938 francois 283 lstcorrespondancenoeud.insert(tmp);
939     }
940     }
941     if (noeudref4==NULL)
942     {
943 francois 791 noeudref4=mg_maillage->ajouter_mg_noeud(mgvol,xyz4[0],xyz4[1],xyz4[2],MAGIC::ORIGINE::IMPOSE);
944 francois 283 if (tet->get_noeud4()->get_nouveau_numero()!=(-1))
945     {
946     noeudref4->change_nouveau_numero(tet->get_noeud4()->get_nouveau_numero());
947 couturad 951 std::pair<long,long> tmp(noeudref4->get_nouveau_numero(),noeudref4->get_id());
948 francois 283 lstcorrespondancenoeud.insert(tmp);
949     }
950     }
951     M3D_TRIANGLE* triangle1=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref3->get_id(),noeudref2->get_id());
952     M3D_TRIANGLE* triangle2=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref2->get_id(),noeudref4->get_id());
953     M3D_TRIANGLE* triangle3=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref2->get_id(),noeudref3->get_id(),noeudref4->get_id());
954     M3D_TRIANGLE* triangle4=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref4->get_id(),noeudref3->get_id());
955 francois 791 if (triangle1==NULL) triangle1=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref3,noeudref2,MAGIC::ORIGINE::IMPOSE);
956     if (triangle2==NULL) triangle2=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref2,noeudref4,MAGIC::ORIGINE::IMPOSE);
957     if (triangle3==NULL) triangle3=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref2,noeudref3,noeudref4,MAGIC::ORIGINE::IMPOSE);
958     if (triangle4==NULL) triangle4=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref4,noeudref3,MAGIC::ORIGINE::IMPOSE);
959     MG_TETRA* tetra=cree_tetra(mgvol,noeudref1,noeudref2,noeudref3,noeudref4,triangle1,triangle2,triangle3,triangle4,MAGIC::ORIGINE::IMPOSE);
960 francois 283 tetra->change_nouveau_numero(tet->get_nouveau_numero());
961     mg_maillage->ajouter_mg_tetra(tetra);
962     triangle1->ajouter_voisin(tetra);
963     triangle2->ajouter_voisin(tetra);
964     triangle3->ajouter_voisin(tetra);
965     triangle4->ajouter_voisin(tetra);
966     MG_FRONT_3D *ftref1=NULL;
967     MG_FRONT_3D *ftref2=NULL;
968     MG_FRONT_3D *ftref3=NULL;
969     MG_FRONT_3D *ftref4=NULL;
970     if (triangle1->get_etat_front()==FRONT_ACTIF) ftref1=triangle1->get_mgfront();
971     if (triangle2->get_etat_front()==FRONT_ACTIF) ftref2=triangle2->get_mgfront();
972     if (triangle3->get_etat_front()==FRONT_ACTIF) ftref3=triangle3->get_mgfront();
973     if (triangle4->get_etat_front()==FRONT_ACTIF) ftref4=triangle4->get_mgfront();
974     TPL_MAP_ENTITE<MG_FRONT_3D*> lstfront;
975     MG_FRONT_3D *ft1=NULL;
976     MG_FRONT_3D *ft2=NULL;
977     MG_FRONT_3D *ft3=NULL;
978     MG_FRONT_3D *ft4=NULL;
979     if (ftref1==NULL) ft1=mise_a_jour_front(tetra,0,NONFORCE);
980     else
981     {
982     lstfront.ajouter(ftref1->get_front_voisin(0));
983     lstfront.ajouter(ftref1->get_front_voisin(1));
984     lstfront.ajouter(ftref1->get_front_voisin(2));
985     supprimer_front_en_avancant_sans_delete(ftref1);
986     }
987     if (ftref2==NULL) ft2=mise_a_jour_front(tetra,1,NONFORCE);
988     else
989     {
990     lstfront.ajouter(ftref2->get_front_voisin(0));
991     lstfront.ajouter(ftref2->get_front_voisin(1));
992     lstfront.ajouter(ftref2->get_front_voisin(2));
993     supprimer_front_en_avancant_sans_delete(ftref2);
994     }
995     if (ftref3==NULL) ft3=mise_a_jour_front(tetra,2,NONFORCE);
996     else
997     {
998     lstfront.ajouter(ftref3->get_front_voisin(0));
999     lstfront.ajouter(ftref3->get_front_voisin(1));
1000     lstfront.ajouter(ftref3->get_front_voisin(2));
1001     supprimer_front_en_avancant_sans_delete(ftref3);
1002     }
1003     if (ftref4==NULL) ft4=mise_a_jour_front(tetra,3,NONFORCE);
1004     else
1005     {
1006     lstfront.ajouter(ftref4->get_front_voisin(0));
1007     lstfront.ajouter(ftref4->get_front_voisin(1));
1008     lstfront.ajouter(ftref4->get_front_voisin(2));
1009     supprimer_front_en_avancant_sans_delete(ftref4);
1010     }
1011     if (ftref1!=NULL) {
1012     lstfront.supprimer(ftref1);
1013     delete ftref1;
1014     }
1015     if (ftref2!=NULL) {
1016     lstfront.supprimer(ftref2);
1017     delete ftref2;
1018     }
1019     if (ftref3!=NULL) {
1020     lstfront.supprimer(ftref3);
1021     delete ftref3;
1022     }
1023     if (ftref4!=NULL) {
1024     lstfront.supprimer(ftref4);
1025     delete ftref4;
1026     }
1027     if (ft1!=NULL)
1028     {
1029     mise_a_jour_voisin_front(ft1);
1030     lstfront.ajouter(ft1->get_front_voisin(0));
1031     lstfront.ajouter(ft1->get_front_voisin(1));
1032     lstfront.ajouter(ft1->get_front_voisin(2));
1033     }
1034     if (ft2!=NULL)
1035     {
1036     mise_a_jour_voisin_front(ft2);
1037     lstfront.ajouter(ft2->get_front_voisin(0));
1038     lstfront.ajouter(ft2->get_front_voisin(1));
1039     lstfront.ajouter(ft2->get_front_voisin(2));
1040     }
1041     if (ft3!=NULL)
1042     {
1043     mise_a_jour_voisin_front(ft3);
1044     lstfront.ajouter(ft3->get_front_voisin(0));
1045     lstfront.ajouter(ft3->get_front_voisin(1));
1046     lstfront.ajouter(ft3->get_front_voisin(2));
1047     }
1048     if (ft4!=NULL)
1049     {
1050     mise_a_jour_voisin_front(ft4);
1051     lstfront.ajouter(ft4->get_front_voisin(0));
1052     lstfront.ajouter(ft4->get_front_voisin(1));
1053     lstfront.ajouter(ft4->get_front_voisin(2));
1054     }
1055    
1056     for (int l=0;l<lstfront.get_nb();l++) mise_a_jour_voisin_front(lstfront.get(l));
1057    
1058     }
1059     }
1060    
1061     void MAILLEUR3D::insere_contrainte_triangle(MG_VOLUME* mgvol,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
1062     {
1063     int nbtri=lsttri->get_nb();
1064     for (int i=0;i<nbtri;i++)
1065     {
1066     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)lsttri->get(i);
1067     double *xyz1=tri->get_noeud1()->get_coord();
1068     double *xyz2=tri->get_noeud2()->get_coord();
1069     double *xyz3=tri->get_noeud3()->get_coord();
1070     double xyz[3];
1071     xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0])/3.;
1072     xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1])/3.;
1073     xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2])/3.;
1074     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_trouvee;
1075     OT_VECTEUR_3D vec1(xyz,xyz1);
1076     OT_VECTEUR_3D vec2(xyz,xyz2);
1077     OT_VECTEUR_3D vec3(xyz,xyz3);
1078     double rayonrecherche=vec1.get_longueur();
1079     if (vec2.get_longueur()>rayonrecherche) rayonrecherche=vec2.get_longueur();
1080     if (vec3.get_longueur()>rayonrecherche) rayonrecherche=vec3.get_longueur();
1081     rayonrecherche=rayonrecherche*1.1;
1082 francois 632 ntree_de_front->rechercher(xyz[0],xyz[2],xyz[2],rayonrecherche,liste_trouvee);
1083 francois 283 MG_NOEUD* noeudref1=NULL;
1084     MG_NOEUD* noeudref2=NULL;
1085     MG_NOEUD* noeudref3=NULL;
1086     int nbtrouve=liste_trouvee.get_nb();
1087     for (int j=0;j<nbtrouve;j++)
1088     {
1089     MG_FRONT_3D* ft=liste_trouvee.get(j);
1090     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
1091     lstnoeud.ajouter(ft->get_noeud1());
1092     lstnoeud.ajouter(ft->get_noeud2());
1093     lstnoeud.ajouter(ft->get_noeud3());
1094     int nb=lstnoeud.get_nb();
1095     for (int k=0;k<nb;k++)
1096     {
1097     double *xyztmp=lstnoeud.get(k)->get_coord();
1098     OT_VECTEUR_3D vec(xyztmp,xyz1);
1099     double longueur=vec.get_longueur();
1100     if (longueur<1e-10*rayonrecherche)
1101     {
1102     noeudref1=lstnoeud.get(k);
1103     lstnoeud.supprimer(lstnoeud.get(k));
1104     break;
1105     }
1106     }
1107     nb=lstnoeud.get_nb();
1108     for (int k=0;k<nb;k++)
1109     {
1110     double *xyztmp=lstnoeud.get(k)->get_coord();
1111     OT_VECTEUR_3D vec(xyztmp,xyz2);
1112     double longueur=vec.get_longueur();
1113     if (longueur<1e-10*rayonrecherche)
1114     {
1115     noeudref2=lstnoeud.get(k);
1116     lstnoeud.supprimer(lstnoeud.get(k));
1117     break;
1118     }
1119     }
1120     nb=lstnoeud.get_nb();
1121     for (int k=0;k<nb;k++)
1122     {
1123     double *xyztmp=lstnoeud.get(k)->get_coord();
1124     OT_VECTEUR_3D vec(xyztmp,xyz3);
1125     double longueur=vec.get_longueur();
1126     if (longueur<1e-10*rayonrecherche)
1127     {
1128     noeudref3=lstnoeud.get(k);
1129     lstnoeud.supprimer(lstnoeud.get(k));
1130     break;
1131     }
1132     }
1133    
1134     }
1135     if (noeudref1==NULL)
1136     {
1137 francois 791 noeudref1=mg_maillage->ajouter_mg_noeud(mgvol,xyz1[0],xyz1[1],xyz1[2],MAGIC::ORIGINE::IMPOSE);
1138 francois 283 noeudref1->change_nouveau_numero(tri->get_noeud1()->get_nouveau_numero());
1139     }
1140     if (noeudref2==NULL)
1141     {
1142 francois 791 noeudref2=mg_maillage->ajouter_mg_noeud(mgvol,xyz2[0],xyz2[1],xyz2[2],MAGIC::ORIGINE::IMPOSE);
1143 francois 283 noeudref2->change_nouveau_numero(tri->get_noeud2()->get_nouveau_numero());
1144     }
1145     if (noeudref3==NULL)
1146     {
1147 francois 791 noeudref3=mg_maillage->ajouter_mg_noeud(mgvol,xyz3[0],xyz3[1],xyz3[2],MAGIC::ORIGINE::IMPOSE);
1148 francois 283 noeudref3->change_nouveau_numero(tri->get_noeud3()->get_nouveau_numero());
1149     }
1150    
1151     MG_SEGMENT* segment1=mg_maillage->get_mg_segment(noeudref1->get_id(),noeudref2->get_id());
1152     MG_SEGMENT* segment2=mg_maillage->get_mg_segment(noeudref1->get_id(),noeudref3->get_id());
1153     MG_SEGMENT* segment3=mg_maillage->get_mg_segment(noeudref2->get_id(),noeudref3->get_id());
1154 francois 791 if (segment1==NULL) segment1=cree_segment(mgvol,noeudref1,noeudref2,MAGIC::ORIGINE::IMPOSE);
1155     if (segment2==NULL) segment2=cree_segment(mgvol,noeudref1,noeudref3,MAGIC::ORIGINE::IMPOSE);
1156     if (segment3==NULL) segment3=cree_segment(mgvol,noeudref2,noeudref3,MAGIC::ORIGINE::IMPOSE);
1157     MG_TRIANGLE* nvtri=cree_triangle(mgvol,noeudref1,noeudref2,noeudref3,segment1,segment2,segment3,MAGIC::ORIGINE::IMPOSE);
1158     MG_TRIANGLE* nvtri2=cree_triangle(mgvol,noeudref1,noeudref3,noeudref2,segment1,segment2,segment3,MAGIC::ORIGINE::IMPOSE);
1159 francois 283 //MG_TRIANGLE* nvtri=insere_triangle(mgvol,noeudref1,noeudref2,noeudref3,IMPOSE);
1160     //MG_TRIANGLE* nvtri2=insere_triangle(mgvol,noeudref1,noeudref3,noeudref2,IMPOSE);
1161     MG_FRONT_3D *ft=ajouter_front_courant(NONFORCE,noeudref1,noeudref2,noeudref3,nvtri);
1162     MG_FRONT_3D *ft2=ajouter_front_courant(NONFORCE,noeudref1,noeudref3,noeudref2,nvtri2);
1163     mise_a_jour_voisin_front(ft);
1164     mise_a_jour_voisin_front(ft2);
1165     mise_a_jour_voisin_front(ft->get_front_voisin(0));
1166     mise_a_jour_voisin_front(ft->get_front_voisin(1));
1167     mise_a_jour_voisin_front(ft->get_front_voisin(2));
1168     mise_a_jour_voisin_front(ft2->get_front_voisin(0));
1169     mise_a_jour_voisin_front(ft2->get_front_voisin(1));
1170     mise_a_jour_voisin_front(ft2->get_front_voisin(2));
1171    
1172     }
1173 francois 558 }
1174    
1175     int MAILLEUR3D::supprimer_mg_tetra(MG_TETRA* mgtetra)
1176     {
1177     //MG_TETRA* mgtetra=mg_maillage->get_mg_tetra(num);
1178     if (mgtetra==NULL)
1179     {
1180     // afficheur << INEXISTE2 << enderr;
1181     return FAIL;
1182     }
1183     MG_IDENTIFICATEUR* id=mgtetra;
1184     LISTE_ENTITE::iterator i=mg_maillage->lst_entite.find(id);
1185     mg_maillage->lst_entite.erase(i);
1186     LISTE_MG_TETRA::iterator j=mg_maillage->lst_mg_tetra.find(id->get_id());
1187     mg_maillage->lst_mg_tetra.erase(j);
1188     M3D_TRIANGLE* triangle1=(M3D_TRIANGLE*)mgtetra->get_triangle1();
1189     M3D_TRIANGLE* triangle2=(M3D_TRIANGLE*)mgtetra->get_triangle2();
1190     M3D_TRIANGLE* triangle3=(M3D_TRIANGLE*)mgtetra->get_triangle3();
1191     M3D_TRIANGLE* triangle4=(M3D_TRIANGLE*)mgtetra->get_triangle4();
1192     delete mgtetra;
1193     if (triangle1->get_nb_reference()==0)
1194     if (triangle1->get_lien_topologie()!=NULL)
1195     {
1196     if (triangle1->get_lien_topologie()->get_dimension()>2) mg_maillage->supprimer_mg_triangleid(triangle1->get_id());
1197     }
1198     else if (triangle1->get_frontiere()==0) mg_maillage->supprimer_mg_triangleid(triangle1->get_id());
1199     if (triangle2->get_nb_reference()==0)
1200     if (triangle2->get_lien_topologie()!=NULL)
1201     {
1202     if (triangle2->get_lien_topologie()->get_dimension()>2) mg_maillage->supprimer_mg_triangleid(triangle2->get_id());
1203     }
1204     else if (triangle2->get_frontiere()==0) mg_maillage->supprimer_mg_triangleid(triangle2->get_id());
1205     if (triangle3->get_nb_reference()==0)
1206     if (triangle3->get_lien_topologie()!=NULL)
1207     {
1208     if (triangle3->get_lien_topologie()->get_dimension()>2) mg_maillage->supprimer_mg_triangleid(triangle3->get_id());
1209     }
1210     else if (triangle3->get_frontiere()==0) mg_maillage->supprimer_mg_triangleid(triangle3->get_id());
1211     if (triangle4->get_nb_reference()==0)
1212     if (triangle4->get_lien_topologie()!=NULL)
1213     {
1214     if (triangle4->get_lien_topologie()->get_dimension()>2) mg_maillage->supprimer_mg_triangleid(triangle4->get_id());
1215     }
1216     else if (triangle4->get_frontiere()==0) mg_maillage->supprimer_mg_triangleid(triangle4->get_id());
1217     return OK;
1218     }
1219 francois 283
1220    
1221    
1222