40 LISTE_MG_TETRA::iterator it;
45 M3D_TETRA* tet3d=
new M3D_TETRA(tet->get_id(),tet->get_lien_topologie(),tet->get_noeud1(),tet->get_noeud2(),tet->get_noeud3(),tet->get_noeud4(),tet->get_triangle1(),tet->get_triangle2(),tet->get_triangle3(),tet->get_triangle4(),tet->get_origine());
73 double vol=(ab&ac)*ad;
83 double vol=(ab&ac)*ad;
97 nbaoptimiser=nbaoptimiserapres;
99 if (nbaoptimiserapres==0)
102 sprintf(mess,
" Tout est optimise");
107 while (nbaoptimiserapres!=nbaoptimiser);
132 LISTE_MG_TETRA::iterator it;
144 if (nbtet==0)
return;
145 for (
int phase=0;phase<2;phase++)
148 if (phase==0) sprintf(mess,
" Phase %d : %d a optimiser",2*passe-1+phase,nbtet);
149 if (phase==1) sprintf(mess,
" Phase %d",2*passe-1+phase);
153 ORDRE_TETRA::iterator i=
lst_tetra[phase].begin();
159 double crit[4]={-1.,-1.,-1.,-1.};
165 double x[4],y[4],z[4];
170 std::vector<double> vecteur_crit(crit,crit+4);
171 std::vector<double>::iterator it1 = max_element(vecteur_crit.begin(), vecteur_crit.end());
172 double crit_opt=*it1;
173 if (crit_opt>crit_avant)
175 int num=it1-vecteur_crit.begin();
180 for (
int j=0;j<nb;j++)
190 int coquille_non_optimise=1;
194 double crit[6]={-1,-1,-1,-1,-1,-1};
201 std::vector<double> vecteur_crit(crit,crit+6);
202 std::vector<double>::iterator it1 = max_element(vecteur_crit.begin(), vecteur_crit.end());
203 double crit_opt=*it1;
204 if (crit_opt>crit_avant)
206 coquille_non_optimise=0;
207 int num=it1-vecteur_crit.begin();
208 for (
int i=0;i<coque[num].
taille;i++)
214 for (
int i=0;i<2*coque[num].
taille-4;i++)
240 if ((phase==0) && (coquille_non_optimise==1))
259 LISTE_MG_TETRA::iterator it;
289 double tab_coord[3000];
291 for (
int i=0;i<nb_tet;i++)
329 xyzi[0]=(xyz1[0]+xyz2[0]+xyz3[0])/3.;
330 xyzi[1]=(xyz1[1]+xyz2[1]+xyz3[1])/3.;
331 xyzi[2]=(xyz1[2]+xyz2[2]+xyz3[2])/3.;
337 double hauteur = (perimetre/3.) * 0.8 ;
339 tab_coord[3*i]=xyzi[0]+normal.
get_x()*hauteur;
340 tab_coord[3*i+1]=xyzi[1]+normal.
get_y()*hauteur;
341 tab_coord[3*i+2]=xyzi[2]+normal.
get_z()*hauteur;
345 for (
int i=0;i<nb_tet;i++)
351 xopt=xopt+alpha*tab_coord[3*i];
352 yopt=yopt+alpha*tab_coord[3*i+1];
353 zopt=zopt+alpha*tab_coord[3*i+2];
357 double delta[3]={xopt-noeud->
get_x(),yopt-noeud->
get_y(),zopt-noeud->
get_z()};
358 double bmin=0.,bmax=1.;
359 double vieuxx=noeud->
get_x();
360 double vieuxy=noeud->
get_y();
361 double vieuxz=noeud->
get_z();
363 for (
int iteration=0;iteration<5;iteration++)
365 double alpha=(bmin+bmax)*0.5;
366 noeud->
change_x(vieuxx+alpha*delta[0]);
367 noeud->
change_y(vieuxy+alpha*delta[1]);
368 noeud->
change_z(vieuxz+alpha*delta[2]);
370 for (
int i=0;i<nb_tet;i++)
374 qualcour=std::min(qualcour,qual);
376 double alpha_eps=(bmin+bmax)*0.5-(bmax-bmin)/50.;
377 noeud->
change_x(vieuxx+alpha_eps*delta[0]);
378 noeud->
change_y(vieuxy+alpha_eps*delta[1]);
379 noeud->
change_z(vieuxz+alpha_eps*delta[2]);
380 double qualcour_eps=1.;
381 for (
int i=0;i<nb_tet;i++)
385 qualcour_eps=std::min(qualcour_eps,qual);
387 if (qualcour>qualcour_eps) bmin =alpha;
389 qualini=std::max(qualini,qualcour);
394 if (qualini>qual_dep)
396 x=vieuxx+(bmin+bmax)*0.5*delta[0];
397 y=vieuxy+(bmin+bmax)*0.5*delta[1];
398 z=vieuxz+(bmin+bmax)*0.5*delta[2];
414 for (
int i=0;i<nb;i++)
441 for (
int i=0;i<nb1;i++)
442 for (
int j=0;j<nb2;j++)
448 if ((nb_coq<4) || (nb_coq>10))
457 for (
int i=0;i<nb_coq;i++)
461 if ((coq[i]->get_noeud1()!=noeud1) && (coq[i]->get_noeud1()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->
get_noeud1();
462 if ((coq[i]->get_noeud2()!=noeud1) && (coq[i]->get_noeud2()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->
get_noeud2();
463 if ((coq[i]->get_noeud3()!=noeud1) && (coq[i]->get_noeud3()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->
get_noeud3();
464 if ((coq[i]->get_noeud4()!=noeud1) && (coq[i]->get_noeud4()!=noeud2)) tet_noeud[nb_tet_noeud++]=coq[i]->
get_noeud4();
469 polygone[0]=tet_noeud[0];
471 polygone[1]=tet_noeud[1];
473 while (nb_poly!=nb_coq+1)
475 for (
int j=0;j<nb_coq;j++)
477 if (tet_noeud[2*j]==polygone[nb_poly-1])
479 polygone[nb_poly++]=tet_noeud[2*j+1];
481 tet_noeud[2*j+1]=NULL;
483 if (tet_noeud[2*j+1]==polygone[nb_poly-1])
485 polygone[nb_poly++]=tet_noeud[2*j];
487 tet_noeud[2*j+1]=NULL;
492 double vol1=
get_volume(polygone[0]->get_coord(),polygone[1]->get_coord(),polygone[nb_poly-1]->get_coord(),noeud1->
get_coord());
493 double vol2=
get_volume(polygone[0]->get_coord(),polygone[nb_poly-1]->get_coord(),polygone[1]->get_coord(),noeud2->
get_coord());
507 int nb_solution,nb_triangle;
537 double crit_triangle[120];
538 for (
int i=0;i<nb_triangle;i++)
542 crit_triangle[i]=std::min(crit1,crit2);
546 int numero_solution= -1;
547 double crit_solution[1430];
548 for (
int i=0;i<nb_solution;i++)
551 for (
int j=0;j<nb_coq-2;j++)
561 double eps=0.0018*pow(volume,0.666666666);
565 for (
int j=0;j<nb_coq-2;j++)
566 crit_solution[i]=std::min(crit_solution[i],crit_triangle[
tab_solution[nb_coq-4][i][j]]);
568 else crit_solution[i]=0.;
569 if (crit_opt<crit_solution[i])
571 crit_opt=crit_solution[i];
576 if (numero_solution==(-1))
583 for (
int j=0;j<nb_coq-2;j++)
605 std::pair<double,M3D_TETRA*> tmp(val,tet);
606 ORDRE_TETRA::iterator p=
lst_tetra[num].insert(tmp);
640 if (triangle!=NULL)
return NULL;
virtual double get_qualite(void)
virtual void change_qualite(double qu)
virtual void affiche(char *mess)
MG_MAILLAGE * mg_maillage
MAILLEUR3D_OPTIMISATION(MG_MAILLAGE *mgmai, int niv)
virtual void o3d_data(void)
int tab_solution[7][1430][8]
virtual void o3d_data2(void)
virtual int get_niveau_optimisation(void)
virtual double get_volume(MG_TETRA *tet)
virtual int bouge_point(MG_VOLUME *mgvol, class MG_NOEUD *noeud, double &crit, double &x, double &y, double &z)
ORDRE_TETRA_PARID lst_tetraid[2]
virtual class MG_TRIANGLE * insere_triangle(class MG_VOLUME *mgvol, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, int origine)
virtual ~MAILLEUR3D_OPTIMISATION()
virtual void remaille_coquille(MG_NOEUD *noeud1, MG_NOEUD *noeud2, double &crit, class COQUILLE &coque)
virtual void ajouter_ordre_tetra(M3D_TETRA *tet, int num=1)
virtual MG_SEGMENT * cree_segment(class MG_VOLUME *mgvol, MG_NOEUD *noeud1, MG_NOEUD *noeud2, int origine)
virtual void change_niveau_optimisation(int num)
virtual MG_TRIANGLE * cree_triangle(class MG_VOLUME *mgvol, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, MG_SEGMENT *segment1, MG_SEGMENT *segment2, MG_SEGMENT *segment3, int origine)
virtual void supprimer_ordre_tetra(M3D_TETRA *tet)
virtual void optimise(MG_VOLUME *mgvol)
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
virtual int get_origine(void)
virtual TPL_SET< MG_ELEMENT_MAILLAGE * > * get_lien_maillage(void)
virtual int get_dimension(void)=0
MG_TETRA * get_premier_tetra(LISTE_MG_TETRA::iterator &it)
MG_TETRA * get_suivant_tetra(LISTE_MG_TETRA::iterator &it)
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_TETRA * get_mg_tetraid(unsigned long num)
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)
MG_SEGMENT * get_mg_segment(unsigned int num)
MG_SEGMENT * ajouter_mg_segment(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, int origine, double longue=0.0, unsigned long num=0)
unsigned int get_nb_mg_tetra(void)
int supprimer_mg_tetraid(unsigned long num)
virtual void change_x(double xx)
TPL_LISTE_ENTITE< class MG_TETRA * > * get_lien_tetra(void)
virtual double * get_coord(void)
virtual void change_y(double yy)
virtual double get_z(void)
virtual int get_type_entite()
virtual double get_y(void)
virtual void change_z(double zz)
virtual double get_x(void)
TPL_LISTE_ENTITE< class MG_SEGMENT * > * get_lien_petit_segment(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual int get_dimension_topo_null(void)
virtual void change_dimension_topo_null(int num)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud4(void)
virtual MG_NOEUD * get_noeud3(void)
class MG_SEGMENT * segment3
class MG_SEGMENT * segment2
class MG_SEGMENT * segment1
static int egal(double a, double b, double eps)
static double qualite_tetra(double *noeud1, double *noeud2, double *noeud3, double *noeud4)
virtual double get_z(void) const
virtual double get_longueur(void) const
virtual double get_y(void) const
virtual double get_x(void) const
virtual X get_premier(ITERATEUR &it)
virtual X get_suivant(ITERATEUR &it)
virtual void ajouter(X x)
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
X get_premier(ITERATEUR &it)
X get_suivant(ITERATEUR &it)