ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_couche.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_couche.cpp
File size: 15257 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_couche.cpp
15     //####//
16     //####//------------------------------------------------------------
17     //####//------------------------------------------------------------
18     //####// COPYRIGHT 2000-2024
19     //####// jeu 13 jun 2024 11:58:55 EDT
20     //####//------------------------------------------------------------
21     //####//------------------------------------------------------------
22 francois 879
23    
24     #include "gestionversion.h"
25     #include "mailleur3d_couche.h"
26     #include "mailleur0d.h"
27     #include "mailleur1d.h"
28     #include "mailleur2d.h"
29     #include "mg_gestionnaire.h"
30     #include "mg_geometrie_outils.h"
31 couturad 951 #include "m3d_triangle.h"
32 francois 879
33     #include "mailleur3d_couche.h"
34    
35    
36    
37    
38     MAILLEUR3D_COUCHE::MAILLEUR3D_COUCHE(MG_MAILLAGE* mgmai,MG_GEOMETRIE *mggeo,FCT_TAILLE* fct_taille):MAILLEUR(false),mai(mgmai),geo(mggeo),metrique(fct_taille)
39     {
40    
41     }
42    
43    
44    
45     MAILLEUR3D_COUCHE::~MAILLEUR3D_COUCHE()
46     {
47     }
48    
49    
50    
51    
52 couturad 966 int MAILLEUR3D_COUCHE::maille(MG_GROUPE_TOPOLOGIQUE* mggt)
53 francois 879 {
54 francois 1075 return 0;
55 francois 879 }
56    
57    
58    
59 couturad 966 int MAILLEUR3D_COUCHE::maille(MG_VOLUME *vol)
60 francois 879 {
61 couturad 966 if (!vol->est_mince()) return OK;
62 francois 881 affiche((char*)"Mailleur d'un volume mince en pentaedre");
63     for (int i=0;i<vol->get_nb_face_correspondante();i++)
64 francois 879 {
65 francois 881 MG_FACE* face1;
66     MG_FACE* face2;
67     vol->get_face_correspondante(i,&face1,&face2);
68 francois 879 TPL_MAP_ENTITE<MG_SOMMET*> lstsom;
69     TPL_MAP_ENTITE<MG_ARETE*> lstare;
70 francois 881 MG_FACE* face=face1;
71 francois 879 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
72     face->get_topologie_sousjacente(&lst);
73     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
74     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
75     {
76     if (ele->get_dimension()==0) lstsom.ajouter((MG_SOMMET*)ele);
77     if (ele->get_dimension()==1) lstare.ajouter((MG_ARETE*)ele);
78     }
79     char mess[500];
80     sprintf(mess," Maillage de la face de base %lu",face->get_id());
81     affiche(mess);
82     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR its;
83     for (MG_SOMMET* som=lstsom.get_premier(its);som!=NULL;som=lstsom.get_suivant(its))
84     {
85     bool dejamaille=false;
86     for (int i=0;i<som->get_lien_maillage()->get_nb();i++)
87     if (mai->get_mg_noeudid(som->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
88     if (!dejamaille)
89     {
90     MAILLEUR0D m0d(mai,mai->get_mg_geometrie(),som);
91     m0d.maille();
92     }
93     }
94     TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR ita;
95     for (MG_ARETE* are=lstare.get_premier(ita);are!=NULL;are=lstare.get_suivant(ita))
96     {
97     bool dejamaille=false;
98     for (int i=0;i<are->get_lien_maillage()->get_nb();i++)
99     if (mai->get_mg_segmentid(are->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
100     if (!dejamaille)
101     {
102     MAILLEUR1D m1d(mai,mai->get_mg_geometrie(),metrique,are);
103     m1d.maille();
104     }
105     }
106     bool dejamaille=false;
107     for (int i=0;i<face->get_lien_maillage()->get_nb();i++)
108     if (mai->get_mg_triangleid(face->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
109     if (!dejamaille)
110     {
111     MAILLEUR2D m2d(mai,mai->get_mg_geometrie(),metrique,face);
112     m2d.active_affichage(affiche2);
113     m2d.maille();
114     }
115 francois 881 MG_FACE* autreface=face2;
116 francois 879 sprintf(mess," Maillage de la face extrude %lu",autreface->get_id());
117     affiche(mess);
118     TPL_MAP_ENTITE<MG_SOMMET*> lstasom;
119     TPL_MAP_ENTITE<MG_ARETE*> lstaare;
120     lst.vide();
121     autreface->get_topologie_sousjacente(&lst);
122     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
123     {
124     if (ele->get_dimension()==0) lstasom.ajouter((MG_SOMMET*)ele);
125     if (ele->get_dimension()==1) lstaare.ajouter((MG_ARETE*)ele);
126     }
127     MG_GEOMETRIE_OUTILS ot;
128     for (MG_SOMMET* som=lstsom.get_premier(its);som!=NULL;som=lstsom.get_suivant(its))
129     {
130     int num=0;
131     MG_NOEUD* noeud;
132     do
133     {
134     noeud=(MG_NOEUD*)som->get_lien_maillage()->get(num);
135     num++;
136     }
137     while (mai->get_mg_noeudid(noeud->get_id())==NULL);
138     if (noeud->get_nouveau_numero()>0) continue;
139     double *xyz=noeud->get_coord();
140     double xyzproj[3];
141     double xyzprojuv[3];
142     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
143     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR its2;
144     MG_SOMMET* somop=NULL;
145     double dist=1e300;
146     for (MG_SOMMET* som2=lstasom.get_premier(its2);som2!=NULL;som2=lstasom.get_suivant(its2))
147     {
148     double xyzsom2[3];
149     som2->get_point()->evaluer(xyzsom2);
150     OT_VECTEUR_3D v(xyzproj,xyzsom2);
151     if (v.get_longueur2()<dist) {dist=v.get_longueur2();somop=som2;}
152     }
153 francois 904 somop->get_point()->evaluer(xyzproj);
154 francois 879 MG_NOEUD* no1=new MG_NOEUD(somop,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
155     mai->ajouter_mg_noeud(no1);
156     noeud->change_nouveau_numero(no1->get_id());
157     }
158     for (MG_ARETE* are=lstare.get_premier(ita);are!=NULL;are=lstare.get_suivant(ita))
159     {
160     TPL_LISTE_ENTITE<MG_SEGMENT*> lstseg;
161     for (int i=0;i<are->get_lien_maillage()->get_nb();i++)
162 francois 904 if (mai->get_mg_segmentid(are->get_lien_maillage()->get(i)->get_id())!=NULL) lstseg.ajouter((MG_SEGMENT*)are->get_lien_maillage()->get(i));
163 francois 879 MG_ARETE *areop=NULL;
164     int sens=0;
165     for (int i=0;i<lstseg.get_nb();i++)
166     {
167     MG_SEGMENT* seg=lstseg.get(i);
168     if (seg->get_nouveau_numero()>0) continue;
169     MG_NOEUD* n1=seg->get_noeud1();
170     MG_NOEUD* n2=seg->get_noeud2();
171     MG_NOEUD *no1,*no2;
172     if (n1->get_nouveau_numero()>0) no1=mai->get_mg_noeudid(n1->get_nouveau_numero());
173     else
174     {
175     no1=projete_noeud_sur_arete(n1,autreface,&areop,lstaare);
176     }
177     if (n2->get_nouveau_numero()>0) no2=mai->get_mg_noeudid(n2->get_nouveau_numero());
178     else
179     {
180     no2=projete_noeud_sur_arete(n2,autreface,&areop,lstaare);
181     }
182     MG_SEGMENT* segnv=insere_segment_orientant(areop,no1,no2,sens);
183     seg->change_nouveau_numero(segnv->get_id());
184     }
185     }
186     int sens=0;
187     for (int i=0;i<face->get_lien_maillage()->get_nb();i++)
188     {
189     MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(i);
190     if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
191     MG_NOEUD* n1=tri->get_noeud1();
192     MG_NOEUD* n2=tri->get_noeud2();
193     MG_NOEUD* n3=tri->get_noeud3();
194     double xyzproj[3];
195     double xyzprojuv[3];
196     MG_NOEUD *no1;
197     MG_NOEUD *no2;
198     MG_NOEUD *no3;
199     if (n1->get_nouveau_numero()<1)
200     {
201     double *xyz=n1->get_coord();
202     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
203     no1=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
204     mai->ajouter_mg_noeud(no1);
205     n1->change_nouveau_numero(no1->get_id());
206     }
207     else no1=mai->get_mg_noeudid(n1->get_nouveau_numero());
208     if (n2->get_nouveau_numero()<1)
209     {
210     double *xyz=n2->get_coord();
211     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
212     no2=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
213     mai->ajouter_mg_noeud(no2);
214     n2->change_nouveau_numero(no2->get_id());
215     }
216     else no2=mai->get_mg_noeudid(n2->get_nouveau_numero());
217     if (n3->get_nouveau_numero()<1)
218     {
219     double *xyz=n3->get_coord();
220     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
221     no3=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
222     mai->ajouter_mg_noeud(no3);
223     n3->change_nouveau_numero(no3->get_id());
224     }
225     else no3=mai->get_mg_noeudid(n3->get_nouveau_numero());
226     MG_TRIANGLE* trinv=insere_triangle_orientant(autreface,no1,no2,no3,sens);
227     tri->change_nouveau_numero(trinv->get_id());
228     }
229     }
230     char mess[255];
231     sprintf(mess," Maillage des autres aretes");
232     affiche(mess);
233     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst,lstbase,lstopp;
234     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
235     vol->get_topologie_sousjacente(&lst);
236 francois 881 for (int i=0;i<vol->get_nb_face_correspondante();i++)
237 francois 879 {
238 francois 881 MG_FACE* face1;
239     MG_FACE* face2;
240     vol->get_face_correspondante(i,&face1,&face2);
241     face1->get_topologie_sousjacente(&lstbase);
242 francois 879 face2->get_topologie_sousjacente(&lstopp);
243 francois 881 lstbase.ajouter(face1);
244 francois 879 lstopp.ajouter(face2);
245     }
246     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
247     if (ele->get_dimension()==1)
248     if (!lstbase.existe(ele))
249     if (!lstopp.existe(ele))
250     {
251     MG_SOMMET* som1=((MG_ARETE*)ele)->get_cosommet1()->get_sommet();
252     MG_SOMMET* som2=((MG_ARETE*)ele)->get_cosommet2()->get_sommet();
253     MG_NOEUD* no1;
254     MG_NOEUD* no2;
255     int num=0;
256     do
257     {
258     no1=(MG_NOEUD*)som1->get_lien_maillage()->get(num);
259     num++;
260     }
261     while (mai->get_mg_noeudid(no1->get_id())==NULL);
262     num=0;
263     do
264     {
265     no2=(MG_NOEUD*)som2->get_lien_maillage()->get(num);
266     num++;
267     }
268     while (mai->get_mg_noeudid(no2->get_id())==NULL);
269     int sens=0;
270     insere_segment_orientant((MG_ARETE*)ele,no1,no2,sens);
271     }
272     sprintf(mess," Maillage des autres faces");
273     affiche(mess);
274     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
275     if (ele->get_dimension()==2)
276     if (!lstbase.existe(ele))
277     if (!lstopp.existe(ele))
278     {
279     MG_FACE *facetmp=(MG_FACE*)ele;
280     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lstf;
281     facetmp->get_topologie_sousjacente(&lstf);
282     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it1,it2;
283     MG_ELEMENT_TOPOLOGIQUE* eletmp=lstf.premier_commun(lstbase,it1,it2);
284     while (eletmp->get_dimension()!=1)
285     {
286     eletmp=lstf.suivant_commun(lstbase,it1,it2);
287     }
288     MG_ARETE* arebase=(MG_ARETE*) eletmp;
289     int sens=0;
290     for (int i=0;i<arebase->get_lien_maillage()->get_nb();i++)
291     {
292     MG_SEGMENT* seg=(MG_SEGMENT*)arebase->get_lien_maillage()->get(i);
293     if (mai->get_mg_segmentid(seg->get_id())==NULL) continue;
294     MG_NOEUD *no1=seg->get_noeud1();
295     MG_NOEUD *no4=seg->get_noeud2();
296     MG_NOEUD *no2=mai->get_mg_noeudid(no1->get_nouveau_numero());
297     MG_NOEUD *no3=mai->get_mg_noeudid(no4->get_nouveau_numero());
298     insere_quadrangle_orientant(facetmp,no1,no2,no3,no4,sens);
299    
300     }
301     }
302     sprintf(mess," Maillage du volume");
303     affiche(mess);
304     for (MG_ELEMENT_TOPOLOGIQUE* ele=lstbase.get_premier(it);ele!=NULL;ele=lstbase.get_suivant(it))
305     if (ele->get_dimension()==2)
306     {
307     MG_FACE *facetmp=(MG_FACE*)ele;
308     for (int i=0;i<facetmp->get_lien_maillage()->get_nb();i++)
309     {
310     MG_TRIANGLE* tri=(MG_TRIANGLE*)facetmp->get_lien_maillage()->get(i);
311     if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
312     MG_NOEUD *no1=tri->get_noeud1();
313     MG_NOEUD *no2=tri->get_noeud2();
314     MG_NOEUD *no3=tri->get_noeud3();
315     MG_NOEUD *no4=mai->get_mg_noeudid(no1->get_nouveau_numero());
316     MG_NOEUD *no5=mai->get_mg_noeudid(no2->get_nouveau_numero());
317     MG_NOEUD *no6=mai->get_mg_noeudid(no3->get_nouveau_numero());
318     mai->ajouter_mg_penta(vol,no1,no2,no3,no4,no5,no6,MAGIC::ORIGINE::MAILLEUR_AUTO);
319     }
320     }
321 couturad 966 return OK;
322 francois 879 }
323    
324    
325     MG_NOEUD* MAILLEUR3D_COUCHE::projete_noeud_sur_arete(MG_NOEUD* n1, MG_FACE* autreface, MG_ARETE** areop,TPL_MAP_ENTITE<MG_ARETE*> &lstaare)
326     {
327     MG_GEOMETRIE_OUTILS ot;
328     double *xyz=n1->get_coord();
329     double xyzproj[3],xyzprojuv[3];
330     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
331     if (*areop==NULL)
332     {
333     double dist=1e300;
334     TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR ita2;
335     for (MG_ARETE* are2=lstaare.get_premier(ita2);are2!=NULL;are2=lstaare.get_suivant(ita2))
336     {
337     double t;
338     are2->inverser(t,xyzproj);
339     double xyztmp[3];
340     are2->evaluer(t,xyztmp);
341     OT_VECTEUR_3D v(xyzproj,xyztmp);
342     if (v.get_longueur2()<dist)
343     {
344     dist=v.get_longueur2();
345     *areop=are2;
346     }
347     }
348     }
349     double t;
350     (*areop)->inverser(t,xyzproj);
351     double newxyz[3];
352     (*areop)->evaluer(t,newxyz);
353     MG_NOEUD* no1=new MG_NOEUD(*areop,newxyz[0],newxyz[1],newxyz[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
354     mai->ajouter_mg_noeud(no1);
355     n1->change_nouveau_numero(no1->get_id());
356     return no1;
357     }
358    
359     MG_SEGMENT* MAILLEUR3D_COUCHE::insere_segment_orientant(MG_ARETE* are,MG_NOEUD* no1,MG_NOEUD* no2,int &sens)
360     {
361     if (sens==0)
362     {
363     double *xyz1=no1->get_coord();
364     double *xyz2=no2->get_coord();
365     double t;
366     are->inverser(t,xyz1);
367     double dxyz[3];
368     are->deriver(t,dxyz);
369     OT_VECTEUR_3D v1(xyz1,xyz2);
370     OT_VECTEUR_3D v2(dxyz);
371     v1.norme();
372     v2.norme();
373     if (v1*v2>0) sens=1; else sens=-1;
374     }
375     MG_SEGMENT* segnv;
376     if (sens==1) segnv=mai->ajouter_mg_segment(are,no1,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
377     else if (sens==-1) segnv=mai->ajouter_mg_segment(are,no2,no1,MAGIC::ORIGINE::MAILLEUR_AUTO);
378     return segnv;
379     }
380    
381    
382     MG_TRIANGLE* MAILLEUR3D_COUCHE::insere_triangle_orientant(MG_FACE* face,MG_NOEUD* no1,MG_NOEUD* no2,MG_NOEUD* no3,int &sens)
383     {
384     if (sens==0)
385     {
386     double *xyz1=no1->get_coord();
387     double *xyz2=no2->get_coord();
388     double *xyz3=no3->get_coord();
389     double uv[3];
390     face->inverser(uv,xyz1);
391     double nor[3];
392     face->calcul_normale_unitaire(uv,nor);
393     OT_VECTEUR_3D n(nor);
394     OT_VECTEUR_3D v1(xyz1,xyz3);
395     OT_VECTEUR_3D v2(xyz1,xyz2);
396     OT_VECTEUR_3D nn=v1&v2;
397     nn.norme();
398     if (n*nn>0) sens=1; else sens=-1;
399     }
400    
401 couturad 951
402     MG_NOEUD* nd1;
403     MG_NOEUD* nd2;
404     MG_NOEUD* nd3;
405     if(sens==1) {nd1=no1;nd2=no2;nd3=no3;}
406     else if(sens==-1) {nd1=no1;nd2=no3;nd3=no2;}
407     MG_TRIANGLE* trinv;
408     MG_SEGMENT* mgsegment1=mai->get_mg_segment(no1->get_id(),no2->get_id());
409     MG_SEGMENT* mgsegment2=mai->get_mg_segment(no2->get_id(),no3->get_id());
410     MG_SEGMENT* mgsegment3=mai->get_mg_segment(no3->get_id(),no1->get_id());
411     if (mgsegment1==NULL) mgsegment1=mai->ajouter_mg_segment(face,no1,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
412     if (mgsegment2==NULL) mgsegment2=mai->ajouter_mg_segment(face,no2,no3,MAGIC::ORIGINE::MAILLEUR_AUTO);
413     if (mgsegment3==NULL) mgsegment3=mai->ajouter_mg_segment(face,no3,no1,MAGIC::ORIGINE::MAILLEUR_AUTO);
414     trinv=new M3D_TRIANGLE(face,no1,no2,no3,mgsegment1,mgsegment2,mgsegment3,MAGIC::ORIGINE::MAILLEUR_AUTO);
415     int resultat=mai->ajouter_mg_triangle(trinv);
416     if (resultat==FAIL)
417     {
418     delete trinv;
419     return NULL;
420     }
421     return trinv;
422 francois 879 }
423    
424     MG_QUADRANGLE* MAILLEUR3D_COUCHE::insere_quadrangle_orientant(MG_FACE* face, MG_NOEUD* no1, MG_NOEUD* no2, MG_NOEUD* no3, MG_NOEUD* no4, int& sens)
425     {
426     if (sens==0)
427     {
428     double *xyz1=no1->get_coord();
429     double *xyz2=no2->get_coord();
430     double *xyz3=no3->get_coord();
431     double uv[3];
432     face->inverser(uv,xyz1);
433     double nor[3];
434     face->calcul_normale_unitaire(uv,nor);
435     OT_VECTEUR_3D n(nor);
436     OT_VECTEUR_3D v1(xyz1,xyz3);
437     OT_VECTEUR_3D v2(xyz1,xyz2);
438     OT_VECTEUR_3D nn=v1&v2;
439     nn.norme();
440     if (n*nn>0) sens=1; else sens=-1;
441     }
442     MG_QUADRANGLE* quadnv;
443     if (sens==1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no2,no3,no4,MAGIC::ORIGINE::MAILLEUR_AUTO);
444     else if (sens==-1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no4,no3,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
445     return quadnv;
446     }