ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_outil.cpp
Revision: 1162
Committed: Wed Jul 10 20:31:22 2024 UTC (10 months ago) by ghazal
Original Path: magic/lib/mailleur_auto/src/mailleur3d_outil.cpp
File size: 50574 byte(s)
Log Message:
utilisation des M3D dans le mailleur particule

File Contents

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