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;