ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_outil.cpp
Revision: 632
Committed: Thu Jan 15 18:40:00 2015 UTC (10 years, 3 months ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_outil.cpp
File size: 49425 byte(s)
Log Message:
Changement de l'espace de voisinage dans le mailleur 2D et 3D. On utilise un ntree (octree "anisotrope" qui ne se divise pas necessairement en 8). En 2D l'espace de voisinage est maintenant sur l'espace reelle au lieu d'être sur l'espace parametrique.
+Mise sous forme de parametres de certains choix stratégiques du mailleur

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     if (triangle1==NULL) triangle1=insere_triangle(mgvol,noeud1,noeud3,noeud2,MAILLEUR_AUTO);
283     if (triangle2==NULL) triangle2=insere_triangle(mgvol,noeud1,noeud2,noeud4,MAILLEUR_AUTO);
284     if (triangle3==NULL) triangle3=insere_triangle(mgvol,noeud2,noeud3,noeud4,MAILLEUR_AUTO);
285     if (triangle4==NULL) triangle4=insere_triangle(mgvol,noeud1,noeud4,noeud3,MAILLEUR_AUTO);
286     MG_TETRA* tetra=cree_tetra(mgvol,noeud1,noeud2,noeud3,noeud4,triangle1,triangle2,triangle3,triangle4,MAILLEUR_AUTO);
287     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     M3D_NOEUD* nouveau_noeud=new M3D_NOEUD(mgvol,xyz4[0],xyz4[1],xyz4[2],MAILLEUR_AUTO);
545     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     map<long,long,less<long> > lstcorrespondancenoeud;
802     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     noeudref1=mg_maillage->ajouter_mg_noeud(mgvol,xyz1[0],xyz1[1],xyz1[2],IMPOSE);
914     if (tet->get_noeud1()->get_nouveau_numero()!=(-1))
915     {
916     noeudref1->change_nouveau_numero(tet->get_noeud1()->get_nouveau_numero());
917     pair<long,long> tmp(noeudref1->get_nouveau_numero(),noeudref1->get_id());
918     lstcorrespondancenoeud.insert(tmp);
919     }
920     }
921     if (noeudref2==NULL)
922     {
923     noeudref2=mg_maillage->ajouter_mg_noeud(mgvol,xyz2[0],xyz2[1],xyz2[2],IMPOSE);
924     if (tet->get_noeud2()->get_nouveau_numero()!=(-1))
925     {
926     noeudref2->change_nouveau_numero(tet->get_noeud2()->get_nouveau_numero());
927     pair<long,long> tmp(noeudref2->get_nouveau_numero(),noeudref2->get_id());
928     lstcorrespondancenoeud.insert(tmp);
929     }
930     }
931     if (noeudref3==NULL)
932     {
933     noeudref3=mg_maillage->ajouter_mg_noeud(mgvol,xyz3[0],xyz3[1],xyz3[2],IMPOSE);
934     if (tet->get_noeud3()->get_nouveau_numero()!=(-1))
935     {
936     noeudref3->change_nouveau_numero(tet->get_noeud3()->get_nouveau_numero());
937     pair<long,long> tmp(noeudref3->get_nouveau_numero(),noeudref3->get_id());
938     lstcorrespondancenoeud.insert(tmp);
939     }
940     }
941     if (noeudref4==NULL)
942     {
943     noeudref4=mg_maillage->ajouter_mg_noeud(mgvol,xyz4[0],xyz4[1],xyz4[2],IMPOSE);
944     if (tet->get_noeud4()->get_nouveau_numero()!=(-1))
945     {
946     noeudref4->change_nouveau_numero(tet->get_noeud4()->get_nouveau_numero());
947     pair<long,long> tmp(noeudref4->get_nouveau_numero(),noeudref4->get_id());
948     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     if (triangle1==NULL) triangle1=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref3,noeudref2,IMPOSE);
956     if (triangle2==NULL) triangle2=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref2,noeudref4,IMPOSE);
957     if (triangle3==NULL) triangle3=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref2,noeudref3,noeudref4,IMPOSE);
958     if (triangle4==NULL) triangle4=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref4,noeudref3,IMPOSE);
959     MG_TETRA* tetra=cree_tetra(mgvol,noeudref1,noeudref2,noeudref3,noeudref4,triangle1,triangle2,triangle3,triangle4,IMPOSE);
960     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     noeudref1=mg_maillage->ajouter_mg_noeud(mgvol,xyz1[0],xyz1[1],xyz1[2],IMPOSE);
1138     noeudref1->change_nouveau_numero(tri->get_noeud1()->get_nouveau_numero());
1139     }
1140     if (noeudref2==NULL)
1141     {
1142     noeudref2=mg_maillage->ajouter_mg_noeud(mgvol,xyz2[0],xyz2[1],xyz2[2],IMPOSE);
1143     noeudref2->change_nouveau_numero(tri->get_noeud2()->get_nouveau_numero());
1144     }
1145     if (noeudref3==NULL)
1146     {
1147     noeudref3=mg_maillage->ajouter_mg_noeud(mgvol,xyz3[0],xyz3[1],xyz3[2],IMPOSE);
1148     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     if (segment1==NULL) segment1=cree_segment(mgvol,noeudref1,noeudref2,IMPOSE);
1155     if (segment2==NULL) segment2=cree_segment(mgvol,noeudref1,noeudref3,IMPOSE);
1156     if (segment3==NULL) segment3=cree_segment(mgvol,noeudref2,noeudref3,IMPOSE);
1157     MG_TRIANGLE* nvtri=cree_triangle(mgvol,noeudref1,noeudref2,noeudref3,segment1,segment2,segment3,IMPOSE);
1158     MG_TRIANGLE* nvtri2=cree_triangle(mgvol,noeudref1,noeudref3,noeudref2,segment1,segment2,segment3,IMPOSE);
1159     //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