ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_outil.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (10 months, 4 weeks ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_outil.cpp
File size: 50153 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

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     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)
148     {
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    
270    
271    
272    
273 francois 791 if (triangle1==NULL) triangle1=insere_triangle(mgvol,noeud1,noeud3,noeud2,MAGIC::ORIGINE::MAILLEUR_AUTO);
274     if (triangle2==NULL) triangle2=insere_triangle(mgvol,noeud1,noeud2,noeud4,MAGIC::ORIGINE::MAILLEUR_AUTO);
275     if (triangle3==NULL) triangle3=insere_triangle(mgvol,noeud2,noeud3,noeud4,MAGIC::ORIGINE::MAILLEUR_AUTO);
276     if (triangle4==NULL) triangle4=insere_triangle(mgvol,noeud1,noeud4,noeud3,MAGIC::ORIGINE::MAILLEUR_AUTO);
277     MG_TETRA* tetra=cree_tetra(mgvol,noeud1,noeud2,noeud3,noeud4,triangle1,triangle2,triangle3,triangle4,MAGIC::ORIGINE::MAILLEUR_AUTO);
278 francois 283 mg_maillage->ajouter_mg_tetra(tetra);
279 francois 1150 if (triangle1->get_type_entite()==MAGIC::TYPE_ENTITE::IDM3D_TRIANGLE)
280 francois 283 {
281     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle1;
282     tri->ajouter_voisin(tetra);
283     }
284 francois 1150 if (triangle2->get_type_entite()==MAGIC::TYPE_ENTITE::IDM3D_TRIANGLE)
285 francois 283 {
286     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle2;
287     tri->ajouter_voisin(tetra);
288     }
289 francois 1150 if (triangle3->get_type_entite()==MAGIC::TYPE_ENTITE::IDM3D_TRIANGLE)
290 francois 283 {
291     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle3;
292     tri->ajouter_voisin(tetra);
293     }
294 francois 1150 if (triangle4->get_type_entite()==MAGIC::TYPE_ENTITE::IDM3D_TRIANGLE)
295 francois 283 {
296     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle4;
297     tri->ajouter_voisin(tetra);
298     }
299 francois 419
300 francois 283 return tetra;
301    
302     }
303    
304    
305    
306     class MG_TRIANGLE* MAILLEUR3D::insere_triangle(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,int origine)
307     {
308 francois 419 // existence du triangle
309 francois 283 MG_TRIANGLE* triangle=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud3->get_id(),noeud2->get_id());
310     if (triangle!=NULL) return NULL;
311     MG_SEGMENT* segment1=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
312     MG_SEGMENT* segment2=mg_maillage->get_mg_segment(noeud1->get_id(),noeud3->get_id());
313     MG_SEGMENT* segment3=mg_maillage->get_mg_segment(noeud2->get_id(),noeud3->get_id());
314     if (segment1==NULL) segment1=cree_segment(mgvol,noeud1,noeud2,origine);
315     if (segment2==NULL) segment2=cree_segment(mgvol,noeud1,noeud3,origine);
316     if (segment3==NULL) segment3=cree_segment(mgvol,noeud2,noeud3,origine);
317     MG_TRIANGLE* tri=cree_triangle(mgvol,noeud1,noeud2,noeud3,segment1,segment2,segment3,origine);
318     return tri;
319     }
320    
321    
322    
323     class MG_SEGMENT* MAILLEUR3D::insere_segment(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,int origine)
324     {
325 francois 419
326 francois 283 MG_SEGMENT* segment=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
327     if (segment!=NULL) return NULL;
328     MG_SEGMENT* seg=cree_segment(mgvol,noeud1,noeud2,origine);
329     return seg;
330     }
331    
332    
333    
334    
335     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)
336     {
337     M3D_TETRA* tetra=new M3D_TETRA(mgvol,noeud1,noeud2,noeud3,noeud4,triangle1,triangle2,triangle3,triangle4,origine);
338     mg_maillage->ajouter_mg_tetra(tetra);
339     return tetra;
340     }
341    
342    
343     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)
344     {
345     M3D_TRIANGLE* tri=new M3D_TRIANGLE(mgvol,noeud1,noeud2,noeud3,segment1,segment2,segment3,origine);
346     mg_maillage->ajouter_mg_triangle(tri);
347     return tri;
348     }
349    
350    
351    
352     MG_SEGMENT* MAILLEUR3D::cree_segment(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,int origine)
353     {
354     MG_SEGMENT* seg=mg_maillage->ajouter_mg_segment(mgvol,noeud1,noeud2,origine);
355     return seg;
356     }
357    
358    
359    
360     double MAILLEUR3D::calcule_volume(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
361     {
362     OT_VECTEUR_3D ab(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
363     OT_VECTEUR_3D ac(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
364     OT_VECTEUR_3D da(noeud1->get_x()-noeud4->get_x(),noeud1->get_y()-noeud4->get_y(),noeud1->get_z()-noeud4->get_z());
365    
366     OT_VECTEUR_3D pvec=ab&ac;
367     double volume=pvec*da;
368     volume=fabs(volume)/3.;
369     return volume;
370     }
371    
372    
373    
374     double MAILLEUR3D::calcule_longueur_caracteristique(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
375     {
376    
377     OT_VECTEUR_3D ab(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
378     double lg=ab.get_longueur();
379     int nb=1;
380     if (noeud3!=NULL)
381     {
382     OT_VECTEUR_3D ac(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
383     OT_VECTEUR_3D bc(noeud3->get_x()-noeud2->get_x(),noeud3->get_y()-noeud2->get_y(),noeud3->get_z()-noeud2->get_z());
384     lg=lg+ac.get_longueur()+bc.get_longueur();
385     nb=3;
386     }
387     if (noeud4!=NULL)
388     {
389     OT_VECTEUR_3D da(noeud1->get_x()-noeud4->get_x(),noeud1->get_y()-noeud4->get_y(),noeud1->get_z()-noeud4->get_z());
390     OT_VECTEUR_3D bd(noeud4->get_x()-noeud2->get_x(),noeud4->get_y()-noeud2->get_y(),noeud4->get_z()-noeud2->get_z());
391     OT_VECTEUR_3D cd(noeud4->get_x()-noeud3->get_x(),noeud4->get_y()-noeud3->get_y(),noeud4->get_z()-noeud3->get_z());
392     lg=lg+da.get_longueur()+bd.get_longueur()+cd.get_longueur();
393     nb=6;
394     }
395     lg=lg*1./nb;
396     return lg;
397    
398     }
399    
400 francois 532 double MAILLEUR3D::calcul_distance_metrique_segment(MG_SEGMENT *seg,int pas)
401     {
402     double l;
403     bool res=seg->get_distance_metrique(&l);
404     if (res==false)
405     {
406     l=metrique->calcul_distance_metrique(seg,pas);
407     seg->change_distance_metrique(l);
408     }
409     return l;
410     }
411 francois 283
412    
413     int MAILLEUR3D::genere_noeud(MG_VOLUME* mgvol,MG_FRONT_3D* ft,TPL_MAP_ENTITE<MG_NOEUD*> &liste_noeud,std::vector<CAS_FRONT*> &liste_cas)
414     {
415     MG_NOEUD* noeud1=ft->get_noeud1();
416     MG_NOEUD* noeud2=ft->get_noeud2();
417     MG_NOEUD* noeud3=ft->get_noeud3();
418     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
419     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
420 francois 553 OT_VECTEUR_3D normalnonnorme=n1n2&n1n3;
421     OT_VECTEUR_3D normal=normalnonnorme;
422 francois 283 normal.norme();
423     double xyz1[3]={noeud1->get_x(),noeud1->get_y(),noeud1->get_z()};
424     double xyz2[3]={noeud2->get_x(),noeud2->get_y(),noeud2->get_z()};
425     double xyz3[3]={noeud3->get_x(),noeud3->get_y(),noeud3->get_z()};
426     double hauteur=0.81649658*ft->get_triangle()->get_longueur();
427     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])};
428     double xyz4[3];
429     do
430     {
431     xyz4[0]=xyzg[0]+hauteur*normal.get_x();
432     xyz4[1]=xyzg[1]+hauteur*normal.get_y();
433     xyz4[2]=xyzg[2]+hauteur*normal.get_z();
434     hauteur=hauteur*0.9;
435     }
436     while (metrique->valide_parametre(xyz4)==0);
437 francois 532 double l1=calcul_distance_metrique_segment(ft->get_triangle()->get_segment1(),pas);
438     double l2=calcul_distance_metrique_segment(ft->get_triangle()->get_segment2(),pas);
439     double l3=calcul_distance_metrique_segment(ft->get_triangle()->get_segment3(),pas);
440 francois 283 double l=0.333333333333333*(l1+l2+l3);
441     double longueur_desiree=0.81649658*(priorite_metrique+(1-priorite_metrique)*l);
442     longueur_desiree=longueur_desiree/ft->get_ifail();
443 francois 632 int res=metrique->ajuste_distance_metrique(xyzg,xyz4,longueur_desiree,pas);
444 francois 1150 if (res==0) return MAGIC::MAILLEURFRONTALETAT::PASTROUVE;
445 francois 283 OT_VECTEUR_3D hauteurajustee(xyzg[0]-xyz4[0],xyzg[1]-xyz4[1],xyzg[2]-xyz4[2]);
446     hauteur=hauteurajustee.get_longueur();
447    
448     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_front;
449     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_front_proche;
450 francois 632 ntree_de_front->rechercher(xyz4[0],xyz4[1],xyz4[2],hauteur*1.837117307,liste_front);
451 francois 283 int nb_liste=liste_front.get_nb();
452     double disref=(priorite_metrique+(1-priorite_metrique)*l)/ft->get_ifail();
453     MG_NOEUD* noeudref=NULL;
454     for (int i=0;i<nb_liste;i++)
455     {
456     MG_FRONT_3D* ft2=liste_front.get(i);
457     for (int j=0;j<3;j++)
458     {
459     MG_NOEUD* noeud_tmp;
460     if (j==0) noeud_tmp=ft2->get_noeud1();
461     if (j==1) noeud_tmp=ft2->get_noeud2();
462     if (j==2) noeud_tmp=ft2->get_noeud3();
463     double *xyz_tmp=noeud_tmp->get_coord();
464 francois 553 // ici il faut verifier que ;'on pogne un noeud du bon coté du front
465     OT_VECTEUR_3D vec(xyz_tmp[0]-xyzg[0],xyz_tmp[1]-xyzg[1],xyz_tmp[2]-xyzg[2]);
466     double eps=0.333333333333333*(vec.diff()+n1n2.diff()+n1n3.diff());
467     eps=6.*eps*EPS_BASE_RELATIVE;
468     if (vec*normalnonnorme<eps) continue;
469 francois 532 double dis=metrique->calcul_distance_metrique(xyz_tmp,xyz4,1);
470 francois 283 if (dis<disref)
471     {
472     disref=dis;
473     noeudref=noeud_tmp;
474     }
475     }
476     if (ft2!=ft)
477     {
478     double dismin=evaluer_distance_noeud_triangle(xyz4[0],xyz4[1],xyz4[2],ft2->get_triangle());
479     if (dismin<hauteur) liste_front_proche.ajouter(ft2);
480     }
481     }
482     if (noeudref!=NULL)
483     {
484 francois 532 double dis2=metrique->calcul_distance_metrique(noeudref->get_coord(),xyzg,2);
485 francois 283 if (dis2<longueur_desiree*1.5)
486     if (noeudref!=noeud1)
487     if (noeudref!=noeud2)
488     if (noeudref!=noeud3)
489     {
490     liste_noeud.ajouter(noeudref);
491 francois 1150 return MAGIC::MAILLEURFRONTALETAT::EXISTE;
492 francois 283 }
493     }
494     int nb_proche=liste_front_proche.get_nb();
495     int nb_cas=liste_cas.size();
496     if (nb_proche>0)
497     {
498     for (int i=0;i<nb_proche;i++)
499     {
500     MG_FRONT_3D* fttmp=liste_front_proche.get(i);
501     int ok=0;
502     for (int j=0;j<nb_cas;j++)
503     {
504     MG_NOEUD* casnoeud=liste_cas[j]->mgnoeud;
505     if ((fttmp->get_noeud1()==casnoeud) || (fttmp->get_noeud2()==casnoeud) || (fttmp->get_noeud3()==casnoeud) )
506     {
507     ok=1;
508     break;
509     }
510     }
511     if (ok==1) continue;
512     MG_NOEUD* noeudtmp=fttmp->get_noeud1();
513     if (noeudtmp!=noeud1)
514     if (noeudtmp!=noeud2)
515     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
516     noeudtmp=fttmp->get_noeud2();
517     if (noeudtmp!=noeud1)
518     if (noeudtmp!=noeud2)
519     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
520     noeudtmp=fttmp->get_noeud3();
521     if (noeudtmp!=noeud1)
522     if (noeudtmp!=noeud2)
523     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
524    
525     }
526 francois 1150 if (liste_noeud.get_nb()>0) return MAGIC::MAILLEURFRONTALETAT::MULTIEXISTE;
527 francois 283 }
528 francois 791 M3D_NOEUD* nouveau_noeud=new M3D_NOEUD(mgvol,xyz4[0],xyz4[1],xyz4[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
529 francois 283 mg_maillage->ajouter_mg_noeud(nouveau_noeud);
530     liste_noeud.ajouter(nouveau_noeud);
531 francois 1150 return MAGIC::MAILLEURFRONTALETAT::CREATION;
532 francois 283 }
533    
534    
535    
536     double MAILLEUR3D::evaluer_distance_noeud_triangle(double x,double y,double z,MG_TRIANGLE* tri)
537     {
538     double eps=0.0001;
539     MG_NOEUD* noeud1=tri->get_noeud1();
540     MG_NOEUD* noeud2=tri->get_noeud2();
541     MG_NOEUD* noeud3=tri->get_noeud3();
542     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
543     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
544     OT_VECTEUR_3D n1n4(x-noeud1->get_x(),y-noeud1->get_y(),z-noeud1->get_z());
545     OT_VECTEUR_3D n1n=n1n2&n1n3;
546     OT_MATRICE_3D matbase(n1n2,n1n3,n1n);
547     OT_MATRICE_3D matxsi(n1n4,n1n3,n1n);
548     OT_MATRICE_3D mateta(n1n2,n1n4,n1n);
549     double xsi=matxsi.get_determinant()/matbase.get_determinant();
550     double eta=mateta.get_determinant()/matbase.get_determinant();
551     double dis;
552     if ((eta>-eps) && (xsi>-eps) && (eta+xsi<1.0+eps))
553     {
554     double xproj=(1-xsi-eta)*noeud1->get_x()+xsi*noeud2->get_x()+eta*noeud3->get_x();
555     double yproj=(1-xsi-eta)*noeud1->get_y()+xsi*noeud2->get_y()+eta*noeud3->get_y();
556     double zproj=(1-xsi-eta)*noeud1->get_z()+xsi*noeud2->get_z()+eta*noeud3->get_z();
557     OT_VECTEUR_3D vec(x-xproj,y-yproj,z-zproj);
558     dis=vec.get_longueur();
559     }
560     else
561     {
562     OT_VECTEUR_3D nn1(x-noeud1->get_x(),y-noeud1->get_y(),z-noeud1->get_z());
563     OT_VECTEUR_3D nn2(x-noeud2->get_x(),y-noeud2->get_y(),z-noeud2->get_z());
564     OT_VECTEUR_3D nn3(x-noeud3->get_x(),y-noeud3->get_y(),z-noeud3->get_z());
565     dis=0.3333333333333*(nn1.get_longueur()+nn2.get_longueur()+nn3.get_longueur());
566     }
567     return dis;
568     }
569    
570    
571     void MAILLEUR3D::detruit_tetra(MG_TRIANGLE* tri)
572     {
573 francois 419
574 francois 283 M3D_TRIANGLE* mtri;
575     mtri=(M3D_TRIANGLE*)tri;
576    
577     M3D_TETRA* tet=(M3D_TETRA*)mtri->get_voisin(0);
578     M3D_TRIANGLE* mtriangle1=(M3D_TRIANGLE*)tet->get_triangle1();
579     M3D_TRIANGLE* mtriangle2=(M3D_TRIANGLE*)tet->get_triangle2();
580     M3D_TRIANGLE* mtriangle3=(M3D_TRIANGLE*)tet->get_triangle3();
581     M3D_TRIANGLE* mtriangle4=(M3D_TRIANGLE*)tet->get_triangle4();
582 francois 558 tet->etat_detruit();
583     lsttet_a_detruire.ajouter(tet);
584 francois 283 TPL_MAP_ENTITE<MG_FRONT_3D*> liste_de_front;
585     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_de_front2;
586     MG_FRONT_3D* fttet1=NULL;
587     MG_FRONT_3D* fttet2=NULL;
588     MG_FRONT_3D* fttet3=NULL;
589     MG_FRONT_3D* fttet4=NULL;
590    
591 francois 1150 if (mtriangle1->get_etat_front()==MAGIC::MAILLEURFRONTALETAT::FRONT_ACTIF)
592 francois 283 {
593     MG_FRONT_3D* fttmp=mtriangle1->get_mgfront();
594     fttet1=fttmp;
595     liste_de_front.ajouter(fttmp->get_front_voisin(0));
596     liste_de_front.ajouter(fttmp->get_front_voisin(1));
597     liste_de_front.ajouter(fttmp->get_front_voisin(2));
598     //supprimer_front_en_reculant(fttmp);
599     mtriangle1->supprimer_voisin(tet);
600     }
601     else
602     {
603 francois 1150 MG_FRONT_3D* ftn1=ajouter_front_courant(MAGIC::MAILLEURFRONTALETAT::PRIORITAIRE,tet->get_noeud1(),tet->get_noeud2(),tet->get_noeud3(),mtriangle1);
604 francois 283 ftn1->incremente_ifail();
605     mtriangle1->supprimer_voisin(tet);
606     liste_de_front2.ajouter(ftn1);
607     }
608 francois 1150 if (mtriangle2->get_etat_front()==MAGIC::MAILLEURFRONTALETAT::FRONT_ACTIF)
609 francois 283 {
610     MG_FRONT_3D* fttmp=mtriangle2->get_mgfront();
611     fttet2=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     mtriangle2->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_noeud4(),tet->get_noeud2(),mtriangle2);
621 francois 283 ftn1->incremente_ifail();
622     mtriangle2->supprimer_voisin(tet);
623     liste_de_front2.ajouter(ftn1);
624     }
625 francois 1150 if (mtriangle3->get_etat_front()==MAGIC::MAILLEURFRONTALETAT::FRONT_ACTIF)
626 francois 283 {
627     MG_FRONT_3D* fttmp=mtriangle3->get_mgfront();
628     fttet3=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     mtriangle3->supprimer_voisin(tet);
634     }
635     else
636     {
637 francois 1150 MG_FRONT_3D* ftn1=ajouter_front_courant(MAGIC::MAILLEURFRONTALETAT::PRIORITAIRE,tet->get_noeud2(),tet->get_noeud4(),tet->get_noeud3(),mtriangle3);
638 francois 283 ftn1->incremente_ifail();
639     mtriangle3->supprimer_voisin(tet);
640     liste_de_front2.ajouter(ftn1);
641     }
642 francois 1150 if (mtriangle4->get_etat_front()==MAGIC::MAILLEURFRONTALETAT::FRONT_ACTIF)
643 francois 283 {
644     MG_FRONT_3D* fttmp=mtriangle4->get_mgfront();
645     fttet4=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     mtriangle4->supprimer_voisin(tet);
651     }
652     else
653     {
654 francois 1150 MG_FRONT_3D* ftn1=ajouter_front_courant(MAGIC::MAILLEURFRONTALETAT::PRIORITAIRE,tet->get_noeud1(),tet->get_noeud3(),tet->get_noeud4(),mtriangle4);
655 francois 283 ftn1->incremente_ifail();
656     mtriangle4->supprimer_voisin(tet);
657     liste_de_front2.ajouter(ftn1);
658     }
659    
660     if (fttet1!=NULL)
661     {
662     liste_de_front.supprimer(fttet1);
663     supprimer_front_en_reculant(fttet1);
664     }
665     if (fttet2!=NULL)
666     {
667     liste_de_front.supprimer(fttet2);
668     supprimer_front_en_reculant(fttet2);
669     }
670     if (fttet3!=NULL)
671     {
672     liste_de_front.supprimer(fttet3);
673     supprimer_front_en_reculant(fttet3);
674     }
675     if (fttet4!=NULL)
676     {
677     liste_de_front.supprimer(fttet4);
678     supprimer_front_en_reculant(fttet4);
679     }
680     int nb_liste1=liste_de_front.get_nb();
681     for (int i=0;i<nb_liste1;i++)
682     if (liste_de_front.get(i)!=NULL)
683     mise_a_jour_voisin_front(liste_de_front.get(i));
684     int nb_liste2=liste_de_front2.get_nb();
685     for (int i=0;i<nb_liste2;i++)
686     {
687     mise_a_jour_voisin_front(liste_de_front2.get(i));
688     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(0));
689     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(1));
690     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(2));
691     }
692    
693     for (int k=0;k<4;k++)
694     {
695     MG_NOEUD* noeud;
696     if (k==0) noeud=tet->get_noeud1();
697     if (k==1) noeud=tet->get_noeud2();
698     if (k==2) noeud=tet->get_noeud3();
699     if (k==3) noeud=tet->get_noeud4();
700     int nb_tet=noeud->get_lien_tetra()->get_nb();
701    
702 francois 1150 if (noeud->get_type_entite()==MAGIC::TYPE_ENTITE::IDM3D_NOEUD)
703 francois 283 {
704     int test=false;
705     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud;
706     for (int i=0;i<nb_tet;i++)
707     {
708     MG_TETRA* tet=noeud->get_lien_tetra()->get(i);
709 francois 1150 if (tet->get_type_entite()==MAGIC::TYPE_ENTITE::IDM3D_TETRA)
710 francois 283 {
711     M3D_TETRA* mtet=(M3D_TETRA*)tet;
712 francois 1149 if (mtet->get_etat()==MAGIC::MAILLEURFRONTALETAT::ACTIF) test=true;
713 francois 283 }
714     else test=true;
715     }
716 francois 558 if (test==false)
717     {
718     mnoeud->etat_detruit();
719     lstnoeud_a_detruire.ajouter(mnoeud);
720     }
721 francois 283 }
722     }
723 francois 419
724 francois 283 }
725    
726    
727    
728    
729 francois 532
730 francois 283 void MAILLEUR3D::detruit_element_inactif(void)
731     {
732 francois 558 /* LISTE_MG_TETRA::iterator it;
733 francois 283
734     for (MG_TETRA* tet=mg_maillage->get_premier_tetra(it);tet!=NULL;tet=mg_maillage->get_suivant_tetra(it))
735     {
736     M3D_TETRA* mtet=(M3D_TETRA*)tet;
737     if (mtet->get_etat()==DETRUIT)
738     lsttet.ajouter(tet);
739     }
740     LISTE_MG_NOEUD::iterator it2;
741     for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(it2);noeud!=NULL;noeud=mg_maillage->get_suivant_noeud(it2))
742     {
743     if (noeud->get_type_entite()==IDM3D_NOEUD)
744     {
745     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud;
746     if (mnoeud->get_etat()==DETRUIT)
747     lstnoeud.ajouter(noeud);
748     }
749 francois 558 }*/
750 francois 283 TPL_MAP_ENTITE<MG_TETRA*>::ITERATEUR it3;
751 francois 558 for (MG_TETRA* tet=lsttet_a_detruire.get_premier(it3);tet!=NULL;tet=lsttet_a_detruire.get_suivant(it3))
752     supprimer_mg_tetra(tet);
753 francois 283 TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it4;
754 francois 558 for (MG_NOEUD* noeud=lstnoeud_a_detruire.get_premier(it4);noeud!=NULL;noeud=lstnoeud_a_detruire.get_suivant(it4))
755 francois 283 mg_maillage->supprimer_mg_noeudid(noeud->get_id());
756 francois 558 lstnoeud_a_detruire.vide();
757     lsttet_a_detruire.vide();
758 francois 419
759 francois 283 }
760    
761    
762    
763    
764    
765 francois 424 void MAILLEUR3D::analyse_maillage_obtenu(double &vol,int *tab,double borne1,double borne2,double borne3)
766 francois 283 {
767 francois 424 vol=0.;tab[0]=0;tab[1]=0;tab[2]=0;tab[3]=0;
768     LISTE_MG_TETRA::iterator it;
769     for (MG_TETRA* tet=mg_maillage->get_premier_tetra(it);tet!=NULL;tet=mg_maillage->get_suivant_tetra(it))
770 francois 283 {
771 francois 532 vol=vol+metrique->calcul_volume_tetra_metrique(tet);
772 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());
773     if (qual>=borne3) tab[3]++;
774     else if (qual>=borne2) tab[2]++;
775     else if (qual>=borne1) tab[1]++;
776     else tab[0]++;
777 francois 283 }
778     }
779    
780    
781     void MAILLEUR3D::insere_contrainte_tetra(MG_VOLUME* mgvol,TPL_LISTE_ENTITE<MG_TETRA*> *lsttet)
782     {
783 couturad 951 std::map<long,long,std::less<long> > lstcorrespondancenoeud;
784 francois 283 int nbtet=lsttet->get_nb();
785     for (int i=0;i<nbtet;i++)
786     {
787     M3D_TETRA* tet=(M3D_TETRA*)lsttet->get(i);
788     double *xyz1=tet->get_noeud1()->get_coord();
789     double *xyz2=tet->get_noeud2()->get_coord();
790     double *xyz3=tet->get_noeud3()->get_coord();
791     double *xyz4=tet->get_noeud4()->get_coord();
792     double xyz[3];
793     xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0]+xyz4[0])*0.25;
794     xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1]+xyz4[1])*0.25;
795     xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2]+xyz4[2])*0.25;
796     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_trouvee;
797     OT_VECTEUR_3D vec1(xyz,xyz1);
798     OT_VECTEUR_3D vec2(xyz,xyz2);
799     OT_VECTEUR_3D vec3(xyz,xyz3);
800     OT_VECTEUR_3D vec4(xyz,xyz4);
801     double rayonrecherche=vec1.get_longueur();
802     if (vec2.get_longueur()>rayonrecherche) rayonrecherche=vec2.get_longueur();
803     if (vec3.get_longueur()>rayonrecherche) rayonrecherche=vec3.get_longueur();
804     if (vec4.get_longueur()>rayonrecherche) rayonrecherche=vec4.get_longueur();
805     rayonrecherche=rayonrecherche*1.1;
806 francois 632 ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
807 francois 283 MG_NOEUD* noeudref1=NULL;
808     if (lstcorrespondancenoeud.find(tet->get_noeud1()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
809     noeudref1=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud1()->get_nouveau_numero()]);
810     MG_NOEUD* noeudref2=NULL;
811     if (lstcorrespondancenoeud.find(tet->get_noeud2()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
812     noeudref2=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud2()->get_nouveau_numero()]);
813     MG_NOEUD* noeudref3=NULL;
814     if (lstcorrespondancenoeud.find(tet->get_noeud3()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
815     noeudref3=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud3()->get_nouveau_numero()]);
816     MG_NOEUD* noeudref4=NULL;
817     if (lstcorrespondancenoeud.find(tet->get_noeud4()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
818     noeudref4=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud4()->get_nouveau_numero()]);
819     int nbtrouve=liste_trouvee.get_nb();
820     for (int j=0;j<nbtrouve;j++)
821     {
822     if ((noeudref1!=NULL) && (noeudref2!=NULL) && (noeudref3!=NULL) && (noeudref4!=NULL) ) break;
823     MG_FRONT_3D* ft=liste_trouvee.get(j);
824     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
825     lstnoeud.ajouter(ft->get_noeud1());
826     lstnoeud.ajouter(ft->get_noeud2());
827     lstnoeud.ajouter(ft->get_noeud3());
828     if (noeudref1==NULL)
829     {
830     int nb=lstnoeud.get_nb();
831     for (int k=0;k<nb;k++)
832     {
833     double *xyztmp=lstnoeud.get(k)->get_coord();
834     OT_VECTEUR_3D vec(xyztmp,xyz1);
835     double longueur=vec.get_longueur();
836     if (longueur<1e-6*rayonrecherche)
837     {
838     noeudref1=lstnoeud.get(k);
839     lstnoeud.supprimer(lstnoeud.get(k));
840     break;
841     }
842     }
843     }
844     if (noeudref2==NULL)
845     {
846     int nb=lstnoeud.get_nb();
847     for (int k=0;k<nb;k++)
848     {
849     double *xyztmp=lstnoeud.get(k)->get_coord();
850     OT_VECTEUR_3D vec(xyztmp,xyz2);
851     double longueur=vec.get_longueur();
852     if (longueur<1e-6*rayonrecherche)
853     {
854     noeudref2=lstnoeud.get(k);
855     lstnoeud.supprimer(lstnoeud.get(k));
856     break;
857     }
858     }
859     }
860     if (noeudref3==NULL)
861     {
862     int nb=lstnoeud.get_nb();
863     for (int k=0;k<nb;k++)
864     {
865     double *xyztmp=lstnoeud.get(k)->get_coord();
866     OT_VECTEUR_3D vec(xyztmp,xyz3);
867     double longueur=vec.get_longueur();
868     if (longueur<1e-6*rayonrecherche)
869     {
870     noeudref3=lstnoeud.get(k);
871     lstnoeud.supprimer(lstnoeud.get(k));
872     break;
873     }
874     }
875     }
876     if (noeudref4==NULL)
877     {
878     int nb=lstnoeud.get_nb();
879     for (int k=0;k<nb;k++)
880     {
881     double *xyztmp=lstnoeud.get(k)->get_coord();
882     OT_VECTEUR_3D vec(xyztmp,xyz4);
883     double longueur=vec.get_longueur();
884     if (longueur<1e-6*rayonrecherche)
885     {
886     noeudref4=lstnoeud.get(k);
887     lstnoeud.supprimer(lstnoeud.get(k));
888     break;
889     }
890     }
891     }
892     }
893     if (noeudref1==NULL)
894     {
895 francois 791 noeudref1=mg_maillage->ajouter_mg_noeud(mgvol,xyz1[0],xyz1[1],xyz1[2],MAGIC::ORIGINE::IMPOSE);
896 francois 283 if (tet->get_noeud1()->get_nouveau_numero()!=(-1))
897     {
898     noeudref1->change_nouveau_numero(tet->get_noeud1()->get_nouveau_numero());
899 couturad 951 std::pair<long,long> tmp(noeudref1->get_nouveau_numero(),noeudref1->get_id());
900 francois 283 lstcorrespondancenoeud.insert(tmp);
901     }
902     }
903     if (noeudref2==NULL)
904     {
905 francois 791 noeudref2=mg_maillage->ajouter_mg_noeud(mgvol,xyz2[0],xyz2[1],xyz2[2],MAGIC::ORIGINE::IMPOSE);
906 francois 283 if (tet->get_noeud2()->get_nouveau_numero()!=(-1))
907     {
908     noeudref2->change_nouveau_numero(tet->get_noeud2()->get_nouveau_numero());
909 couturad 951 std::pair<long,long> tmp(noeudref2->get_nouveau_numero(),noeudref2->get_id());
910 francois 283 lstcorrespondancenoeud.insert(tmp);
911     }
912     }
913     if (noeudref3==NULL)
914     {
915 francois 791 noeudref3=mg_maillage->ajouter_mg_noeud(mgvol,xyz3[0],xyz3[1],xyz3[2],MAGIC::ORIGINE::IMPOSE);
916 francois 283 if (tet->get_noeud3()->get_nouveau_numero()!=(-1))
917     {
918     noeudref3->change_nouveau_numero(tet->get_noeud3()->get_nouveau_numero());
919 couturad 951 std::pair<long,long> tmp(noeudref3->get_nouveau_numero(),noeudref3->get_id());
920 francois 283 lstcorrespondancenoeud.insert(tmp);
921     }
922     }
923     if (noeudref4==NULL)
924     {
925 francois 791 noeudref4=mg_maillage->ajouter_mg_noeud(mgvol,xyz4[0],xyz4[1],xyz4[2],MAGIC::ORIGINE::IMPOSE);
926 francois 283 if (tet->get_noeud4()->get_nouveau_numero()!=(-1))
927     {
928     noeudref4->change_nouveau_numero(tet->get_noeud4()->get_nouveau_numero());
929 couturad 951 std::pair<long,long> tmp(noeudref4->get_nouveau_numero(),noeudref4->get_id());
930 francois 283 lstcorrespondancenoeud.insert(tmp);
931     }
932     }
933     M3D_TRIANGLE* triangle1=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref3->get_id(),noeudref2->get_id());
934     M3D_TRIANGLE* triangle2=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref2->get_id(),noeudref4->get_id());
935     M3D_TRIANGLE* triangle3=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref2->get_id(),noeudref3->get_id(),noeudref4->get_id());
936     M3D_TRIANGLE* triangle4=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref4->get_id(),noeudref3->get_id());
937 francois 791 if (triangle1==NULL) triangle1=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref3,noeudref2,MAGIC::ORIGINE::IMPOSE);
938     if (triangle2==NULL) triangle2=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref2,noeudref4,MAGIC::ORIGINE::IMPOSE);
939     if (triangle3==NULL) triangle3=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref2,noeudref3,noeudref4,MAGIC::ORIGINE::IMPOSE);
940     if (triangle4==NULL) triangle4=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref4,noeudref3,MAGIC::ORIGINE::IMPOSE);
941     MG_TETRA* tetra=cree_tetra(mgvol,noeudref1,noeudref2,noeudref3,noeudref4,triangle1,triangle2,triangle3,triangle4,MAGIC::ORIGINE::IMPOSE);
942 francois 283 tetra->change_nouveau_numero(tet->get_nouveau_numero());
943     mg_maillage->ajouter_mg_tetra(tetra);
944     triangle1->ajouter_voisin(tetra);
945     triangle2->ajouter_voisin(tetra);
946     triangle3->ajouter_voisin(tetra);
947     triangle4->ajouter_voisin(tetra);
948     MG_FRONT_3D *ftref1=NULL;
949     MG_FRONT_3D *ftref2=NULL;
950     MG_FRONT_3D *ftref3=NULL;
951     MG_FRONT_3D *ftref4=NULL;
952 francois 1150 if (triangle1->get_etat_front()==MAGIC::MAILLEURFRONTALETAT::FRONT_ACTIF) ftref1=triangle1->get_mgfront();
953     if (triangle2->get_etat_front()==MAGIC::MAILLEURFRONTALETAT::FRONT_ACTIF) ftref2=triangle2->get_mgfront();
954     if (triangle3->get_etat_front()==MAGIC::MAILLEURFRONTALETAT::FRONT_ACTIF) ftref3=triangle3->get_mgfront();
955     if (triangle4->get_etat_front()==MAGIC::MAILLEURFRONTALETAT::FRONT_ACTIF) ftref4=triangle4->get_mgfront();
956 francois 283 TPL_MAP_ENTITE<MG_FRONT_3D*> lstfront;
957     MG_FRONT_3D *ft1=NULL;
958     MG_FRONT_3D *ft2=NULL;
959     MG_FRONT_3D *ft3=NULL;
960     MG_FRONT_3D *ft4=NULL;
961 francois 1150 if (ftref1==NULL) ft1=mise_a_jour_front(tetra,0,MAGIC::MAILLEURFRONTALETAT::NONFORCE);
962 francois 283 else
963     {
964     lstfront.ajouter(ftref1->get_front_voisin(0));
965     lstfront.ajouter(ftref1->get_front_voisin(1));
966     lstfront.ajouter(ftref1->get_front_voisin(2));
967     supprimer_front_en_avancant_sans_delete(ftref1);
968     }
969 francois 1150 if (ftref2==NULL) ft2=mise_a_jour_front(tetra,1,MAGIC::MAILLEURFRONTALETAT::NONFORCE);
970 francois 283 else
971     {
972     lstfront.ajouter(ftref2->get_front_voisin(0));
973     lstfront.ajouter(ftref2->get_front_voisin(1));
974     lstfront.ajouter(ftref2->get_front_voisin(2));
975     supprimer_front_en_avancant_sans_delete(ftref2);
976     }
977 francois 1150 if (ftref3==NULL) ft3=mise_a_jour_front(tetra,2,MAGIC::MAILLEURFRONTALETAT::NONFORCE);
978 francois 283 else
979     {
980     lstfront.ajouter(ftref3->get_front_voisin(0));
981     lstfront.ajouter(ftref3->get_front_voisin(1));
982     lstfront.ajouter(ftref3->get_front_voisin(2));
983     supprimer_front_en_avancant_sans_delete(ftref3);
984     }
985 francois 1150 if (ftref4==NULL) ft4=mise_a_jour_front(tetra,3,MAGIC::MAILLEURFRONTALETAT::NONFORCE);
986 francois 283 else
987     {
988     lstfront.ajouter(ftref4->get_front_voisin(0));
989     lstfront.ajouter(ftref4->get_front_voisin(1));
990     lstfront.ajouter(ftref4->get_front_voisin(2));
991     supprimer_front_en_avancant_sans_delete(ftref4);
992     }
993     if (ftref1!=NULL) {
994     lstfront.supprimer(ftref1);
995     delete ftref1;
996     }
997     if (ftref2!=NULL) {
998     lstfront.supprimer(ftref2);
999     delete ftref2;
1000     }
1001     if (ftref3!=NULL) {
1002     lstfront.supprimer(ftref3);
1003     delete ftref3;
1004     }
1005     if (ftref4!=NULL) {
1006     lstfront.supprimer(ftref4);
1007     delete ftref4;
1008     }
1009     if (ft1!=NULL)
1010     {
1011     mise_a_jour_voisin_front(ft1);
1012     lstfront.ajouter(ft1->get_front_voisin(0));
1013     lstfront.ajouter(ft1->get_front_voisin(1));
1014     lstfront.ajouter(ft1->get_front_voisin(2));
1015     }
1016     if (ft2!=NULL)
1017     {
1018     mise_a_jour_voisin_front(ft2);
1019     lstfront.ajouter(ft2->get_front_voisin(0));
1020     lstfront.ajouter(ft2->get_front_voisin(1));
1021     lstfront.ajouter(ft2->get_front_voisin(2));
1022     }
1023     if (ft3!=NULL)
1024     {
1025     mise_a_jour_voisin_front(ft3);
1026     lstfront.ajouter(ft3->get_front_voisin(0));
1027     lstfront.ajouter(ft3->get_front_voisin(1));
1028     lstfront.ajouter(ft3->get_front_voisin(2));
1029     }
1030     if (ft4!=NULL)
1031     {
1032     mise_a_jour_voisin_front(ft4);
1033     lstfront.ajouter(ft4->get_front_voisin(0));
1034     lstfront.ajouter(ft4->get_front_voisin(1));
1035     lstfront.ajouter(ft4->get_front_voisin(2));
1036     }
1037    
1038     for (int l=0;l<lstfront.get_nb();l++) mise_a_jour_voisin_front(lstfront.get(l));
1039    
1040     }
1041     }
1042    
1043     void MAILLEUR3D::insere_contrainte_triangle(MG_VOLUME* mgvol,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
1044     {
1045     int nbtri=lsttri->get_nb();
1046     for (int i=0;i<nbtri;i++)
1047     {
1048     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)lsttri->get(i);
1049     double *xyz1=tri->get_noeud1()->get_coord();
1050     double *xyz2=tri->get_noeud2()->get_coord();
1051     double *xyz3=tri->get_noeud3()->get_coord();
1052     double xyz[3];
1053     xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0])/3.;
1054     xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1])/3.;
1055     xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2])/3.;
1056     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_trouvee;
1057     OT_VECTEUR_3D vec1(xyz,xyz1);
1058     OT_VECTEUR_3D vec2(xyz,xyz2);
1059     OT_VECTEUR_3D vec3(xyz,xyz3);
1060     double rayonrecherche=vec1.get_longueur();
1061     if (vec2.get_longueur()>rayonrecherche) rayonrecherche=vec2.get_longueur();
1062     if (vec3.get_longueur()>rayonrecherche) rayonrecherche=vec3.get_longueur();
1063     rayonrecherche=rayonrecherche*1.1;
1064 francois 632 ntree_de_front->rechercher(xyz[0],xyz[2],xyz[2],rayonrecherche,liste_trouvee);
1065 francois 283 MG_NOEUD* noeudref1=NULL;
1066     MG_NOEUD* noeudref2=NULL;
1067     MG_NOEUD* noeudref3=NULL;
1068     int nbtrouve=liste_trouvee.get_nb();
1069     for (int j=0;j<nbtrouve;j++)
1070     {
1071     MG_FRONT_3D* ft=liste_trouvee.get(j);
1072     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
1073     lstnoeud.ajouter(ft->get_noeud1());
1074     lstnoeud.ajouter(ft->get_noeud2());
1075     lstnoeud.ajouter(ft->get_noeud3());
1076     int nb=lstnoeud.get_nb();
1077     for (int k=0;k<nb;k++)
1078     {
1079     double *xyztmp=lstnoeud.get(k)->get_coord();
1080     OT_VECTEUR_3D vec(xyztmp,xyz1);
1081     double longueur=vec.get_longueur();
1082     if (longueur<1e-10*rayonrecherche)
1083     {
1084     noeudref1=lstnoeud.get(k);
1085     lstnoeud.supprimer(lstnoeud.get(k));
1086     break;
1087     }
1088     }
1089     nb=lstnoeud.get_nb();
1090     for (int k=0;k<nb;k++)
1091     {
1092     double *xyztmp=lstnoeud.get(k)->get_coord();
1093     OT_VECTEUR_3D vec(xyztmp,xyz2);
1094     double longueur=vec.get_longueur();
1095     if (longueur<1e-10*rayonrecherche)
1096     {
1097     noeudref2=lstnoeud.get(k);
1098     lstnoeud.supprimer(lstnoeud.get(k));
1099     break;
1100     }
1101     }
1102     nb=lstnoeud.get_nb();
1103     for (int k=0;k<nb;k++)
1104     {
1105     double *xyztmp=lstnoeud.get(k)->get_coord();
1106     OT_VECTEUR_3D vec(xyztmp,xyz3);
1107     double longueur=vec.get_longueur();
1108     if (longueur<1e-10*rayonrecherche)
1109     {
1110     noeudref3=lstnoeud.get(k);
1111     lstnoeud.supprimer(lstnoeud.get(k));
1112     break;
1113     }
1114     }
1115    
1116     }
1117     if (noeudref1==NULL)
1118     {
1119 francois 791 noeudref1=mg_maillage->ajouter_mg_noeud(mgvol,xyz1[0],xyz1[1],xyz1[2],MAGIC::ORIGINE::IMPOSE);
1120 francois 283 noeudref1->change_nouveau_numero(tri->get_noeud1()->get_nouveau_numero());
1121     }
1122     if (noeudref2==NULL)
1123     {
1124 francois 791 noeudref2=mg_maillage->ajouter_mg_noeud(mgvol,xyz2[0],xyz2[1],xyz2[2],MAGIC::ORIGINE::IMPOSE);
1125 francois 283 noeudref2->change_nouveau_numero(tri->get_noeud2()->get_nouveau_numero());
1126     }
1127     if (noeudref3==NULL)
1128     {
1129 francois 791 noeudref3=mg_maillage->ajouter_mg_noeud(mgvol,xyz3[0],xyz3[1],xyz3[2],MAGIC::ORIGINE::IMPOSE);
1130 francois 283 noeudref3->change_nouveau_numero(tri->get_noeud3()->get_nouveau_numero());
1131     }
1132    
1133     MG_SEGMENT* segment1=mg_maillage->get_mg_segment(noeudref1->get_id(),noeudref2->get_id());
1134     MG_SEGMENT* segment2=mg_maillage->get_mg_segment(noeudref1->get_id(),noeudref3->get_id());
1135     MG_SEGMENT* segment3=mg_maillage->get_mg_segment(noeudref2->get_id(),noeudref3->get_id());
1136 francois 791 if (segment1==NULL) segment1=cree_segment(mgvol,noeudref1,noeudref2,MAGIC::ORIGINE::IMPOSE);
1137     if (segment2==NULL) segment2=cree_segment(mgvol,noeudref1,noeudref3,MAGIC::ORIGINE::IMPOSE);
1138     if (segment3==NULL) segment3=cree_segment(mgvol,noeudref2,noeudref3,MAGIC::ORIGINE::IMPOSE);
1139     MG_TRIANGLE* nvtri=cree_triangle(mgvol,noeudref1,noeudref2,noeudref3,segment1,segment2,segment3,MAGIC::ORIGINE::IMPOSE);
1140     MG_TRIANGLE* nvtri2=cree_triangle(mgvol,noeudref1,noeudref3,noeudref2,segment1,segment2,segment3,MAGIC::ORIGINE::IMPOSE);
1141 francois 283 //MG_TRIANGLE* nvtri=insere_triangle(mgvol,noeudref1,noeudref2,noeudref3,IMPOSE);
1142     //MG_TRIANGLE* nvtri2=insere_triangle(mgvol,noeudref1,noeudref3,noeudref2,IMPOSE);
1143 francois 1150 MG_FRONT_3D *ft=ajouter_front_courant(MAGIC::MAILLEURFRONTALETAT::NONFORCE,noeudref1,noeudref2,noeudref3,nvtri);
1144     MG_FRONT_3D *ft2=ajouter_front_courant(MAGIC::MAILLEURFRONTALETAT::NONFORCE,noeudref1,noeudref3,noeudref2,nvtri2);
1145 francois 283 mise_a_jour_voisin_front(ft);
1146     mise_a_jour_voisin_front(ft2);
1147     mise_a_jour_voisin_front(ft->get_front_voisin(0));
1148     mise_a_jour_voisin_front(ft->get_front_voisin(1));
1149     mise_a_jour_voisin_front(ft->get_front_voisin(2));
1150     mise_a_jour_voisin_front(ft2->get_front_voisin(0));
1151     mise_a_jour_voisin_front(ft2->get_front_voisin(1));
1152     mise_a_jour_voisin_front(ft2->get_front_voisin(2));
1153    
1154     }
1155 francois 558 }
1156    
1157     int MAILLEUR3D::supprimer_mg_tetra(MG_TETRA* mgtetra)
1158     {
1159     //MG_TETRA* mgtetra=mg_maillage->get_mg_tetra(num);
1160     if (mgtetra==NULL)
1161     {
1162     return FAIL;
1163     }
1164     MG_IDENTIFICATEUR* id=mgtetra;
1165     LISTE_ENTITE::iterator i=mg_maillage->lst_entite.find(id);
1166     mg_maillage->lst_entite.erase(i);
1167     LISTE_MG_TETRA::iterator j=mg_maillage->lst_mg_tetra.find(id->get_id());
1168     mg_maillage->lst_mg_tetra.erase(j);
1169     M3D_TRIANGLE* triangle1=(M3D_TRIANGLE*)mgtetra->get_triangle1();
1170     M3D_TRIANGLE* triangle2=(M3D_TRIANGLE*)mgtetra->get_triangle2();
1171     M3D_TRIANGLE* triangle3=(M3D_TRIANGLE*)mgtetra->get_triangle3();
1172     M3D_TRIANGLE* triangle4=(M3D_TRIANGLE*)mgtetra->get_triangle4();
1173     delete mgtetra;
1174     if (triangle1->get_nb_reference()==0)
1175     if (triangle1->get_lien_topologie()!=NULL)
1176     {
1177     if (triangle1->get_lien_topologie()->get_dimension()>2) mg_maillage->supprimer_mg_triangleid(triangle1->get_id());
1178     }
1179     else if (triangle1->get_frontiere()==0) mg_maillage->supprimer_mg_triangleid(triangle1->get_id());
1180     if (triangle2->get_nb_reference()==0)
1181     if (triangle2->get_lien_topologie()!=NULL)
1182     {
1183     if (triangle2->get_lien_topologie()->get_dimension()>2) mg_maillage->supprimer_mg_triangleid(triangle2->get_id());
1184     }
1185     else if (triangle2->get_frontiere()==0) mg_maillage->supprimer_mg_triangleid(triangle2->get_id());
1186     if (triangle3->get_nb_reference()==0)
1187     if (triangle3->get_lien_topologie()!=NULL)
1188     {
1189     if (triangle3->get_lien_topologie()->get_dimension()>2) mg_maillage->supprimer_mg_triangleid(triangle3->get_id());
1190     }
1191     else if (triangle3->get_frontiere()==0) mg_maillage->supprimer_mg_triangleid(triangle3->get_id());
1192     if (triangle4->get_nb_reference()==0)
1193     if (triangle4->get_lien_topologie()!=NULL)
1194     {
1195     if (triangle4->get_lien_topologie()->get_dimension()>2) mg_maillage->supprimer_mg_triangleid(triangle4->get_id());
1196     }
1197     else if (triangle4->get_frontiere()==0) mg_maillage->supprimer_mg_triangleid(triangle4->get_id());
1198     return OK;
1199     }
1200 francois 283
1201    
1202    
1203