ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_octal.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_octal.cpp
File size: 10200 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_octal.cpp
15     //####//
16     //####//------------------------------------------------------------
17     //####//------------------------------------------------------------
18     //####// COPYRIGHT 2000-2024
19     //####// jeu 13 jun 2024 11:58:55 EDT
20     //####//------------------------------------------------------------
21     //####//------------------------------------------------------------
22 francois 283
23    
24     #include "gestionversion.h"
25     #include "mailleur3d.h"
26    
27    
28 couturad 966 int MAILLEUR3D::maille(FCT_TAILLE *metri)
29 francois 283 {
30 francois 467 metrique=metri;
31     BOITE_3D boite=metri->get_boite_3D();
32     double xmin=boite.get_xmin();
33     double ymin=boite.get_ymin();
34     double zmin=boite.get_zmin();
35     double xmax=boite.get_xmax();
36     double ymax=boite.get_ymax();
37     double zmax=boite.get_zmax();
38     TPL_OCTREE_FCT<MG_NOEUD*,FCT_TAILLE > octree;
39 francois 283 octree.change_coefficent_multiplicateur(coef);
40 francois 467 octree.initialiser(*metri,xmin,ymin,zmin,xmax,ymax,zmax);
41 francois 283 octree.equilibre();
42     int nb_feuille=octree.get_nb_feuille();
43 couturad 951 std::map<int,MG_NOEUD*,std::less<unsigned long> > lst;
44 francois 283 for (int i=0;i<nb_feuille;i++)
45     {
46     for (int j=0;j<8;j++)
47     {
48     unsigned long keycode=octree.get_feuille_keycode(i,j);
49     if (lst[keycode]==NULL)
50     {
51     double x,y,z;
52     octree.get_xyzsommet_feuille(i,j,x,y,z);
53 francois 791 MG_NOEUD* noeud=new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::MAILLEUR_AUTO);
54 francois 283 mg_maillage->ajouter_mg_noeud(noeud);
55     lst[keycode]=noeud;
56     }
57     }
58     }
59     for (int i=0;i<nb_feuille;i++)
60     {
61     TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *feuille=octree.get_feuille(i);
62     double xyz[3];
63     feuille->boite.get_centre(xyz);
64 francois 791 MG_NOEUD* noeud=new MG_NOEUD(NULL,xyz[0],xyz[1],xyz[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
65 francois 283 mg_maillage->ajouter_mg_noeud(noeud);
66     int face[6]={0,0,0,0,0,0};
67     for (int j=0;j<6;j++)
68     {
69     //OUTIL_OCTREE oo;
70     TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *cell=octree.get_cellule_voisin(feuille,j);
71     if (cell!=NULL)
72     if (cell->feuille==0)
73     face[j]=1;
74     }
75     for (int j=0;j<6;j++)
76     {
77     OUTIL_OCTREE oo;
78     int arete[5]={0,0,0,0};
79     if (face[j]==1)
80     {
81     arete[0]=1;
82     arete[1]=1;
83     arete[2]=1;
84     arete[3]=1;
85     }
86     for (int k=0;k<4;k++)
87     {
88     if (arete[k]==0)
89     {
90     if (face[oo.faceadjacente(j,k)]==1)
91     arete[k]=1;
92     else
93     {
94     int numarete=oo.areteface(j,k);
95     TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *cell=octree.get_cellule_adjacent(feuille,numarete);
96     if (cell!=NULL)
97     if (cell->feuille==0) arete[k]=1;
98     }
99     }
100     }
101     arete[4]=arete[0]+arete[1]+arete[2]+arete[3];
102     if (arete[4]==0)
103     {
104     unsigned long key1=octree.get_feuille_keycode(i,oo.sommetface(j,0));
105     unsigned long key2=octree.get_feuille_keycode(i,oo.sommetface(j,1));
106     unsigned long key3=octree.get_feuille_keycode(i,oo.sommetface(j,2));
107     unsigned long key4=octree.get_feuille_keycode(i,oo.sommetface(j,3));
108     if ( (j==2) || (j==4) )
109     {
110     if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==1) ||(feuille->get_sontype()==6) ||(feuille->get_sontype()==7))
111     {
112     insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
113     insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
114     }
115     else
116     {
117     insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
118     insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
119     }
120     }
121     if ( (j==1) || (j==3) )
122     {
123     if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==2) ||(feuille->get_sontype()==5) ||(feuille->get_sontype()==7))
124     {
125     insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
126     insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
127     }
128     else
129     {
130     insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
131     insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
132     }
133     }
134     if ( (j==0) || (j==5) )
135     {
136     if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==4) ||(feuille->get_sontype()==7) ||(feuille->get_sontype()==3))
137     {
138     insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
139     insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
140     }
141     else
142     {
143     insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
144     insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
145     }
146     }
147     }
148     else
149     {
150     OUTIL_OCTREE oo;
151     double xcentre=0.,ycentre=0.,zcentre=0.;
152     double x,y,z;
153     octree.get_xyzsommet_feuille(i,oo.sommetface(j,0),x,y,z);
154     xcentre=xcentre+x;
155     ycentre=ycentre+y;
156     zcentre=zcentre+z;
157     octree.get_xyzsommet_feuille(i,oo.sommetface(j,1),x,y,z);
158     xcentre=xcentre+x;
159     ycentre=ycentre+y;
160     zcentre=zcentre+z;
161     octree.get_xyzsommet_feuille(i,oo.sommetface(j,2),x,y,z);
162     xcentre=xcentre+x;
163     ycentre=ycentre+y;
164     zcentre=zcentre+z;
165     octree.get_xyzsommet_feuille(i,oo.sommetface(j,3),x,y,z);
166     xcentre=xcentre+x;
167     ycentre=ycentre+y;
168     zcentre=zcentre+z;
169     xcentre=0.25*xcentre;
170     ycentre=0.25*ycentre;
171     zcentre=0.25*zcentre;
172     unsigned long key=octree.get_keycode(xcentre,ycentre,zcentre);
173     if (lst[key]==NULL)
174     {
175 francois 791 MG_NOEUD* noeud=new MG_NOEUD(NULL,xcentre,ycentre,zcentre,MAGIC::ORIGINE::MAILLEUR_AUTO);
176 francois 283 mg_maillage->ajouter_mg_noeud(noeud);
177     lst[key]=noeud;
178     }
179     MG_NOEUD* centroideface=lst[key];
180     for (int k=0;k<4;k++)
181     {
182     unsigned long key1=octree.get_feuille_keycode(i,oo.sommetarete(oo.areteface(j,k),0));
183     unsigned long key2=octree.get_feuille_keycode(i,oo.sommetarete(oo.areteface(j,k),1));
184     if (arete[k]==0)
185     {
186     insere_tetra(mg_maillage,lst[key1],lst[key2],centroideface,noeud);
187     }
188     else
189     {
190     double x1,y1,z1,x2,y2,z2;
191     octree.get_xyzsommet_feuille(i,oo.sommetarete(oo.areteface(j,k),0),x1,y1,z1);
192     octree.get_xyzsommet_feuille(i,oo.sommetarete(oo.areteface(j,k),1),x2,y2,z2);
193     unsigned long keymilieu=octree.get_keycode(0.5*(x1+x2),0.5*(y1+y2),0.5*(z1+z2));
194     insere_tetra(mg_maillage,lst[key1],lst[keymilieu],centroideface,noeud);
195     insere_tetra(mg_maillage,lst[keymilieu],lst[key2],centroideface,noeud);
196    
197     }
198     }
199     }
200    
201     }
202    
203    
204     }
205 couturad 966 return OK;
206 francois 283 }
207    
208    
209    
210     void MAILLEUR3D::insere_tetra(MG_MAILLAGE* mai,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
211     {
212     double q=OPERATEUR::qualite_tetra(noeud1->get_coord(),noeud2->get_coord(),noeud3->get_coord(),noeud4->get_coord());
213 francois 791 if (q>0.) mai->ajouter_mg_tetra(NULL,noeud1,noeud2,noeud3,noeud4,MAGIC::ORIGINE::MAILLEUR_AUTO);
214     else mai->ajouter_mg_tetra(NULL,noeud2,noeud1,noeud3,noeud4,MAGIC::ORIGINE::MAILLEUR_AUTO);
215 francois 283 }
216    
217    
218    
219     void MAILLEUR3D::change_coef(double val)
220     {
221     coef=val;
222     }
223    
224     void MAILLEUR3D::verifie_conformite_octale(MG_MAILLAGE* mai,MG_MAILLAGE* maisur)
225     {
226     int nbtri=mai->get_nb_mg_triangle();
227     for (int i=0;i<nbtri;i++)
228     {
229     MG_TRIANGLE* tri=mai->get_mg_triangle(i);
230     if (tri->get_lien_tetra()->get_nb()!=1) continue;
231     MG_NOEUD* noeud[3];
232     noeud[0]=tri->get_noeud1();
233     noeud[1]=tri->get_noeud2();
234     noeud[2]=tri->get_noeud3();
235 francois 791 MG_NOEUD* n1=new MG_NOEUD(NULL,noeud[0]->get_x(),noeud[0]->get_y(),noeud[0]->get_z(),MAGIC::ORIGINE::MAILLEUR_AUTO);
236     MG_NOEUD* n2=new MG_NOEUD(NULL,noeud[1]->get_x(),noeud[1]->get_y(),noeud[1]->get_z(),MAGIC::ORIGINE::MAILLEUR_AUTO);
237     MG_NOEUD* n3=new MG_NOEUD(NULL,noeud[2]->get_x(),noeud[2]->get_y(),noeud[2]->get_z(),MAGIC::ORIGINE::MAILLEUR_AUTO);
238 francois 283 maisur->ajouter_mg_noeud(n1);
239     maisur->ajouter_mg_noeud(n2);
240     maisur->ajouter_mg_noeud(n3);
241 francois 791 maisur->ajouter_mg_triangle(NULL,n1,n2,n3,MAGIC::ORIGINE::MAILLEUR_AUTO);
242 francois 283 }
243     }