1 |
//####//------------------------------------------------------------ |
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 |
//####// mailleur_delaunay.cpp |
15 |
//####// |
16 |
//####//------------------------------------------------------------ |
17 |
//####//------------------------------------------------------------ |
18 |
//####// COPYRIGHT 2000-2024 |
19 |
//####// jeu 13 jun 2024 11:58:55 EDT |
20 |
//####//------------------------------------------------------------ |
21 |
//####//------------------------------------------------------------ |
22 |
|
23 |
|
24 |
#include "gestionversion.h"
|
25 |
#include "mailleur_delaunay.h"
|
26 |
#include "mailleur3d_optimisation.h"
|
27 |
#include "dly_noeud.h"
|
28 |
#include "dly_tetra.h"
|
29 |
#include "dly_triangle.h"
|
30 |
#include "dly_segment.h"
|
31 |
#include "mg_maillage.h"
|
32 |
#include "robustpredicates.hxx"
|
33 |
#include <algorithm>
|
34 |
#include <math.h>
|
35 |
#include "mg_gestionnaire.h"
|
36 |
#include "ot_cpu.h"
|
37 |
#include "m3d_noeud.h"
|
38 |
#include "m3d_tetra.h"
|
39 |
|
40 |
|
41 |
|
42 |
MAILLEUR_DELAUNAY::MAILLEUR_DELAUNAY(MG_MAILLAGE* m,FCT_TAILLE *cartetmp,double crit_arret,class OT_CPU* comp):MAILLEUR(comp),carte(cartetmp),mai(m),critere_arret(crit_arret),niveau_optimisation(2),typemailleur(DELAUNAYCARTE)
|
43 |
{
|
44 |
robustPredicates::exactinit();
|
45 |
}
|
46 |
|
47 |
MAILLEUR_DELAUNAY::MAILLEUR_DELAUNAY(MG_MAILLAGE* m,BOITE_3D boiteext,class OT_CPU* comp):MAILLEUR(comp),boiteexterieur(boiteext),mai(m),niveau_optimisation(2),typemailleur(DELAUNAYLISTENOEUD)
|
48 |
{
|
49 |
robustPredicates::exactinit();
|
50 |
carte=NULL;
|
51 |
}
|
52 |
|
53 |
MAILLEUR_DELAUNAY::~MAILLEUR_DELAUNAY()
|
54 |
{
|
55 |
for (int i=0;i<tabnoeud.size();i++)
|
56 |
delete tabnoeud[i];
|
57 |
for (int i=0;i<tabtri.size();i++)
|
58 |
delete tabtri[i];
|
59 |
for (int i=0;i<tabtet.size();i++)
|
60 |
delete tabtet[i];
|
61 |
}
|
62 |
|
63 |
int MAILLEUR_DELAUNAY::maille(class MG_GROUPE_TOPOLOGIQUE* mggt)
|
64 |
{
|
65 |
affiche((char*)"Initialisation Delaunay");
|
66 |
initialise_maillage();
|
67 |
if (compteur!=NULL) compteur->ajouter_etape("Initialisation maillage");
|
68 |
|
69 |
affiche((char*)"Maillage");
|
70 |
raffine_maillage();
|
71 |
if (compteur!=NULL) compteur->ajouter_etape("Insertion de points");
|
72 |
|
73 |
affiche((char*)"Création du maillage final");
|
74 |
transfert_maillage(&tabnoeud,NULL,&tabtet);
|
75 |
if (compteur!=NULL) compteur->ajouter_etape("Création du maillage");
|
76 |
|
77 |
|
78 |
affiche((char*)"Optimisation de maillage");
|
79 |
MAILLEUR3D_OPTIMISATION opt(mai,niveau_optimisation);
|
80 |
if (affichageactif) opt.active_affichage(affiche2);
|
81 |
opt.optimise(NULL);
|
82 |
if (compteur!=NULL) compteur->ajouter_etape("Optimisation du maillage");
|
83 |
affiche((char*)"Fin Delaunay");
|
84 |
return OK;
|
85 |
}
|
86 |
|
87 |
void MAILLEUR_DELAUNAY::change_niveau_optimisation(int num)
|
88 |
{
|
89 |
niveau_optimisation=num;
|
90 |
}
|
91 |
|
92 |
void MAILLEUR_DELAUNAY::ajouter_noeud(double &x, double &y, double &z,double epsbordure)
|
93 |
{
|
94 |
|
95 |
|
96 |
xnoeud.push_back(x);
|
97 |
ynoeud.push_back(y);
|
98 |
znoeud.push_back(z);
|
99 |
}
|
100 |
|
101 |
void MAILLEUR_DELAUNAY::insere_noeud_delaunay(DLY_TETRA* tet,double x,double y,double z)
|
102 |
{
|
103 |
DLY_TETRA* tetbase=get_tetra(tet,x,y,z);
|
104 |
std::vector<DLY_TETRA*> tetdetruit;
|
105 |
std::vector<DLY_TETRA*> tetcree;
|
106 |
std::vector<DLY_TRIANGLE*> basetri;
|
107 |
ajoute_tetra_cavite(tetbase,tetdetruit,basetri);
|
108 |
for (int i=0;i<tetdetruit.size();i++)
|
109 |
{
|
110 |
DLY_TETRA* tettmp=tetdetruit[i];
|
111 |
if (tettmp->get_voisin1()!=NULL)
|
112 |
{
|
113 |
std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->get_voisin1());
|
114 |
if (itv2==tetdetruit.end())
|
115 |
if (tettmp->get_voisin1()->point_dans_le_tetra(x,y,z)!=0)
|
116 |
ajoute_tetra_cavite(tettmp->get_voisin1(),tetdetruit,basetri);
|
117 |
}
|
118 |
if (tettmp->get_voisin2()!=NULL)
|
119 |
{
|
120 |
std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->get_voisin2());
|
121 |
if (itv2==tetdetruit.end())
|
122 |
if (tettmp->get_voisin2()->point_dans_le_tetra(x,y,z)!=0)
|
123 |
ajoute_tetra_cavite(tettmp->get_voisin2(),tetdetruit,basetri);
|
124 |
}
|
125 |
if (tettmp->get_voisin3()!=NULL)
|
126 |
{
|
127 |
std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->get_voisin3());
|
128 |
if (itv2==tetdetruit.end())
|
129 |
if (tettmp->get_voisin3()->point_dans_le_tetra(x,y,z)!=0)
|
130 |
ajoute_tetra_cavite(tettmp->get_voisin3(),tetdetruit,basetri);
|
131 |
}
|
132 |
if (tettmp->get_voisin4()!=NULL)
|
133 |
{
|
134 |
std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->get_voisin4());
|
135 |
if (itv2==tetdetruit.end())
|
136 |
if (tettmp->get_voisin4()->point_dans_le_tetra(x,y,z)!=0)
|
137 |
ajoute_tetra_cavite(tettmp->get_voisin4(),tetdetruit,basetri);
|
138 |
}
|
139 |
}
|
140 |
int nbtetrabase=tetdetruit.size();
|
141 |
for (int i=0;i<tetdetruit.size();i++)
|
142 |
{
|
143 |
DLY_TETRA* tettmp=tetdetruit[i];
|
144 |
if (tettmp->get_voisin1()!=NULL)
|
145 |
{
|
146 |
std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->get_voisin1());
|
147 |
if (itv2==tetdetruit.end())
|
148 |
if (tettmp->get_voisin1()->point_dans_la_sphere(x,y,z)!=0)
|
149 |
ajoute_tetra_cavite(tettmp->get_voisin1(),tetdetruit,basetri);
|
150 |
}
|
151 |
if (tettmp->get_voisin2()!=NULL)
|
152 |
{
|
153 |
std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->get_voisin2());
|
154 |
if (itv2==tetdetruit.end())
|
155 |
if (tettmp->get_voisin2()->point_dans_la_sphere(x,y,z)!=0)
|
156 |
ajoute_tetra_cavite(tettmp->get_voisin2(),tetdetruit,basetri);
|
157 |
}
|
158 |
if (tettmp->get_voisin3()!=NULL)
|
159 |
{
|
160 |
std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->get_voisin3());
|
161 |
if (itv2==tetdetruit.end())
|
162 |
if (tettmp->get_voisin3()->point_dans_la_sphere(x,y,z)!=0)
|
163 |
ajoute_tetra_cavite(tettmp->get_voisin3(),tetdetruit,basetri);
|
164 |
}
|
165 |
if (tettmp->get_voisin4()!=NULL)
|
166 |
{
|
167 |
std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->get_voisin4());
|
168 |
if (itv2==tetdetruit.end())
|
169 |
if (tettmp->get_voisin4()->point_dans_la_sphere(x,y,z)!=0)
|
170 |
ajoute_tetra_cavite(tettmp->get_voisin4(),tetdetruit,basetri);
|
171 |
}
|
172 |
}
|
173 |
|
174 |
|
175 |
int res=0;
|
176 |
do
|
177 |
{
|
178 |
res=modifie_cavite(tetdetruit,basetri,nbtetrabase,x,y,z);
|
179 |
}
|
180 |
while (res==0);
|
181 |
|
182 |
|
183 |
|
184 |
|
185 |
for (int i=0;i<tetdetruit.size();i++)
|
186 |
{
|
187 |
/*std::multimap<double, DLY_TETRA*, std::greater<double> >::iterator it2=front.find(tetdetruit[i]->get_critere_subdivision());
|
188 |
while ((*it2).second!=tetdetruit[i])
|
189 |
it2++;
|
190 |
front.erase(it2);*/
|
191 |
retirer_front(tetdetruit[i]->get_segment1());
|
192 |
retirer_front(tetdetruit[i]->get_segment2());
|
193 |
retirer_front(tetdetruit[i]->get_segment3());
|
194 |
retirer_front(tetdetruit[i]->get_segment4());
|
195 |
retirer_front(tetdetruit[i]->get_segment5());
|
196 |
retirer_front(tetdetruit[i]->get_segment6());
|
197 |
|
198 |
}
|
199 |
DLY_NOEUD* no=new DLY_NOEUD(tabnoeud.size(),x,y,z);
|
200 |
tabnoeud.push_back(no);
|
201 |
for (int i=0;i<basetri.size();i++)
|
202 |
{
|
203 |
int frontiere=basetri[i]->est_frontiere();
|
204 |
int coplanaire=basetri[i]->est_coplanaire(no->get_x(),no->get_y(),no->get_z());
|
205 |
if ((frontiere==0) || ((frontiere==1) && (coplanaire==0)))
|
206 |
{
|
207 |
DLY_TETRA* tetnv=cree_tetra(basetri[i]->get_noeud1(),basetri[i]->get_noeud2(),basetri[i]->get_noeud3(),no);
|
208 |
tetcree.push_back(tetnv);
|
209 |
}
|
210 |
}
|
211 |
for (int i=0;i<tetdetruit.size();i++)
|
212 |
tetdetruit[i]->ajoute_fils(tetcree);
|
213 |
for (int i=0;i<tetcree.size();i++)
|
214 |
{
|
215 |
mise_a_jour_voisin(tetcree[i]);
|
216 |
if (tetcree[i]->get_voisin1()!=NULL) mise_a_jour_voisin(tetcree[i]->get_voisin1());
|
217 |
if (tetcree[i]->get_voisin2()!=NULL) mise_a_jour_voisin(tetcree[i]->get_voisin2());
|
218 |
if (tetcree[i]->get_voisin3()!=NULL) mise_a_jour_voisin(tetcree[i]->get_voisin3());
|
219 |
if (tetcree[i]->get_voisin4()!=NULL) mise_a_jour_voisin(tetcree[i]->get_voisin4());
|
220 |
}
|
221 |
}
|
222 |
|
223 |
|
224 |
void MAILLEUR_DELAUNAY::raffine_maillage(void)
|
225 |
{
|
226 |
if (typemailleur==DELAUNAYCARTE)
|
227 |
while ((*(front_trie.begin())).first>critere_arret)
|
228 |
//for (int jj=0;jj<10000;jj++)
|
229 |
{
|
230 |
std::multimap<double, DLY_SEGMENT*, std::greater<double> >::iterator it=front_trie.begin();
|
231 |
//DLY_TETRA* tet=(*it).second;
|
232 |
DLY_SEGMENT* seg=(*it).second;
|
233 |
DLY_TETRA* tet=seg->get_tetra_feuille();
|
234 |
std::vector<double> lstptdecoup;
|
235 |
seg->decoupe_noeud(lstptdecoup);
|
236 |
int nbptdecoup=lstptdecoup.size()/3;
|
237 |
for (int j=0;j<nbptdecoup;j++)
|
238 |
{
|
239 |
double x=lstptdecoup[3*j];
|
240 |
double y=lstptdecoup[3*j+1];
|
241 |
double z=lstptdecoup[3*j+2];
|
242 |
insere_noeud_delaunay(tet,x,y,z);
|
243 |
|
244 |
|
245 |
double volold=0.;
|
246 |
double volnew=0.;
|
247 |
/*for (int i=0;i<tetdetruit.size();i++)
|
248 |
volold=volold+tetdetruit[i]->calcul_volume(NULL,0);
|
249 |
for (int i=0;i<tetcree.size();i++)
|
250 |
volnew=volnew+tetcree[i]->calcul_volume(NULL,0);
|
251 |
if (fabs(volold-volnew)>0.000000000001*volold)
|
252 |
//std::cout << volold << " remplacé par " << volnew << " Étape " << jj << " " << j << std::endl;
|
253 |
*/
|
254 |
|
255 |
/* for (int i=0;i<tabtet.size();i++)
|
256 |
{
|
257 |
DLY_TETRA* tet=tabtet[i];
|
258 |
if (tet->get_feuille()==0) continue;
|
259 |
if (tet->get_voisin1()!=NULL)
|
260 |
if (tet->get_voisin1()->get_feuille()==0)
|
261 |
{
|
262 |
std::cout << "bug1 " << jj << " "<< j<< std::endl;
|
263 |
return;
|
264 |
}
|
265 |
if (tet->get_voisin2()!=NULL)
|
266 |
if (tet->get_voisin2()->get_feuille()==0)
|
267 |
{
|
268 |
std::cout << "bug2 " << jj << " "<< j<< std::endl;
|
269 |
return;
|
270 |
}
|
271 |
if (tet->get_voisin3()!=NULL)
|
272 |
if (tet->get_voisin3()->get_feuille()==0)
|
273 |
{
|
274 |
std::cout << "bug3 "<< jj << " "<< j << std::endl;
|
275 |
return;
|
276 |
}
|
277 |
if (tet->get_voisin4()!=NULL)
|
278 |
if (tet->get_voisin4()->get_feuille()==0)
|
279 |
{
|
280 |
std::cout << "bug4 "<< jj << " "<< j << std::endl;
|
281 |
return;
|
282 |
}
|
283 |
|
284 |
}*/
|
285 |
/* mai=new MG_MAILLAGE(NULL);
|
286 |
MG_GESTIONNAIRE g;
|
287 |
g.ajouter_mg_maillage(mai);
|
288 |
transfert_maillage(&tabnoeud,NULL,&tabtet);
|
289 |
g.enregistrer("test.magic");*/
|
290 |
|
291 |
}
|
292 |
}
|
293 |
|
294 |
if (typemailleur==DELAUNAYLISTENOEUD)
|
295 |
for (int i=0;i<xnoeud.size();i++)
|
296 |
insere_noeud_delaunay(NULL,xnoeud[i],ynoeud[i],znoeud[i]);
|
297 |
}
|
298 |
|
299 |
void MAILLEUR_DELAUNAY::ajouter_front(double crit,DLY_SEGMENT* seg)
|
300 |
{
|
301 |
if (crit>critere_arret)
|
302 |
{
|
303 |
std::pair<const unsigned long long,DLY_SEGMENT*> tmp((const unsigned long long)seg,seg);
|
304 |
std::pair<std::map<const unsigned long long,DLY_SEGMENT*>::iterator,bool> res=front.insert(tmp);
|
305 |
if (res.second==true)
|
306 |
{
|
307 |
seg->change_critere(crit);
|
308 |
std::pair<double,DLY_SEGMENT*> tmp2(crit,seg);
|
309 |
front_trie.insert(tmp2);
|
310 |
}
|
311 |
}
|
312 |
}
|
313 |
void MAILLEUR_DELAUNAY::retirer_front(DLY_SEGMENT* seg)
|
314 |
{
|
315 |
std::map<const unsigned long long,DLY_SEGMENT*>::iterator it=front.find((const unsigned long long)seg);
|
316 |
if (it==front.end()) return;
|
317 |
front.erase(it);
|
318 |
std::multimap<double,DLY_SEGMENT*,std::greater<double> >::iterator it2=front_trie.find(seg->get_critere());
|
319 |
while ((*it2).second!=seg)
|
320 |
it2++;
|
321 |
front_trie.erase(it2);
|
322 |
}
|
323 |
int MAILLEUR_DELAUNAY::modifie_cavite(std::vector<DLY_TETRA*> &cavite,std::vector<DLY_TRIANGLE*> &basetri,int nbbase,double x, double y,double z)
|
324 |
{
|
325 |
std::map<unsigned long long,DLY_TETRA*> tetasupprimercavite;
|
326 |
for (int i=0;i<basetri.size();i++)
|
327 |
{
|
328 |
DLY_TRIANGLE* tri=basetri[i];
|
329 |
DLY_TETRA* inte=NULL;
|
330 |
DLY_TETRA* exte=NULL;
|
331 |
for (int j=0;j<tri->get_nb_tetra();j++)
|
332 |
{
|
333 |
DLY_TETRA* tet=tri->get_tetra(j);
|
334 |
if (tet->get_feuille()==1)
|
335 |
{
|
336 |
std::vector<DLY_TETRA*>::iterator it=find(cavite.begin(),cavite.end(),tet);
|
337 |
if (it==cavite.end()) exte=tet;
|
338 |
else inte=tet;
|
339 |
}
|
340 |
}
|
341 |
double nor[3];
|
342 |
int base=0;
|
343 |
for (int j=0;j<nbbase;j++)
|
344 |
if (inte==cavite[j]) base=1;
|
345 |
if (base==1) continue;
|
346 |
if (inte->get_triangle1()==tri) inte->get_normal1(nor);
|
347 |
if (inte->get_triangle2()==tri) inte->get_normal2(nor);
|
348 |
if (inte->get_triangle3()==tri) inte->get_normal3(nor);
|
349 |
if (inte->get_triangle4()==tri) inte->get_normal4(nor);
|
350 |
nor[0]=-nor[0];
|
351 |
nor[1]=-nor[1];
|
352 |
nor[2]=-nor[2];
|
353 |
double xyzo[3];
|
354 |
tri->get_noeud1()->get_coord(xyzo);
|
355 |
OT_VECTEUR_3D vecdir(x-xyzo[0],y-xyzo[1],z-xyzo[2]);
|
356 |
OT_VECTEUR_3D normal(nor);
|
357 |
vecdir.norme();
|
358 |
double ps=vecdir*normal;
|
359 |
if (ps<0.000000001)
|
360 |
{
|
361 |
tri->est_frontiere();
|
362 |
//retire_tetra_cavite(inte,cavite,basetri);
|
363 |
unsigned long long adresse=(unsigned long long)inte;
|
364 |
tetasupprimercavite.insert(std::pair<unsigned long long,DLY_TETRA*>(adresse,inte));
|
365 |
|
366 |
}
|
367 |
}
|
368 |
int nbtetasupprimer=tetasupprimercavite.size();
|
369 |
if (nbtetasupprimer==0) return 1;
|
370 |
for (std::map<unsigned long long,DLY_TETRA*>::iterator it=tetasupprimercavite.begin();it!=tetasupprimercavite.end();it++)
|
371 |
retire_tetra_cavite((*it).second,cavite,basetri);
|
372 |
|
373 |
return 0;
|
374 |
}
|
375 |
|
376 |
|
377 |
void MAILLEUR_DELAUNAY::retire_tetra_cavite(DLY_TETRA* tet,std::vector<DLY_TETRA*> &cavite,std::vector<DLY_TRIANGLE*> &basetri)
|
378 |
{
|
379 |
std::vector<DLY_TETRA*>::iterator it=find(cavite.begin(),cavite.end(),tet);
|
380 |
cavite.erase(it);
|
381 |
std::vector<DLY_TRIANGLE*>::iterator itv=find(basetri.begin(),basetri.end(),tet->get_triangle1());
|
382 |
if (itv==basetri.end()) basetri.push_back(tet->get_triangle1());
|
383 |
else basetri.erase(itv);
|
384 |
itv=find(basetri.begin(),basetri.end(),tet->get_triangle2());
|
385 |
if (itv==basetri.end()) basetri.push_back(tet->get_triangle2());
|
386 |
else basetri.erase(itv);
|
387 |
itv=find(basetri.begin(),basetri.end(),tet->get_triangle3());
|
388 |
if (itv==basetri.end()) basetri.push_back(tet->get_triangle3());
|
389 |
else basetri.erase(itv);
|
390 |
itv=find(basetri.begin(),basetri.end(),tet->get_triangle4());
|
391 |
if (itv==basetri.end()) basetri.push_back(tet->get_triangle4());
|
392 |
else basetri.erase(itv);
|
393 |
}
|
394 |
|
395 |
void MAILLEUR_DELAUNAY::ajoute_tetra_cavite(DLY_TETRA* tet,std::vector<DLY_TETRA*> &cavite,std::vector<DLY_TRIANGLE*> &basetri)
|
396 |
{
|
397 |
cavite.push_back(tet);
|
398 |
std::vector<DLY_TRIANGLE*>::iterator itv=find(basetri.begin(),basetri.end(),tet->get_triangle1());
|
399 |
if (itv==basetri.end()) basetri.push_back(tet->get_triangle1());
|
400 |
else basetri.erase(itv);
|
401 |
itv=find(basetri.begin(),basetri.end(),tet->get_triangle2());
|
402 |
if (itv==basetri.end()) basetri.push_back(tet->get_triangle2());
|
403 |
else basetri.erase(itv);
|
404 |
itv=find(basetri.begin(),basetri.end(),tet->get_triangle3());
|
405 |
if (itv==basetri.end()) basetri.push_back(tet->get_triangle3());
|
406 |
else basetri.erase(itv);
|
407 |
itv=find(basetri.begin(),basetri.end(),tet->get_triangle4());
|
408 |
if (itv==basetri.end()) basetri.push_back(tet->get_triangle4());
|
409 |
else basetri.erase(itv);
|
410 |
}
|
411 |
|
412 |
void MAILLEUR_DELAUNAY::initialise_maillage(void)
|
413 |
{
|
414 |
BOITE_3D boite;
|
415 |
if (typemailleur==DELAUNAYCARTE)
|
416 |
{
|
417 |
boite=carte->get_boite_3D();
|
418 |
boite.change_grosseur(0.9999999999999);
|
419 |
}
|
420 |
if (typemailleur==DELAUNAYLISTENOEUD)
|
421 |
{
|
422 |
boite=boiteexterieur;
|
423 |
}
|
424 |
double xmin=boite.get_xmin();
|
425 |
double ymin=boite.get_ymin();
|
426 |
double zmin=boite.get_zmin();
|
427 |
double xmax=boite.get_xmax();
|
428 |
double ymax=boite.get_ymax();
|
429 |
double zmax=boite.get_zmax();
|
430 |
DLY_NOEUD* no1=new DLY_NOEUD(tabnoeud.size(),xmin,ymin,zmin);
|
431 |
tabnoeud.push_back(no1);
|
432 |
DLY_NOEUD* no2=new DLY_NOEUD(tabnoeud.size(),xmin,ymax,zmin);
|
433 |
tabnoeud.push_back(no2);
|
434 |
DLY_NOEUD* no3=new DLY_NOEUD(tabnoeud.size(),xmax,ymax,zmin);
|
435 |
tabnoeud.push_back(no3);
|
436 |
DLY_NOEUD* no4=new DLY_NOEUD(tabnoeud.size(),xmax,ymin,zmin);
|
437 |
tabnoeud.push_back(no4);
|
438 |
DLY_NOEUD* no5=new DLY_NOEUD(tabnoeud.size(),xmin,ymin,zmax);
|
439 |
tabnoeud.push_back(no5);
|
440 |
DLY_NOEUD* no6=new DLY_NOEUD(tabnoeud.size(),xmin,ymax,zmax);
|
441 |
tabnoeud.push_back(no6);
|
442 |
DLY_NOEUD* no7=new DLY_NOEUD(tabnoeud.size(),xmax,ymax,zmax);
|
443 |
tabnoeud.push_back(no7);
|
444 |
DLY_NOEUD* no8=new DLY_NOEUD(tabnoeud.size(),xmax,ymin,zmax);
|
445 |
tabnoeud.push_back(no8);
|
446 |
DLY_TETRA* tet1=cree_tetra(no2,no1,no3,no6);
|
447 |
DLY_TETRA* tet2=cree_tetra(no3,no1,no4,no5);
|
448 |
DLY_TETRA* tet3=cree_tetra(no3,no1,no5,no6);
|
449 |
DLY_TETRA* tet4=cree_tetra(no8,no5,no7,no4);
|
450 |
DLY_TETRA* tet5=cree_tetra(no7,no5,no6,no3);
|
451 |
DLY_TETRA* tet6=cree_tetra(no4,no3,no5,no7);
|
452 |
mise_a_jour_voisin(tet1);
|
453 |
mise_a_jour_voisin(tet2);
|
454 |
mise_a_jour_voisin(tet3);
|
455 |
mise_a_jour_voisin(tet4);
|
456 |
mise_a_jour_voisin(tet5);
|
457 |
mise_a_jour_voisin(tet6);
|
458 |
char message[255];
|
459 |
sprintf(message," Volume espace : %lf",(xmax-xmin)*(ymax-ymin)*(zmax-zmin));
|
460 |
if (affichageactif) affiche(message);
|
461 |
}
|
462 |
void MAILLEUR_DELAUNAY::mise_a_jour_voisin(DLY_TETRA* tet)
|
463 |
{
|
464 |
int nb=tet->get_triangle1()->get_nb_tetra();
|
465 |
for (int i=0;i<nb;i++)
|
466 |
{
|
467 |
DLY_TETRA* tetmp=tet->get_triangle1()->get_tetra(i);
|
468 |
if (tetmp->get_feuille()==1)
|
469 |
if (tetmp!=tet) tet->change_voisin1(tetmp);
|
470 |
}
|
471 |
nb=tet->get_triangle2()->get_nb_tetra();
|
472 |
for (int i=0;i<nb;i++)
|
473 |
{
|
474 |
DLY_TETRA* tetmp=tet->get_triangle2()->get_tetra(i);
|
475 |
if (tetmp->get_feuille()==1)
|
476 |
if (tetmp!=tet) tet->change_voisin2(tetmp);
|
477 |
}
|
478 |
nb=tet->get_triangle3()->get_nb_tetra();
|
479 |
for (int i=0;i<nb;i++)
|
480 |
{
|
481 |
DLY_TETRA* tetmp=tet->get_triangle3()->get_tetra(i);
|
482 |
if (tetmp->get_feuille()==1)
|
483 |
if (tetmp!=tet) tet->change_voisin3(tetmp);
|
484 |
}
|
485 |
nb=tet->get_triangle4()->get_nb_tetra();
|
486 |
for (int i=0;i<nb;i++)
|
487 |
{
|
488 |
DLY_TETRA* tetmp=tet->get_triangle4()->get_tetra(i);
|
489 |
if (tetmp->get_feuille()==1)
|
490 |
if (tetmp!=tet) tet->change_voisin4(tetmp);
|
491 |
}
|
492 |
}
|
493 |
|
494 |
|
495 |
DLY_TETRA* MAILLEUR_DELAUNAY::cree_tetra(DLY_NOEUD* n1,DLY_NOEUD* n2,DLY_NOEUD* n3,DLY_NOEUD* n4)
|
496 |
{
|
497 |
double xyz1[3],xyz2[3],xyz3[3],xyz4[3];
|
498 |
n1->get_coord(xyz1);
|
499 |
n2->get_coord(xyz2);
|
500 |
n3->get_coord(xyz3);
|
501 |
n4->get_coord(xyz4);
|
502 |
double qual=OPERATEUR::qualite_tetra(xyz1,xyz2,xyz3,xyz4);
|
503 |
DLY_TETRA* tet;
|
504 |
if (!(qual>0.))
|
505 |
{
|
506 |
DLY_NOEUD* ntmp=n1;
|
507 |
n1=n2;
|
508 |
n2=ntmp;
|
509 |
}
|
510 |
tet=new DLY_TETRA(n1,n2,n3,n4,fabs(qual));
|
511 |
tabtet.push_back(tet);
|
512 |
tet->change_triangle1(get_triangle(n1,n2,n3));
|
513 |
tet->change_triangle2(get_triangle(n1,n2,n4));
|
514 |
tet->change_triangle3(get_triangle(n1,n3,n4));
|
515 |
tet->change_triangle4(get_triangle(n2,n3,n4));
|
516 |
tet->change_segment1(get_segment(n1,n2));
|
517 |
tet->change_segment2(get_segment(n1,n3));
|
518 |
tet->change_segment3(get_segment(n1,n4));
|
519 |
tet->change_segment4(get_segment(n2,n3));
|
520 |
tet->change_segment5(get_segment(n2,n4));
|
521 |
tet->change_segment6(get_segment(n3,n4));
|
522 |
// std::pair<double,DLY_TETRA*> tmp(tet->get_critere_subdivision(),tet);
|
523 |
if (typemailleur==DELAUNAYCARTE)
|
524 |
{
|
525 |
ajouter_front(tet->get_segment1()->calcul_longueur(carte,pas,1),tet->get_segment1());
|
526 |
ajouter_front(tet->get_segment2()->calcul_longueur(carte,pas,1),tet->get_segment2());
|
527 |
ajouter_front(tet->get_segment3()->calcul_longueur(carte,pas,1),tet->get_segment3());
|
528 |
ajouter_front(tet->get_segment4()->calcul_longueur(carte,pas,1),tet->get_segment4());
|
529 |
ajouter_front(tet->get_segment5()->calcul_longueur(carte,pas,1),tet->get_segment5());
|
530 |
ajouter_front(tet->get_segment6()->calcul_longueur(carte,pas,1),tet->get_segment6());
|
531 |
}
|
532 |
return tet;
|
533 |
}
|
534 |
DLY_SEGMENT* MAILLEUR_DELAUNAY::get_segment(DLY_NOEUD* n1,DLY_NOEUD* n2)
|
535 |
{
|
536 |
|
537 |
DLY_NOEUD* no;
|
538 |
if (n1->get_num()<n2->get_num()) no=n1;
|
539 |
else no=n2;
|
540 |
DLY_SEGMENT* seg=no->get_lien_segment(n1,n2);
|
541 |
if (seg==NULL)
|
542 |
{
|
543 |
seg=new DLY_SEGMENT(n1,n2);
|
544 |
tabseg.push_back(seg);
|
545 |
no->insere_lien_segment(seg);
|
546 |
}
|
547 |
return seg;
|
548 |
}
|
549 |
|
550 |
DLY_TRIANGLE* MAILLEUR_DELAUNAY::get_triangle(DLY_NOEUD* n1,DLY_NOEUD* n2,DLY_NOEUD* n3)
|
551 |
{
|
552 |
DLY_NOEUD* no;
|
553 |
if (n1->get_num()<n2->get_num()) no=n1;
|
554 |
else no=n2;
|
555 |
if (n3->get_num()<no->get_num()) no=n3;
|
556 |
DLY_TRIANGLE* tri=no->get_lien_triangle(n1,n2,n3);
|
557 |
if (tri==NULL)
|
558 |
{
|
559 |
tri=new DLY_TRIANGLE(n1,n2,n3);
|
560 |
tabtri.push_back(tri);
|
561 |
no->insere_lien_triangle(tri);
|
562 |
}
|
563 |
return tri;
|
564 |
}
|
565 |
|
566 |
|
567 |
DLY_TETRA* MAILLEUR_DELAUNAY::get_tetra(double x,double y,double z)
|
568 |
{
|
569 |
DLY_TETRA* tet;
|
570 |
tet=get_tetra(tabtet[0],x,y,z);
|
571 |
if (tet!=NULL) return tet;
|
572 |
tet=get_tetra(tabtet[1],x,y,z);
|
573 |
if (tet!=NULL) return tet;
|
574 |
tet=get_tetra(tabtet[2],x,y,z);
|
575 |
if (tet!=NULL) return tet;
|
576 |
tet=get_tetra(tabtet[3],x,y,z);
|
577 |
if (tet!=NULL) return tet;
|
578 |
tet=get_tetra(tabtet[4],x,y,z);
|
579 |
if (tet!=NULL) return tet;
|
580 |
tet=get_tetra(tabtet[5],x,y,z);
|
581 |
if (tet!=NULL) return tet;
|
582 |
return NULL;
|
583 |
}
|
584 |
|
585 |
DLY_TETRA* MAILLEUR_DELAUNAY::get_tetra(DLY_TETRA* tet,double x,double y,double z)
|
586 |
{
|
587 |
if (tet==NULL) return get_tetra(x,y,z);
|
588 |
if (tet->point_dans_le_tetra(x,y,z))
|
589 |
{
|
590 |
if (tet->get_feuille()==1) return tet;
|
591 |
int nb=tet->get_nb_fils();
|
592 |
for (int i=0;i<nb;i++)
|
593 |
{
|
594 |
DLY_TETRA* tetrep=get_tetra(tet->get_fils(i),x,y,z);
|
595 |
if (tetrep!=NULL) return tetrep;
|
596 |
}
|
597 |
}
|
598 |
return NULL;
|
599 |
}
|
600 |
|
601 |
|
602 |
void MAILLEUR_DELAUNAY::transfert_maillage(std::vector<DLY_NOEUD*> *tabn,std::vector<DLY_TRIANGLE*> *tabe2d,std::vector<DLY_TETRA*> *tabe3d)
|
603 |
{
|
604 |
for (int i=0;i<tabn->size();i++)
|
605 |
{
|
606 |
DLY_NOEUD *no=(*tabn)[i];
|
607 |
M3D_NOEUD* noeud=new M3D_NOEUD(NULL,no->get_x(),no->get_y(),no->get_z(),MAGIC::ORIGINE::MAILLEUR_AUTO);
|
608 |
mai->ajouter_mg_noeud(noeud);
|
609 |
no->change_noeud(noeud);
|
610 |
noeud->etat_actif();
|
611 |
}
|
612 |
if (tabe2d!=NULL)
|
613 |
{
|
614 |
for (int i=0;i<tabe2d->size();i++)
|
615 |
{
|
616 |
DLY_TRIANGLE* tri=(*tabe2d)[i];
|
617 |
if (tri->est_frontiere())
|
618 |
MG_TRIANGLE *mgtri=mai->ajouter_mg_triangle(NULL,tri->get_noeud1()->get_noeud(),tri->get_noeud2()->get_noeud(),tri->get_noeud3()->get_noeud(),MAGIC::ORIGINE::MAILLEUR_AUTO);
|
619 |
}
|
620 |
}
|
621 |
else
|
622 |
{
|
623 |
double vol=0.;
|
624 |
double nbmaitheo=0;
|
625 |
for (int i=0;i<tabe3d->size();i++)
|
626 |
{
|
627 |
DLY_TETRA* tet=(*tabe3d)[i];
|
628 |
if (tet->get_feuille()==1)
|
629 |
{
|
630 |
MG_TRIANGLE* mgtriangle1=mai->get_mg_triangle(tet->get_noeud1()->get_noeud()->get_id(),tet->get_noeud3()->get_noeud()->get_id(),tet->get_noeud2()->get_noeud()->get_id());
|
631 |
MG_TRIANGLE* mgtriangle2=mai->get_mg_triangle(tet->get_noeud1()->get_noeud()->get_id(),tet->get_noeud2()->get_noeud()->get_id(),tet->get_noeud4()->get_noeud()->get_id());
|
632 |
MG_TRIANGLE* mgtriangle3=mai->get_mg_triangle(tet->get_noeud2()->get_noeud()->get_id(),tet->get_noeud3()->get_noeud()->get_id(),tet->get_noeud4()->get_noeud()->get_id());
|
633 |
MG_TRIANGLE* mgtriangle4=mai->get_mg_triangle(tet->get_noeud1()->get_noeud()->get_id(),tet->get_noeud4()->get_noeud()->get_id(),tet->get_noeud3()->get_noeud()->get_id());
|
634 |
if (mgtriangle1==NULL) mgtriangle1=mai->ajouter_mg_triangle(NULL,tet->get_noeud1()->get_noeud(),tet->get_noeud3()->get_noeud(),tet->get_noeud2()->get_noeud(),MAGIC::ORIGINE::MAILLEUR_AUTO);
|
635 |
if (mgtriangle2==NULL) mgtriangle2=mai->ajouter_mg_triangle(NULL,tet->get_noeud1()->get_noeud(),tet->get_noeud2()->get_noeud(),tet->get_noeud4()->get_noeud(),MAGIC::ORIGINE::MAILLEUR_AUTO);
|
636 |
if (mgtriangle3==NULL) mgtriangle3=mai->ajouter_mg_triangle(NULL,tet->get_noeud2()->get_noeud(),tet->get_noeud3()->get_noeud(),tet->get_noeud4()->get_noeud(),MAGIC::ORIGINE::MAILLEUR_AUTO);
|
637 |
if (mgtriangle4==NULL) mgtriangle4=mai->ajouter_mg_triangle(NULL,tet->get_noeud1()->get_noeud(),tet->get_noeud4()->get_noeud(),tet->get_noeud3()->get_noeud(),MAGIC::ORIGINE::MAILLEUR_AUTO);
|
638 |
M3D_TETRA* mgtet=mgtet=new M3D_TETRA(NULL,tet->get_noeud1()->get_noeud(),tet->get_noeud2()->get_noeud(),tet->get_noeud3()->get_noeud(),tet->get_noeud4()->get_noeud(),mgtriangle1,mgtriangle2,mgtriangle3,mgtriangle4,MAGIC::ORIGINE::MAILLEUR_AUTO);
|
639 |
mai->ajouter_mg_tetra(mgtet);
|
640 |
int tabnoeud[4]={0,0,0,0};
|
641 |
if (tet->get_triangle1()->est_frontiere()) {tabnoeud[0]=1;tabnoeud[1]=1;tabnoeud[2]=1;}
|
642 |
if (tet->get_triangle2()->est_frontiere()) {tabnoeud[0]=1;tabnoeud[1]=1;tabnoeud[3]=1;}
|
643 |
if (tet->get_triangle3()->est_frontiere()) {tabnoeud[0]=1;tabnoeud[2]=1;tabnoeud[3]=1;}
|
644 |
if (tet->get_triangle4()->est_frontiere()) {tabnoeud[1]=1;tabnoeud[2]=1;tabnoeud[3]=1;}
|
645 |
if (tabnoeud[0]==1) ((M3D_NOEUD*)mgtet->get_noeud1())->etat_inactif();
|
646 |
if (tabnoeud[1]==1) ((M3D_NOEUD*)mgtet->get_noeud2())->etat_inactif();
|
647 |
if (tabnoeud[2]==1) ((M3D_NOEUD*)mgtet->get_noeud3())->etat_inactif();
|
648 |
if (tabnoeud[3]==1) ((M3D_NOEUD*)mgtet->get_noeud4())->etat_inactif();
|
649 |
|
650 |
vol=vol+tet->calcul_volume(NULL,0);
|
651 |
nbmaitheo=nbmaitheo+tet->calcul_volume(carte,0);
|
652 |
}
|
653 |
}
|
654 |
LISTE_MG_SEGMENT::iterator it;
|
655 |
for (MG_SEGMENT *seg=mai->get_premier_segment(it);seg;seg=mai->get_suivant_segment(it))
|
656 |
{
|
657 |
M3D_NOEUD* no1=(M3D_NOEUD*)seg->get_noeud1();
|
658 |
M3D_NOEUD* no2=(M3D_NOEUD*)seg->get_noeud2();
|
659 |
seg->change_dimension_topo_null(3);
|
660 |
if (no1->get_etat()==MAGIC::MAILLEURFRONTALETAT::INACTIF)
|
661 |
if (no2->get_etat()==MAGIC::MAILLEURFRONTALETAT::INACTIF)
|
662 |
{
|
663 |
OT_VECTEUR_3D vec(no1->get_coord(),no2->get_coord());
|
664 |
vec.norme();
|
665 |
OT_VECTEUR_3D vecx(1.,0.,0.);
|
666 |
OT_VECTEUR_3D vecy(0.,1.,0.);
|
667 |
OT_VECTEUR_3D vecz(0.,0.,1.);
|
668 |
if (fabs(vecx*vec)<1e-10) seg->change_dimension_topo_null(2);
|
669 |
else if (fabs(vecy*vec)<1e-10) seg->change_dimension_topo_null(2);
|
670 |
else if (fabs(vecz*vec)<1e-10) seg->change_dimension_topo_null(2);
|
671 |
}
|
672 |
|
673 |
}
|
674 |
char message[255];
|
675 |
sprintf(message," Volume maille : %lf",vol);
|
676 |
if (affichageactif) affiche(message);
|
677 |
nbmaitheo=12.*nbmaitheo/sqrt(2);
|
678 |
double erreur=nbmaitheo-mai->get_nb_mg_tetra();
|
679 |
erreur=erreur/mai->get_nb_mg_tetra();
|
680 |
sprintf(message," Nombre de maille theorique : %d, Nombre de maille pratique %d, erreur %.2lf%%",(int)nbmaitheo,mai->get_nb_mg_tetra(),erreur);
|
681 |
if (affichageactif) affiche(message);
|
682 |
}
|
683 |
|
684 |
}
|
685 |
|
686 |
|
687 |
int MAILLEUR_DELAUNAY::est_de_delaunay(void)
|
688 |
{
|
689 |
for (int i=0;i<tabtet.size();i++)
|
690 |
{
|
691 |
DLY_TETRA* tet=tabtet[i];
|
692 |
for (int j=0;j<tabnoeud.size();j++)
|
693 |
{
|
694 |
DLY_NOEUD* no=tabnoeud[j];
|
695 |
if (no!=tet->get_noeud1())
|
696 |
if (no!=tet->get_noeud2())
|
697 |
if (no!=tet->get_noeud3())
|
698 |
if (no!=tet->get_noeud4())
|
699 |
{
|
700 |
int num=tet->point_dans_la_sphere(no->get_x(),no->get_y(),no->get_z()>1);
|
701 |
if (num>1)
|
702 |
return 0;
|
703 |
|
704 |
}
|
705 |
}
|
706 |
}
|
707 |
return 1;
|
708 |
}
|