1 |
francois |
78 |
//------------------------------------------------------------
|
2 |
|
|
//------------------------------------------------------------
|
3 |
|
|
// MAGiC
|
4 |
|
|
// Jean Christophe Cuilli�e et Vincent FRANCOIS
|
5 |
|
|
// D�artement de G�ie M�anique - UQTR
|
6 |
|
|
//------------------------------------------------------------
|
7 |
|
|
// Le projet MAGIC est un projet de recherche du d�artement
|
8 |
|
|
// de g�ie m�anique de l'Universit�du Qu�ec �
|
9 |
|
|
// Trois Rivi�es
|
10 |
|
|
// Les librairies ne peuvent �re utilis�s sans l'accord
|
11 |
|
|
// des auteurs (contact : francois@uqtr.ca)
|
12 |
|
|
//------------------------------------------------------------
|
13 |
|
|
//------------------------------------------------------------
|
14 |
|
|
//
|
15 |
|
|
// mailleur3d.cpp
|
16 |
|
|
//
|
17 |
|
|
//------------------------------------------------------------
|
18 |
|
|
//------------------------------------------------------------
|
19 |
|
|
// COPYRIGHT 2000
|
20 |
|
|
// Version du 02/03/2006 �11H23
|
21 |
|
|
//------------------------------------------------------------
|
22 |
|
|
//------------------------------------------------------------
|
23 |
|
|
|
24 |
|
|
|
25 |
|
|
#include "gestionversion.h"
|
26 |
|
|
#include "mailleur3d.h"
|
27 |
|
|
|
28 |
|
|
|
29 |
|
|
void MAILLEUR3D::maille(FCT_GENERATEUR_3D<4> *carte)
|
30 |
|
|
{
|
31 |
|
|
int nb_cellule=carte->get_nb_cellule();
|
32 |
|
|
double param[32];
|
33 |
|
|
carte->get_information(0,0,param);
|
34 |
|
|
double xmin=param[0]+0.005*(param[1]-param[0]);
|
35 |
|
|
double ymin=param[8]+0.005*(param[10]-param[8]);
|
36 |
|
|
double zmin=param[16]+0.005*(param[20]-param[16]);
|
37 |
|
|
carte->get_information(nb_cellule-1,0,param);
|
38 |
|
|
double xmax=param[1]-0.005*(param[1]-param[0]);
|
39 |
|
|
double ymax=param[10]-0.005*(param[10]-param[8]);
|
40 |
|
|
double zmax=param[20]-0.005*(param[20]-param[16]);
|
41 |
|
|
TPL_OCTREE_FCT<MG_NOEUD*,FCT_GENERATEUR_3D<4> > octree;
|
42 |
|
|
octree.change_coefficent_multiplicateur(coef);
|
43 |
|
|
octree.initialiser(*carte,xmin,ymin,zmin,xmax,ymax,zmax);
|
44 |
|
|
octree.equilibre();
|
45 |
|
|
int nb_feuille=octree.get_nb_feuille();
|
46 |
|
|
map<int,MG_NOEUD*,less<unsigned long> > lst;
|
47 |
|
|
for (int i=0;i<nb_feuille;i++)
|
48 |
|
|
{
|
49 |
|
|
for (int j=0;j<8;j++)
|
50 |
|
|
{
|
51 |
|
|
unsigned long keycode=octree.get_feuille_keycode(i,j);
|
52 |
|
|
if (lst[keycode]==NULL)
|
53 |
|
|
{
|
54 |
|
|
double x,y,z;
|
55 |
|
|
octree.get_xyzsommet_feuille(i,j,x,y,z);
|
56 |
|
|
MG_NOEUD* noeud=new MG_NOEUD(NULL,x,y,z,MAILLEUR_AUTO);
|
57 |
|
|
mg_maillage->ajouter_mg_noeud(noeud);
|
58 |
|
|
lst[keycode]=noeud;
|
59 |
|
|
}
|
60 |
|
|
}
|
61 |
|
|
}
|
62 |
|
|
for (int i=0;i<nb_feuille;i++)
|
63 |
|
|
{
|
64 |
|
|
TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *feuille=octree.get_feuille(i);
|
65 |
|
|
double xyz[3];
|
66 |
|
|
feuille->boite.get_centre(xyz);
|
67 |
|
|
MG_NOEUD* noeud=new MG_NOEUD(NULL,xyz[0],xyz[1],xyz[2],MAILLEUR_AUTO);
|
68 |
|
|
mg_maillage->ajouter_mg_noeud(noeud);
|
69 |
|
|
int face[6]={0,0,0,0,0,0};
|
70 |
|
|
for (int j=0;j<6;j++)
|
71 |
|
|
{
|
72 |
|
|
OUTIL_OCTREE oo;
|
73 |
|
|
TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *cell=octree.get_cellule_voisin(feuille,j);
|
74 |
|
|
if (cell!=NULL)
|
75 |
|
|
if (cell->feuille==0)
|
76 |
|
|
face[j]=1;
|
77 |
|
|
}
|
78 |
|
|
for (int j=0;j<6;j++)
|
79 |
|
|
{
|
80 |
|
|
OUTIL_OCTREE oo;
|
81 |
|
|
int arete[5]={0,0,0,0};
|
82 |
|
|
if (face[j]==1)
|
83 |
|
|
{
|
84 |
|
|
arete[0]=1;
|
85 |
|
|
arete[1]=1;
|
86 |
|
|
arete[2]=1;
|
87 |
|
|
arete[3]=1;
|
88 |
|
|
}
|
89 |
|
|
for (int k=0;k<4;k++)
|
90 |
|
|
{
|
91 |
|
|
if (arete[k]==0)
|
92 |
|
|
{
|
93 |
|
|
if (face[oo.faceadjacente(j,k)]==1)
|
94 |
|
|
arete[k]=1;
|
95 |
|
|
else
|
96 |
|
|
{
|
97 |
|
|
int numarete=oo.areteface(j,k);
|
98 |
|
|
TPL_CELLULE_OCTREE<MG_NOEUD*,MG_NOEUD*> *cell=octree.get_cellule_adjacent(feuille,numarete);
|
99 |
|
|
if (cell!=NULL)
|
100 |
|
|
if (cell->feuille==0) arete[k]=1;
|
101 |
|
|
}
|
102 |
|
|
}
|
103 |
|
|
}
|
104 |
|
|
arete[4]=arete[0]+arete[1]+arete[2]+arete[3];
|
105 |
|
|
if (arete[4]==0)
|
106 |
|
|
{
|
107 |
|
|
unsigned long key1=octree.get_feuille_keycode(i,oo.sommetface(j,0));
|
108 |
|
|
unsigned long key2=octree.get_feuille_keycode(i,oo.sommetface(j,1));
|
109 |
|
|
unsigned long key3=octree.get_feuille_keycode(i,oo.sommetface(j,2));
|
110 |
|
|
unsigned long key4=octree.get_feuille_keycode(i,oo.sommetface(j,3));
|
111 |
|
|
if ( (j==2) || (j==4) )
|
112 |
|
|
{
|
113 |
|
|
if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==1) ||(feuille->get_sontype()==6) ||(feuille->get_sontype()==7))
|
114 |
|
|
{
|
115 |
|
|
insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
|
116 |
|
|
insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
|
117 |
|
|
}
|
118 |
|
|
else
|
119 |
|
|
{
|
120 |
|
|
insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
|
121 |
|
|
insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
|
122 |
|
|
}
|
123 |
|
|
}
|
124 |
|
|
if ( (j==1) || (j==3) )
|
125 |
|
|
{
|
126 |
|
|
if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==2) ||(feuille->get_sontype()==5) ||(feuille->get_sontype()==7))
|
127 |
|
|
{
|
128 |
|
|
insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
|
129 |
|
|
insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
|
130 |
|
|
}
|
131 |
|
|
else
|
132 |
|
|
{
|
133 |
|
|
insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
|
134 |
|
|
insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
|
135 |
|
|
}
|
136 |
|
|
}
|
137 |
|
|
if ( (j==0) || (j==5) )
|
138 |
|
|
{
|
139 |
|
|
if ( (feuille->get_sontype()==0) ||(feuille->get_sontype()==4) ||(feuille->get_sontype()==7) ||(feuille->get_sontype()==3))
|
140 |
|
|
{
|
141 |
|
|
insere_tetra(mg_maillage,lst[key1],lst[key3],lst[key2],noeud);
|
142 |
|
|
insere_tetra(mg_maillage,lst[key1],lst[key4],lst[key3],noeud);
|
143 |
|
|
}
|
144 |
|
|
else
|
145 |
|
|
{
|
146 |
|
|
insere_tetra(mg_maillage,lst[key1],lst[key2],lst[key4],noeud);
|
147 |
|
|
insere_tetra(mg_maillage,lst[key2],lst[key3],lst[key4],noeud);
|
148 |
|
|
}
|
149 |
|
|
}
|
150 |
|
|
}
|
151 |
|
|
else
|
152 |
|
|
{
|
153 |
|
|
OUTIL_OCTREE oo;
|
154 |
|
|
double xcentre=0.,ycentre=0.,zcentre=0.;
|
155 |
|
|
double x,y,z;
|
156 |
|
|
octree.get_xyzsommet_feuille(i,oo.sommetface(j,0),x,y,z);
|
157 |
|
|
xcentre=xcentre+x;ycentre=ycentre+y;zcentre=zcentre+z;
|
158 |
|
|
octree.get_xyzsommet_feuille(i,oo.sommetface(j,1),x,y,z);
|
159 |
|
|
xcentre=xcentre+x;ycentre=ycentre+y;zcentre=zcentre+z;
|
160 |
|
|
octree.get_xyzsommet_feuille(i,oo.sommetface(j,2),x,y,z);
|
161 |
|
|
xcentre=xcentre+x;ycentre=ycentre+y;zcentre=zcentre+z;
|
162 |
|
|
octree.get_xyzsommet_feuille(i,oo.sommetface(j,3),x,y,z);
|
163 |
|
|
xcentre=xcentre+x;ycentre=ycentre+y;zcentre=zcentre+z;
|
164 |
|
|
xcentre=0.25*xcentre;ycentre=0.25*ycentre;zcentre=0.25*zcentre;
|
165 |
|
|
unsigned long key=octree.get_keycode(xcentre,ycentre,zcentre);
|
166 |
|
|
if (lst[key]==NULL)
|
167 |
|
|
{
|
168 |
|
|
MG_NOEUD* noeud=new MG_NOEUD(NULL,xcentre,ycentre,zcentre,MAILLEUR_AUTO);
|
169 |
|
|
mg_maillage->ajouter_mg_noeud(noeud);
|
170 |
|
|
lst[key]=noeud;
|
171 |
|
|
}
|
172 |
|
|
MG_NOEUD* centroideface=lst[key];
|
173 |
|
|
for (int k=0;k<4;k++)
|
174 |
|
|
{
|
175 |
|
|
unsigned long key1=octree.get_feuille_keycode(i,oo.sommetarete(oo.areteface(j,k),0));
|
176 |
|
|
unsigned long key2=octree.get_feuille_keycode(i,oo.sommetarete(oo.areteface(j,k),1));
|
177 |
|
|
if (arete[k]==0)
|
178 |
|
|
{
|
179 |
|
|
insere_tetra(mg_maillage,lst[key1],lst[key2],centroideface,noeud);
|
180 |
|
|
}
|
181 |
|
|
else
|
182 |
|
|
{
|
183 |
|
|
double x1,y1,z1,x2,y2,z2;
|
184 |
|
|
octree.get_xyzsommet_feuille(i,oo.sommetarete(oo.areteface(j,k),0),x1,y1,z1);
|
185 |
|
|
octree.get_xyzsommet_feuille(i,oo.sommetarete(oo.areteface(j,k),1),x2,y2,z2);
|
186 |
|
|
unsigned long keymilieu=octree.get_keycode(0.5*(x1+x2),0.5*(y1+y2),0.5*(z1+z2));
|
187 |
|
|
insere_tetra(mg_maillage,lst[key1],lst[keymilieu],centroideface,noeud);
|
188 |
|
|
insere_tetra(mg_maillage,lst[keymilieu],lst[key2],centroideface,noeud);
|
189 |
|
|
|
190 |
|
|
}
|
191 |
|
|
}
|
192 |
|
|
}
|
193 |
|
|
|
194 |
|
|
}
|
195 |
|
|
|
196 |
|
|
|
197 |
|
|
}
|
198 |
|
|
}
|
199 |
|
|
|
200 |
|
|
|
201 |
|
|
|
202 |
|
|
void MAILLEUR3D::insere_tetra(MG_MAILLAGE* mai,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
|
203 |
|
|
{
|
204 |
|
|
double q=OPERATEUR::qualite_tetra(noeud1->get_coord(),noeud2->get_coord(),noeud3->get_coord(),noeud4->get_coord());
|
205 |
|
|
if (q>0.) mai->ajouter_mg_tetra(NULL,noeud1,noeud2,noeud3,noeud4,MAILLEUR_AUTO);
|
206 |
|
|
else mai->ajouter_mg_tetra(NULL,noeud2,noeud1,noeud3,noeud4,MAILLEUR_AUTO);
|
207 |
|
|
}
|
208 |
|
|
|
209 |
|
|
|
210 |
|
|
|
211 |
|
|
void MAILLEUR3D::change_coef(double val)
|
212 |
|
|
{
|
213 |
|
|
coef=val;
|
214 |
|
|
}
|
215 |
|
|
|
216 |
|
|
void MAILLEUR3D::verifie_conformite_octale(MG_MAILLAGE* mai,MG_MAILLAGE* maisur)
|
217 |
|
|
{
|
218 |
|
|
int nbtri=mai->get_nb_mg_triangle();
|
219 |
|
|
for (int i=0;i<nbtri;i++)
|
220 |
|
|
{
|
221 |
|
|
MG_TRIANGLE* tri=mai->get_mg_triangle(i);
|
222 |
|
|
if (tri->get_lien_tetra()->get_nb()!=1) continue;
|
223 |
|
|
MG_NOEUD* noeud[3];
|
224 |
|
|
noeud[0]=tri->get_noeud1();
|
225 |
|
|
noeud[1]=tri->get_noeud2();
|
226 |
|
|
noeud[2]=tri->get_noeud3();
|
227 |
|
|
MG_NOEUD* n1=new MG_NOEUD(NULL,noeud[0]->get_x(),noeud[0]->get_y(),noeud[0]->get_z(),MAILLEUR_AUTO);
|
228 |
|
|
MG_NOEUD* n2=new MG_NOEUD(NULL,noeud[1]->get_x(),noeud[1]->get_y(),noeud[1]->get_z(),MAILLEUR_AUTO);
|
229 |
|
|
MG_NOEUD* n3=new MG_NOEUD(NULL,noeud[2]->get_x(),noeud[2]->get_y(),noeud[2]->get_z(),MAILLEUR_AUTO);
|
230 |
|
|
maisur->ajouter_mg_noeud(n1);
|
231 |
|
|
maisur->ajouter_mg_noeud(n2);
|
232 |
|
|
maisur->ajouter_mg_noeud(n3);
|
233 |
|
|
maisur->ajouter_mg_triangle(NULL,n1,n2,n3,MAILLEUR_AUTO);
|
234 |
|
|
}
|
235 |
|
|
}
|