50 LISTE_MG_TRIANGLE::iterator ittr;
54 M3D_TRIANGLE* nvtri=
new M3D_TRIANGLE(tri->get_id(),tri->get_lien_topologie(),tri->get_noeud1(),tri->get_noeud2(),tri->get_noeud3(),tri->get_segment1(),tri->get_segment2(),tri->get_segment3(),tri->get_origine());
66 liste_noeud.
ajouter(tri->get_noeud1());
67 liste_noeud.
ajouter(tri->get_noeud2());
68 liste_noeud.
ajouter(tri->get_noeud3());
72 for (
int i=0;i<nbcoquille;i++)
76 for (
int j=0;j<nbface;j++)
88 LISTE_MG_TRIANGLE::iterator ittr;
92 M3D_TRIANGLE* nvtri=
new M3D_TRIANGLE(tri->get_id(),tri->get_lien_topologie(),tri->get_noeud1(),tri->get_noeud2(),tri->get_noeud3(),tri->get_segment1(),tri->get_segment2(),tri->get_segment3(),tri->get_origine());
104 liste_noeud.
ajouter(tri->get_noeud1());
105 liste_noeud.
ajouter(tri->get_noeud2());
106 liste_noeud.
ajouter(tri->get_noeud3());
110 for (
int i=0;i<nbcoquille;i++)
114 for (
int j=0;j<nbface;j++)
129 liste_noeud.
ajouter(mgtri->get_noeud1());
130 liste_noeud.
ajouter(mgtri->get_noeud2());
131 liste_noeud.
ajouter(mgtri->get_noeud3());
137 double *xyz=no->get_coord();
162 std::pair<double,M3D_TRIANGLE*> tmp(val,tri);
163 ORDRE_TRIANGLE::iterator p=
lst_tri[num].insert(tmp);
178 lst_tri[num].erase(it->second);
188 std::vector<int> strategie;
189 char* code=(
char*)
param.
get_nom(
"Optimisation_2D").c_str();
190 for (
int i=0;i<strlen(code);i++)
192 if (code[i]==
'1') strategie.push_back(1);
193 if (code[i]==
'2') strategie.push_back(2);
194 if (code[i]==
'3') strategie.push_back(3);
195 if (code[i]==
'4') strategie.push_back(4);
198 int nb_level=strategie.size();
199 std::string info=
" stratégie d'optimisation ";
200 for (
int level=0;level<nb_level;level++)
203 sprintf(chaine,
"%d",strategie[level]);
204 info = info + chaine;
217 for (
int phase=0;phase<2;phase++)
222 ORDRE_TRIANGLE::iterator i=
lst_tri[phase].begin();
230 switch (strategie[level])
295 if ((*autretri)==NULL)
return 0;
298 if (((*autretri)->get_noeud1()!=no1) && ((*autretri)->get_noeud1()!=no2)) no4=(*autretri)->get_noeud1();
299 if (((*autretri)->get_noeud2()!=no1) && ((*autretri)->get_noeud2()!=no2)) no4=(*autretri)->get_noeud2();
300 if (((*autretri)->get_noeud3()!=no1) && ((*autretri)->get_noeud3()!=no2)) no4=(*autretri)->get_noeud3();
302 double qual2=(*autretri)->get_qualite();
303 double qualmin=std::min(qual1,qual2);
315 if (normal*n1n4<0.0001) nqual1=0.;
324 if (normal2*n2n3<0.0001) nqual2=0.;
325 double nqualmin=std::min(nqual1,nqual2);
326 if (nqualmin>qualmin)
352 for (
int i=0;i<nb_tri;i++)
375 double u2=noeud1->
get_u()+du;
376 double v2=noeud1->
get_v()+dv;
379 u2=noeud2->
get_u()+du;
380 v2=noeud2->
get_v()+dv;
387 double ddeb=
sqrt((u1-uopt)*(u1-uopt)+(v1-vopt)*(v1-vopt));
390 double qual=qual_dep;
391 double testu[8]={1.,-1.,0.,0.,0.707106781,-0.707106781,-0.707106781,0.707106781};
392 double testv[8]={0.,0.,1.,-1.,0.707106781,0.707106781,-0.707106781,-0.707106781};
398 for (
int nb_essai=0;nb_essai<8;nb_essai++)
402 uv[0]=uu+d*testu[nb_essai]-du;
403 uv[1]=vv+d*testv[nb_essai]-dv;
406 if (!((valide1) && (valide2) ))
break;
409 for (
int i=0;i<nb_tri;i++)
418 if (no1==mg_noeud) xyz1=xyz;
419 if (no2==mg_noeud) xyz2=xyz;
420 if (no3==mg_noeud) xyz3=xyz;
430 if (normal*n1n2<0.0001) qualtmp=0.;
431 if (qualtmp<qual1) qual1=qualtmp;
442 if (qualcoq<qual+0.0001) alpha=alpha-0.1;
494 double crit[3],u[3],v[3],x[3],y[3],z[3];
495 int ierr=
bouge_point(mgface,no[0],crit[0],u[0],v[0],x[0],y[0],z[0]);
496 if (ierr==0) crit[0]=0.;
497 ierr=
bouge_point(mgface,no[1],crit[1],u[1],v[1],x[1],y[1],z[1]);
498 if (ierr==0) crit[1]=0.;
499 ierr=
bouge_point(mgface,no[2],crit[2],u[2],v[2],x[2],y[2],z[2]);
500 if (ierr==0) crit[2]=0.;
501 double critopt=std::max(crit[0],crit[1]);
502 critopt=std::max(critopt,crit[2]);
506 if (critopt==crit[0]) num=0;
507 if (critopt==crit[1]) num=1;
508 if (critopt==crit[2]) num=2;
518 for (
int i=0;i<nb_tri;i++)
542 double crit1,crit2,crit3;
549 double maxcrit=std::max(ierr1*crit1,ierr2*crit2);
550 maxcrit=std::max(maxcrit,ierr3*crit3);
553 if (maxcrit>(*tri)->get_qualite())
555 if (maxcrit==ierr1*crit1) {tab=tab1;autretri=autretri1;}
556 if (maxcrit==ierr2*crit2) {tab=tab2;autretri=autretri2;}
557 if (maxcrit==ierr3*crit3) {tab=tab3;autretri=autretri3;}
virtual void change_qualite(double val)
M3D_TRIANGLE(unsigned long num, MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, class MG_SEGMENT *mgsegment1, class MG_SEGMENT *mgsegment2, class MG_SEGMENT *mgsegment3, int origine)
virtual double get_qualite(void)
virtual void affiche(char *mess)
ORDRE_TRIANGLE_PARID lst_triid[2]
MG_MAILLAGE * mg_maillage
virtual int get_niveau_optimisation(void)
virtual M3D_TRIANGLE * cree_triangle(class MG_FACE *mgface, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, MG_SEGMENT *segment1, MG_SEGMENT *segment2, MG_SEGMENT *segment3, int origine)
virtual MG_SEGMENT * cree_segment(class MG_FACE *mgface, MG_NOEUD *noeud1, MG_NOEUD *noeud2, int origine)
virtual ~MAILLEUR2D_OPTIMISATION()
virtual void optimise(MG_FACE *mgface)
virtual M3D_TRIANGLE * insere_triangle(class MG_FACE *mgface, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, int origine)
virtual int bouge_point(MG_FACE *mgface, MG_NOEUD *mg_noeud, double &crit, double &u, double &v, double &x, double &y, double &z)
virtual void supprimer_ordre_tri(M3D_TRIANGLE *tri)
void operateur_bouge_de_point(int phase, MG_FACE *mgface, M3D_TRIANGLE *tri)
virtual void ajouter_ordre_tri(M3D_TRIANGLE *tri, int num=1)
virtual void optimise_avec_calcul_uv(MG_FACE *mgface)
ORDRE_TRIANGLE lst_tri[2]
OT_DECALAGE_PARAMETRE * decalage
MAILLEUR2D_OPTIMISATION(MG_MAILLAGE *mgmai, int niv)
virtual void change_niveau_optimisation(int num)
virtual int inverse_diagonale(MG_FACE *face, int num, M3D_TRIANGLE *tri, M3D_TRIANGLE **autretri, double &crit, MG_NOEUD **tabnoeudres)
void operateur_inverse_diagonale(int phase, MG_FACE *mgface, M3D_TRIANGLE **tri)
virtual void reinit(void)
virtual MG_FACE * get_face(void)
virtual int get_nb_mg_coquille(void)
virtual MG_COQUILLE * get_mg_coquille(int num)
virtual MG_COFACE * get_mg_coface(int num)
virtual int get_nb_mg_coface(void)
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
virtual int get_origine(void)
virtual TPL_SET< MG_ELEMENT_MAILLAGE * > * get_lien_maillage(void)
virtual int valide_parametre_u(double &u)
virtual int valide_parametre_v(double &v)
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
virtual void evaluer(double *uv, double *xyz)
virtual MG_SURFACE * get_surface(void)
virtual void calcul_normale_unitaire(double *uv, double *normale)
MG_TRIANGLE * get_mg_triangleid(unsigned long num)
MG_TRIANGLE * get_premier_triangle(LISTE_MG_TRIANGLE::iterator &it)
MG_TRIANGLE * get_suivant_triangle(LISTE_MG_TRIANGLE::iterator &it)
int supprimer_mg_triangleid(unsigned long num)
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_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)
virtual void change_x(double xx)
virtual double get_v(void)
virtual double * get_coord(void)
virtual void change_y(double yy)
virtual double get_u(void)
virtual void change_u(double uu)
virtual void change_z(double zz)
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
virtual void change_v(double vv)
virtual void change_dimension_topo_null(int num)
virtual double get_periode_u(void)=0
virtual double get_periode_v(void)=0
class MG_SEGMENT * segment3
virtual MG_NOEUD * get_noeud3(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
class MG_SEGMENT * segment2
virtual MG_SEGMENT * get_segment2(void)
virtual MG_SEGMENT * get_segment3(void)
virtual MG_SEGMENT * get_segment1(void)
class MG_SEGMENT * segment1
virtual MG_COQUILLE * get_mg_coquille(int num)
virtual int get_nb_mg_coquille(void)
static double qualite_triangle(double *noeud1, double *noeud2, double *noeud3)
double decalage_parametre_v(double par, double dpar)
double calcul_decalage_parametre_v(double par)
double calcul_decalage_parametre_u(double par)
double decalage_parametre_u(double par, double dpar)
std::string get_nom(std::string chaine, int num=0)
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)
double2 sqrt(double2 &val)