ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_outil.cpp
Revision: 1150
Committed: Tue May 28 12:57:28 2024 UTC (11 months, 2 weeks ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_outil.cpp
File size: 50756 byte(s)
Log Message:
deplacement des contantes dans le namespace MAGIC

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