57 for (
int i=0;i<
tabtri.size();i++)
59 for (
int i=0;i<
tabtet.size();i++)
65 affiche((
char*)
"Initialisation Delaunay");
73 affiche((
char*)
"Création du maillage final");
78 affiche((
char*)
"Optimisation de maillage");
104 std::vector<DLY_TETRA*> tetdetruit;
105 std::vector<DLY_TETRA*> tetcree;
106 std::vector<DLY_TRIANGLE*> basetri;
108 for (
int i=0;i<tetdetruit.size();i++)
113 std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->
get_voisin1());
114 if (itv2==tetdetruit.end())
120 std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->
get_voisin2());
121 if (itv2==tetdetruit.end())
127 std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->
get_voisin3());
128 if (itv2==tetdetruit.end())
134 std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->
get_voisin4());
135 if (itv2==tetdetruit.end())
140 int nbtetrabase=tetdetruit.size();
141 for (
int i=0;i<tetdetruit.size();i++)
146 std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->
get_voisin1());
147 if (itv2==tetdetruit.end())
153 std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->
get_voisin2());
154 if (itv2==tetdetruit.end())
160 std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->
get_voisin3());
161 if (itv2==tetdetruit.end())
167 std::vector<DLY_TETRA*>::iterator itv2=find(tetdetruit.begin(),tetdetruit.end(),tettmp->
get_voisin4());
168 if (itv2==tetdetruit.end())
185 for (
int i=0;i<tetdetruit.size();i++)
201 for (
int i=0;i<basetri.size();i++)
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)))
207 DLY_TETRA* tetnv=
cree_tetra(basetri[i]->get_noeud1(),basetri[i]->get_noeud2(),basetri[i]->get_noeud3(),no);
208 tetcree.push_back(tetnv);
211 for (
int i=0;i<tetdetruit.size();i++)
212 tetdetruit[i]->ajoute_fils(tetcree);
213 for (
int i=0;i<tetcree.size();i++)
230 std::multimap<double, DLY_SEGMENT*, std::greater<double> >::iterator it=
front_trie.begin();
234 std::vector<double> lstptdecoup;
236 int nbptdecoup=lstptdecoup.size()/3;
237 for (
int j=0;j<nbptdecoup;j++)
239 double x=lstptdecoup[3*j];
240 double y=lstptdecoup[3*j+1];
241 double z=lstptdecoup[3*j+2];
295 for (
int i=0;i<
xnoeud.size();i++)
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)
307 seg->change_critere(crit);
308 std::pair<double,DLY_SEGMENT*> tmp2(crit,seg);
315 std::map<const unsigned long long,DLY_SEGMENT*>::iterator it=
front.find((
const unsigned long long)seg);
316 if (it==
front.end())
return;
318 std::multimap<double,DLY_SEGMENT*,std::greater<double> >::iterator it2=
front_trie.find(seg->
get_critere());
319 while ((*it2).second!=seg)
325 std::map<unsigned long long,DLY_TETRA*> tetasupprimercavite;
326 for (
int i=0;i<basetri.size();i++)
336 std::vector<DLY_TETRA*>::iterator it=find(cavite.begin(),cavite.end(),tet);
337 if (it==cavite.end()) exte=tet;
343 for (
int j=0;j<nbbase;j++)
344 if (inte==cavite[j]) base=1;
345 if (base==1)
continue;
358 double ps=vecdir*normal;
363 unsigned long long adresse=(
unsigned long long)inte;
364 tetasupprimercavite.insert(std::pair<unsigned long long,DLY_TETRA*>(adresse,inte));
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++)
379 std::vector<DLY_TETRA*>::iterator it=find(cavite.begin(),cavite.end(),tet);
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);
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);
459 sprintf(message,
" Volume espace : %lf",(xmax-xmin)*(ymax-ymin)*(zmax-zmin));
465 for (
int i=0;i<nb;i++)
472 for (
int i=0;i<nb;i++)
479 for (
int i=0;i<nb;i++)
486 for (
int i=0;i<nb;i++)
497 double xyz1[3],xyz2[3],xyz3[3],xyz4[3];
510 tet=
new DLY_TETRA(n1,n2,n3,n4,fabs(qual));
571 if (tet!=NULL)
return tet;
573 if (tet!=NULL)
return tet;
575 if (tet!=NULL)
return tet;
577 if (tet!=NULL)
return tet;
579 if (tet!=NULL)
return tet;
581 if (tet!=NULL)
return tet;
592 for (
int i=0;i<nb;i++)
595 if (tetrep!=NULL)
return tetrep;
604 for (
int i=0;i<tabn->size();i++)
614 for (
int i=0;i<tabe2d->size();i++)
625 for (
int i=0;i<tabe3d->size();i++)
654 LISTE_MG_SEGMENT::iterator it;
659 seg->change_dimension_topo_null(3);
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);
675 sprintf(message,
" Volume maille : %lf",vol);
677 nbmaitheo=12.*nbmaitheo/
sqrt(2);
680 sprintf(message,
" Nombre de maille theorique : %d, Nombre de maille pratique %d, erreur %.2lf%%",(
int)nbmaitheo,
mai->
get_nb_mg_tetra(),erreur);
689 for (
int i=0;i<
tabtet.size();i++)
void change_grosseur(double f)
virtual void get_coord(double *xyztmp)
int get_lien_triangle(class DLY_TRIANGLE *tri)
virtual double get_x(void)
void change_noeud(MG_NOEUD *no)
class MG_NOEUD * get_noeud(void)
virtual double get_z(void)
void insere_lien_segment(class DLY_SEGMENT *seg)
virtual double get_y(void)
int get_lien_segment(class DLY_SEGMENT *seg)
void insere_lien_triangle(class DLY_TRIANGLE *tri)
DLY_TETRA * get_tetra_feuille(void)
void decoupe_noeud(std::vector< double > &lstpt)
double calcul_longueur(class FCT_TAILLE *metrique=NULL, int pas=5, int conserve=1)
void change_voisin3(DLY_TETRA *tet)
void change_segment1(DLY_SEGMENT *seg)
DLY_SEGMENT * get_segment4(void)
DLY_TETRA * get_voisin3(void)
DLY_TETRA * get_fils(int i)
void change_segment3(DLY_SEGMENT *seg)
class DLY_TRIANGLE * get_triangle1(void)
DLY_SEGMENT * get_segment5(void)
void change_segment4(DLY_SEGMENT *seg)
void change_voisin1(DLY_TETRA *tet)
DLY_NOEUD * get_noeud1(void)
void change_triangle1(DLY_TRIANGLE *tri)
void get_normal3(double *nor)
void change_triangle4(DLY_TRIANGLE *tri)
void change_voisin4(DLY_TETRA *tet)
DLY_TRIANGLE * get_triangle4(void)
void change_triangle3(DLY_TRIANGLE *tri)
DLY_TETRA * get_voisin1(void)
DLY_TETRA * get_voisin2(void)
void change_segment6(DLY_SEGMENT *seg)
class DLY_SEGMENT * get_segment1(void)
double calcul_volume(class FCT_TAILLE *metrique=NULL, int conserve=1)
int point_dans_la_sphere(double x, double y, double z)
void change_voisin2(DLY_TETRA *tet)
DLY_SEGMENT * get_segment6(void)
void get_normal1(double *nor)
void change_segment5(DLY_SEGMENT *seg)
DLY_NOEUD * get_noeud2(void)
void get_normal4(double *nor)
void change_triangle2(DLY_TRIANGLE *tri)
DLY_NOEUD * get_noeud3(void)
DLY_TETRA * get_voisin4(void)
int point_dans_le_tetra(double x, double y, double z)
DLY_SEGMENT * get_segment2(void)
DLY_TRIANGLE * get_triangle3(void)
DLY_NOEUD * get_noeud4(void)
DLY_TRIANGLE * get_triangle2(void)
void get_normal2(double *nor)
void change_segment2(DLY_SEGMENT *seg)
DLY_SEGMENT * get_segment3(void)
DLY_TETRA * get_tetra(int i)
DLY_NOEUD * get_noeud3(void)
DLY_NOEUD * get_noeud1(void)
DLY_NOEUD * get_noeud2(void)
virtual BOITE_3D get_boite_3D(void)=0
virtual void etat_actif(void)
virtual int get_etat(void)
fonction_affiche * affiche2
virtual void active_affichage(fonction_affiche *fonc)
virtual void affiche(char *mess)
virtual void optimise(MG_VOLUME *mgvol)
std::vector< class DLY_SEGMENT * > tabseg
virtual DLY_TETRA * get_tetra(double x, double y, double z)
virtual int modifie_cavite(std::vector< DLY_TETRA * > &cavite, std::vector< DLY_TRIANGLE * > &basetri, int nbbase, double x, double y, double z)
MAILLEUR_DELAUNAY(class MG_MAILLAGE *m, class FCT_TAILLE *cartetmp, double crit_arret, class OT_CPU *comp=NULL)
virtual void retire_tetra_cavite(DLY_TETRA *tet, std::vector< DLY_TETRA * > &cavite, std::vector< DLY_TRIANGLE * > &basetri)
virtual void retirer_front(DLY_SEGMENT *seg)
std::map< const unsigned long long, DLY_SEGMENT * > front
virtual void mise_a_jour_voisin(DLY_TETRA *tet)
virtual class DLY_TRIANGLE * get_triangle(DLY_NOEUD *n1, DLY_NOEUD *n2, DLY_NOEUD *n3)
const int DELAUNAYLISTENOEUD
virtual void raffine_maillage(void)
virtual void ajoute_tetra_cavite(DLY_TETRA *tet, std::vector< DLY_TETRA * > &cavite, std::vector< DLY_TRIANGLE * > &basetri)
virtual class DLY_SEGMENT * get_segment(DLY_NOEUD *n1, DLY_NOEUD *n2)
std::vector< class DLY_TETRA * > tabtet
virtual void ajouter_front(double crit, DLY_SEGMENT *seg)
virtual class DLY_TETRA * cree_tetra(class DLY_NOEUD *n1, DLY_NOEUD *n2, DLY_NOEUD *n3, DLY_NOEUD *n4)
virtual void insere_noeud_delaunay(DLY_TETRA *tet, double x, double y, double z)
std::vector< class DLY_NOEUD * > tabnoeud
virtual void initialise_maillage(void)
std::vector< double > znoeud
virtual void transfert_maillage(std::vector< class DLY_NOEUD * > *tabn, std::vector< class DLY_TRIANGLE * > *tabe2d, std::vector< class DLY_TETRA * > *tabe3d)
std::vector< double > ynoeud
virtual int maille(class MG_GROUPE_TOPOLOGIQUE *mggt=NULL)
std::vector< double > xnoeud
virtual void change_niveau_optimisation(int num)
std::multimap< double, DLY_SEGMENT *, std::greater< double > > front_trie
virtual ~MAILLEUR_DELAUNAY()
virtual void ajouter_noeud(double &x, double &y, double &z, double epsbordure=0.01)
virtual int est_de_delaunay(void)
std::vector< class DLY_TRIANGLE * > tabtri
MG_SEGMENT * get_premier_segment(LISTE_MG_SEGMENT::iterator &)
MG_TRIANGLE * ajouter_mg_triangle(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, int origine, unsigned long num=0)
MG_SEGMENT * get_suivant_segment(LISTE_MG_SEGMENT::iterator &)
MG_TETRA * ajouter_mg_tetra(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, class MG_NOEUD *mgnoeud4, int origine, unsigned long num=0)
MG_TRIANGLE * get_mg_triangle(unsigned int num)
unsigned int get_nb_mg_tetra(void)
MG_NOEUD * ajouter_mg_noeud(MG_ELEMENT_TOPOLOGIQUE *topo, double xx, double yy, double zz, int origine, unsigned long num=0)
virtual double * get_coord(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud4(void)
virtual MG_NOEUD * get_noeud3(void)
static double qualite_tetra(double *noeud1, double *noeud2, double *noeud3, double *noeud4)
double ajouter_etape(std::string nom)
double2 sqrt(double2 &val)