55 for (
int i=0;i<9;i++)
etat[i]=0;
61 params.
ajouter(
"consnooptimise",0.,
OT_PARAMETRES::DOUBLE,
"0. Maillage non optimise non inclus dans le decoupage par mailles entieres 1. Maillage non optimise inclus");
64 params.
ajouter(
"liss_aretes2017_lambda",0.8,
OT_PARAMETRES::DOUBLE,
"Paramète de relaxation lambda du lissage Laplacien des arêtes, la valeur doit être positive et moins de 1");
115 affiche((
char*)
"***********************************************************");
116 affiche((
char*)
"Post-traitement d'un calcul d'optimisation de topologie");
117 affiche((
char*)
"***********************************************************");
121 affiche((
char*)
"Écriture d'un fichier de parametres par défaut");
129 etat[(origine-1000)/10]=1;
135 LISTE_FEM_ELEMENT3::iterator it_tetra;
146 LISTE_MG_TETRA::iterator it_tetra;
147 double volume_initial = 0.;
148 double volume_final = 0.;
151 int originetet=mgtet->get_origine();
152 MG_NOEUD* noeud1 = mgtet->get_noeud1();
153 double x1 = noeud1->
get_x();
154 double y1 = noeud1->
get_y();
155 double z1 = noeud1->
get_z();
156 MG_NOEUD* noeud2 = mgtet->get_noeud2();
157 double x2 = noeud2->
get_x();
158 double y2 = noeud2->
get_y();
159 double z2 = noeud2->
get_z();
160 MG_NOEUD* noeud3 = mgtet->get_noeud3();
161 double x3 = noeud3->
get_x();
162 double y3 = noeud3->
get_y();
163 double z3 = noeud3->
get_z();
164 MG_NOEUD* noeud4 = mgtet->get_noeud4();
165 double x4 = noeud4->
get_x();
166 double y4 = noeud4->
get_y();
167 double z4 = noeud4->
get_z();
168 double volume_tet = (x2-x1)*((y3-y1)*(z4-z1)-(z3-z1)*(y4-y1))-(y2-y1)*((x3-x1)*(z4-z1)-(z3-z1)*(x4-x1)) + (z2-z1)*((x3-x1)*(y4-y1)-(y3-y1)*(x4-x1));
169 volume_tet = volume_tet/6.;
170 volume_initial = volume_initial + volume_tet;
173 volume_final = volume_final + volume_tet;
176 *volumetot=volume_initial;
177 *volumenondesign=volume_final;
182 std::cout <<
" Reactivation d'elements manquants sur aretes vives et faces planes" << std::endl;
183 LISTE_MG_TETRA::iterator it_tetra;
186 int originetet=mgtet->get_origine();
195 for (
int k = 0;k<nb_tet1;k++)
202 for (
int k = 0;k<nb_tet2;k++)
209 for (
int k = 0;k<nb_tet3;k++)
216 for (
int k = 0;k<nb_tet4;k++)
232 affiche((
char*)
"Extraction de l'enveloppe par découpage");
235 affiche((
char*)
" Extrapolation de la densité aux noeuds");
236 LISTE_FEM_NOEUD::iterator it;
241 int nb=no->get_lien_element3()->get_nb();
243 for (
int i=0;i<nb;i++)
255 if (passe==1) no->change_solution(nume/deno);
else no->change_solution(1.);
259 affiche((
char*)
" Enregistrement de la densité aux noeuds");
261 std::string chemin=nom+
".sol";
265 LISTE_FEM_ELEMENT3::iterator it3;
272 femdens->
ecrire(1.,i,0,0);
273 femdens->
ecrire(1.,i,0,1);
274 femdens->
ecrire(1.,i,0,2);
275 femdens->
ecrire(1.,i,0,3);
279 femdens->
ecrire(tet->get_fem_noeud(0)->get_solution(),i,0,0);
280 femdens->
ecrire(tet->get_fem_noeud(1)->get_solution(),i,0,1);
281 femdens->
ecrire(tet->get_fem_noeud(2)->get_solution(),i,0,2);
282 femdens->
ecrire(tet->get_fem_noeud(3)->get_solution(),i,0,3);
297 std::map<unsigned long,unsigned long> correspondidsom;
298 std::map<unsigned long,unsigned long> correspondid;
299 LISTE_MG_SOMMET::iterator its;
302 if (som->get_nb_ccf()>0)
307 correspondidsom[som->get_id()]=somno->
get_id();
310 LISTE_MG_ARETE::iterator ita;
313 if (are->get_nb_ccf()>0)
318 correspondid[are->get_id()]=areel->
get_id();
321 LISTE_MG_FACE::iterator itf;
324 if (face->get_nb_ccf()>0)
329 correspondid[face->get_id()]=facel->
get_id();
340 LISTE_MG_TRIANGLE::iterator itmg;
342 tri->change_nouveau_numero(0);
343 affiche((
char*)
" Decoupage des tetra optimises");
344 LISTE_FEM_ELEMENT3::iterator it3;
385 if (tri->get_lien_topologie()->get_dimension()==3)
386 if (tri->get_nouveau_numero()>0)
387 tri_impose_interne.
ajouter(tri);
397 std::vector<MG_NOEUD*> tab;
463 affiche((
char*)
" Decoupage des triangles non design interne au volume");
464 for (
int i=0;i<tri_impose_interne.
get_nb();i++)
470 std::vector<MG_NOEUD*> tab;
513 affiche((
char*)
" Decoupage des triangles sur la frontiere du volume");
514 LISTE_FEM_ELEMENT2::iterator it2;
517 std::vector<MG_NOEUD*> tab;
521 int ori=((
MG_FACE*)tri->get_lien_topologie())->get_mg_coface(0)->get_orientation();
543 std::map<unsigned long,unsigned long>::iterator it=correspondid.find(tri->get_mg_element_maillage()->get_lien_topologie()->get_id());
544 if (it!=correspondid.end())
548 MG_TRIANGLE_PEAU* tri=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno2,mgno3,mgmai,
MAGIC::ORIGINE::IMPOSE);
555 MG_TRIANGLE_PEAU* tri=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno3,tab[0],mgmai,
MAGIC::ORIGINE::IMPOSE);
556 MG_TRIANGLE_PEAU* tri2=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno2,mgno3,tab[0],mgmai,
MAGIC::ORIGINE::IMPOSE);
562 MG_TRIANGLE_PEAU* tri=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno2,tab[0],mgmai,
MAGIC::ORIGINE::IMPOSE);
563 MG_TRIANGLE_PEAU* tri2=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno2,mgno3,tab[0],mgmai,
MAGIC::ORIGINE::IMPOSE);
569 MG_TRIANGLE_PEAU* tri=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno2,tab[0],mgmai,
MAGIC::ORIGINE::IMPOSE);
570 MG_TRIANGLE_PEAU* tri2=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno3,tab[0],mgmai,
MAGIC::ORIGINE::IMPOSE);
579 MG_TRIANGLE_PEAU* tri=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno2,tab[0],mgmai,
MAGIC::ORIGINE::IMPOSE);
580 MG_TRIANGLE_PEAU* tri2=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno2,tab[0],tab[1],mgmai,
MAGIC::ORIGINE::IMPOSE);
581 MG_TRIANGLE_PEAU* tri3=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno3,tab[0],tab[1],mgmai,
MAGIC::ORIGINE::IMPOSE);
588 MG_TRIANGLE_PEAU* tri=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno3,tab[0],mgmai,
MAGIC::ORIGINE::IMPOSE);
589 MG_TRIANGLE_PEAU* tri2=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno3,tab[0],tab[1],mgmai,
MAGIC::ORIGINE::IMPOSE);
590 MG_TRIANGLE_PEAU* tri3=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno2,tab[0],tab[1],mgmai,
MAGIC::ORIGINE::IMPOSE);
597 MG_TRIANGLE_PEAU* tri=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno2,mgno3,tab[0],mgmai,
MAGIC::ORIGINE::IMPOSE);
598 MG_TRIANGLE_PEAU* tri2=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno3,tab[0],tab[1],mgmai,
MAGIC::ORIGINE::IMPOSE);
599 MG_TRIANGLE_PEAU* tri3=
insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,tab[0],tab[1],mgmai,
MAGIC::ORIGINE::IMPOSE);
616 std::vector<MG_NOEUD*> tab;
656 LISTE_MG_TRIANGLE::iterator it_tri;
678 std::vector<MG_TRIANGLE_PEAU*> *peau=
new std::vector<MG_TRIANGLE_PEAU*>;
681 peau->push_back(tripeau);
693 affiche((
char*)
"Suppression des peaux isolées");
696 for (
int cas=0;cas<2;cas++)
698 if (cas==0)
affiche((
char*)
" Analyse initiale des peaux");
699 if (cas==1)
affiche((
char*)
" Analyse finale des peaux");
704 for (
int j=0;j<
lst_peau[i]->size();j++)
709 for (
int j=0;j<
lst_peau[i]->size();j++)
716 sprintf(message,
" %d peaux, %d non isoles, %d isoles",(
int)
lst_peau.size(),(
int)
lst_peau.size()-nbisole,nbisole);
718 for (std::vector<std::vector<MG_TRIANGLE_PEAU*> *>::iterator j=
lst_peau.end()-1;j>
lst_peau.begin();j--)
722 LISTE_MG_TRIANGLE::iterator itmg;
747 double ps=normal*dir;
755 static std::map<std::string,MG_NOEUD*> correspond;
756 unsigned long id=no->
get_id();
758 sprintf(message,
"_%lu_",
id);
759 std::string key=message;
767 if (it!=correspondid.end())
770 if (it!=correspondid.end())
773 correspond[key]=mgno;
784 xyz[0]=0.5*(xyz1[0]+xyz2[0]);
785 xyz[1]=0.5*(xyz1[1]+xyz2[1]);
786 xyz[2]=0.5*(xyz1[2]+xyz2[2]);
788 if (((ot.
estdansletetra(tet,xyz[0],xyz[1],xyz[2])>>1)&1)==1)
return 1;
796 static std::map<std::string,MG_NOEUD*> correspond;
797 unsigned long id1=no1->
get_id();
798 unsigned long id2=no2->
get_id();
800 sprintf(message,
"_%lu_%lu_",id1,id2);
801 std::string key1=message;
802 sprintf(message,
"_%lu_%lu_",id2,id1);
803 std::string key2=message;
813 if (fabs(sol1-limit)<0.0000001)
815 sprintf(message,
"%lu",id1);
816 std::string key=message;
821 no=
new MG_NOEUD(NULL,xyz1[0],xyz1[1],xyz1[2],origine);
826 for (
int i=0;i<tab->size();i++)
827 if ((*tab)[i]==no) present=1;
835 if (fabs(sol2-limit)<0.0000001)
837 sprintf(message,
"%lu",id2);
838 std::string key=message;
843 no=
new MG_NOEUD(NULL,xyz2[0],xyz2[1],xyz2[2],origine);
848 for (
int i=0;i<tab->size();i++)
849 if ((*tab)[i]==no) present=1;
859 if (((sol1<limit) && (sol2>limit))||((sol1>limit) && (sol2<limit)))
862 if (no==NULL) no=correspond[key2];
863 if ((no==NULL) && (creation==1))
865 double t=(limit-sol1)/(sol2-sol1);
869 xyz[0]=xyz1[0]+t*(xyz2[0]-xyz1[0]);
870 xyz[1]=xyz1[1]+t*(xyz2[1]-xyz1[1]);
871 xyz[2]=xyz1[2]+t*(xyz2[2]-xyz1[2]);
872 no=
new MG_NOEUD(NULL,xyz[0],xyz[1],xyz[2],origine);
892 strcat(nomout,
".volume");
893 FILE *in=fopen(nomout,
"wt");
894 fprintf(in,
"Suivi du volume pendant le posttraitement d'une optimisation de topologie\n");
895 fprintf(in,
"**************************************************************************\n\n\n\n");
898 affiche((
char*)
"Calcul du volume de depart");
902 fprintf(in,
"Statistique initiale\n");
903 fprintf(in,
"Volume total=%.14le\nVolume non design=%.14le\nVolume à optimiser=%.14le\n\n\n\n",voltot,volnon,voltot-volnon);
904 affiche((
char*)
"Extraction du maillage de surface");
909 affiche((
char*)
" Découpage par mailles 3D entieres");
915 affiche((
char*)
" Découpage par isodensité");
921 affiche((
char*)
"Calcul du volume après extraction de la peau");
924 fprintf(in,
"Statistique après extraction de la peau\n");
925 fprintf(in,
"Volume total=%.14le\nVolume non design=%.14le\nVolume design=%.14le\nf reel=%.14le\n\n\n\n",v,volnon,v-volnon,(v-volnon)/(voltot-volnon));
926 affiche((
char*)
"Procedure de lissage");
929 if(liss_aretes2017_nbiter!=0)
936 LISTE_MG_NOEUD::iterator it_vec;
951 if (chen2005_debut==0) chen2005fait=1;
953 if (chen2008_debut==0) chen2008fait=1;
955 if (jiao2012_debut==0) jiao2012fait=1;
956 int McKenzie2016fait=0;
957 if (McKenzie2016_debut==0) McKenzie2016fait=1;
958 int Taubin1995fait=0;
959 if (Taubin1995_debut==0) Taubin1995fait=1;
960 int cardinalitefait=0;
961 if (cardinalite_debut==0) cardinalitefait=1;
967 char nomiteration[500];
968 strcpy(nomiteration,
"aucun lissage");
970 if (chen2005fait==0) next=std::min(next,chen2005_debut);
971 if (chen2008fait==0) next=std::min(next,chen2008_debut);
972 if (jiao2012fait==0) next=std::min(next,jiao2012_debut);
973 if (McKenzie2016fait==0) next=std::min(next,McKenzie2016_debut);
974 if (Taubin1995fait==0) next=std::min(next,Taubin1995_debut);
975 if (cardinalitefait==0) next=std::min(next,cardinalite_debut);
976 if ((iteration>=chen2005_debut) && (chen2005_debut==next))
979 sprintf(message,
" Iteration %d : lissage de Chen 2005",iteration);
985 if (nbiter==iter_max) sprintf(message,
" Arrêt de la procédure de lissage de Chen2005 après %d itérations",nbiter);
986 else sprintf(message,
" Convergence de la procédure de lissage de Chen2005 après %d itérations",nbiter);
989 iteration=iteration+nbiter;
990 strcpy(nomiteration,
"lissage de Chen2005");
992 else if ((iteration>=chen2008_debut) && (chen2008_debut==next))
995 sprintf(message,
" Iteration %d : lissage de Chen 2008",iteration);
1002 if (nbiter==iter_max) sprintf(message,
" Arrêt de la procédure de lissage de Chen2008 après %d itérations",nbiter);
1003 else sprintf(message,
" Convergence de la procédure de lissage de Chen2008 après %d itérations",nbiter);
1006 iteration=iteration+nbiter;
1007 strcpy(nomiteration,
"lissage de Chen2008");
1009 else if ((iteration>=jiao2012_debut) && (jiao2012_debut==next))
1012 sprintf(message,
" Iteration %d : lissage de Jiao 2012",iteration);
1016 if (nbiter==iter_max) sprintf(message,
" Arrêt de la procédure de lissage de Jiao2012 après %d itérations",nbiter);
1017 else sprintf(message,
" Convergence de la procédure de lissage de Jiao2012 après %d itérations",nbiter);
1020 iteration=iteration+nbiter;
1021 strcpy(nomiteration,
"lissage de Jiao2012");
1023 else if ((iteration>=McKenzie2016_debut) && (McKenzie2016_debut==next))
1026 sprintf(message,
"Lissage de McKenzie2016");
1037 if (nbiter==iter_max) sprintf(message,
" Arrêt de la procédure de lissage de McKenzie2016 après %d itérations",nbiter);
1038 else sprintf(message,
" Convergence de la procédure de lissage de McKenzie2016 après %d itérations",nbiter);
1041 iteration=iteration+nbiter;
1042 strcpy(nomiteration,
"lissage de McKenzie2016");
1045 else if ((iteration>=Taubin1995_debut) && (Taubin1995_debut==next))
1048 sprintf(message,
"Lissage de Taubin1995");
1054 if (nbiter==iter_max) sprintf(message,
" Arrêt de la procédure de lissage de Taubin1995 après %d itérations",nbiter);
1055 else sprintf(message,
" Convergence de la procédure de lissage de Taubin1995 après %d itérations",nbiter);
1058 iteration=iteration+nbiter;
1059 strcpy(nomiteration,
"lissage de Taubin1995");
1061 else if ((iteration>=cardinalite_debut) && (cardinalite_debut==next))
1064 sprintf(message,
"Étude de la cardinalite des noeuds");
1067 if (nb!=cardinalite_iter)
1068 sprintf(message,
"Cardinalité des noeuds convergé");
1070 sprintf(message,
"Cardinalité des noeuds non convergé");
1072 strcpy(nomiteration,
"Cardinalité");
1073 iteration=iteration+nb;
1080 if (chen2005fait==1)
1081 if (chen2008fait==1)
1082 if (jiao2012fait==1)
1083 if (McKenzie2016fait==1)
1084 if (Taubin1995fait==1)
1085 if (cardinalitefait==1)
1087 if (strcmp(nomiteration,
"aucun lissage")!=0)
1091 fprintf(in,
"Statistique après itération %d %s\n",iteration-1,nomiteration);
1092 fprintf(in,
"Volume total=%.14le\nVolume non design=%.14le\nVolume design=%.14le\nf reel=%.14le\n\n\n\n",v,volnon,v-volnon,(v-volnon)/(voltot-volnon));
1100 if (rmimpose_debut != 0)
1103 sprintf(message,
"Suppression du non_design du resultat optimal");
1106 rmimpose(mgmai,(
char*)nomfichier.c_str());
1113 affiche((
char*)
"Extraction du maillage de surface");
1129 affiche((
char*)
" Analyse des cas non manifold");
1132 int nbmaniare,nbmanino,nbpeau;
1133 coderesu =
extract_skin(mg_mai,gest2,nbpeau,nbmaniare,nbmanino,&mai2_id);
1135 sprintf(message,
" %d peaux. %d manifold par arete. %d manifold par noeud",nbpeau,nbmaniare,nbmanino);
1138 while (coderesu == 0);
1151 LISTE_FEM_ELEMENT3::iterator it;
1155 if (tet->get_solution()>seuil)
1167 std::vector<MG_NOEUD*> lst_no_1090_1091;
1168 LISTE_MG_NOEUD::iterator it_vec;
1173 std::vector<MG_NOEUD*> lst_no_extr;
1176 for (
int i=0;i<lst_no_1090_1091.size();i++)
1178 no=lst_no_1090_1091[i];
1186 lst_no_extr.push_back(no_voisin);
1190 std::vector<std::vector<MG_NOEUD*>> lst_aretes;
1191 std::map<int,MG_NOEUD*> lst_no_voisins;
1194 void recherche_voisins(
MG_NOEUD* no, std::vector<MG_NOEUD*>* lst_no_1090_1091,std::vector<MG_NOEUD*>* arete, std::map<int,MG_NOEUD*>* lst_no_voisins,
bool arete_ouverte, std::vector<MG_NOEUD*>* lst_no_extr);
1196 bool arete_ouverte=
true;
1198 for (
int i=0;i<lst_no_extr.size();i++)
1200 std::vector<MG_NOEUD*> arete;
1202 arete.push_back(no);
1205 lst_no_voisins.clear();
1206 recherche_voisins(no,&lst_no_1090_1091,&arete,&lst_no_voisins,arete_ouverte,&lst_no_extr);
1207 if((lst_no_voisins.size()==1)||(lst_no_voisins.size()==2))
1209 arete.push_back(lst_no_voisins.begin()->second);
1210 lst_no_1090_1091.erase(lst_no_1090_1091.begin()+lst_no_voisins.begin()->first);
1211 no=lst_no_voisins.begin()->second;
1214 if(lst_no_voisins.size()==3)
1217 lst_no_1090_1091.push_back(no);
1218 lst_no_1090_1091.erase(lst_no_1090_1091.begin()+
passage_non_manifold(&no,&lst_no_voisins,geo,&arete));
1221 while(lst_no_voisins.size()!=0);
1222 if(arete.size()>6) lst_aretes.push_back(arete);
1223 else for(
int i=1;i<arete.size()-1;i++)
1228 arete_ouverte=
false;
1229 for (
int i=0;i<lst_no_1090_1091.size();i++)
1232 std::vector<MG_NOEUD*> arete;
1233 no=lst_no_1090_1091[i];
1234 arete.push_back(no);
1237 lst_no_voisins.clear();
1238 recherche_voisins(no,&lst_no_1090_1091,&arete,&lst_no_voisins,arete_ouverte,&lst_no_extr);
1239 if((lst_no_voisins.size()==1)||(lst_no_voisins.size()==2))
1241 arete.push_back(lst_no_voisins.begin()->second);
1242 lst_no_1090_1091.erase(lst_no_1090_1091.begin()+lst_no_voisins.begin()->first);
1243 no=lst_no_voisins.begin()->second;
1246 if(lst_no_voisins.size()==3)
1249 lst_no_1090_1091.push_back(no);
1250 lst_no_1090_1091.erase(lst_no_1090_1091.begin()+
passage_non_manifold(&no,&lst_no_voisins,geo,&arete));
1253 while(lst_no_voisins.size()!=0);
1254 if(arete.size()>6) lst_aretes.push_back(arete);
1256 for(
int i=0;i<arete.size()-1;i++)
1261 for(
int iter=0;iter<nb_iter;iter++)
1262 for(
int k=0;k<lst_aretes.size();k++)
1263 for(
int i=0;i<lst_aretes[k].size()-1;i++)
1267 MG_NOEUD* noeud_i=lst_aretes[k][i];
1270 if(i==0) i_prec=lst_aretes[k].size()-2;
1272 double x_i=lst_aretes[k][i]->
get_x(), x_i_prec=lst_aretes[k][i_prec]->get_x(), x_i_suiv=lst_aretes[k][i+1]->get_x();
1273 double y_i=lst_aretes[k][i]->get_y(), y_i_prec=lst_aretes[k][i_prec]->get_y(), y_i_suiv=lst_aretes[k][i+1]->get_y();
1274 double z_i=lst_aretes[k][i]->get_z(), z_i_prec=lst_aretes[k][i_prec]->get_z(), z_i_suiv=lst_aretes[k][i+1]->get_z();
1276 double delta_x=0.5*(x_i_prec+x_i_suiv)-x_i;
1277 double delta_y=0.5*(y_i_prec+y_i_suiv)-y_i;
1278 double delta_z=0.5*(z_i_prec+z_i_suiv)-z_i;
1280 double x_i_prime=x_i+lambda*delta_x;
1281 double y_i_prime=y_i+lambda*delta_y;
1282 double z_i_prime=z_i+lambda*delta_z;
1294 double un_sur_pi = 1./M_PI;
1304 LISTE_MG_TRIANGLE::iterator it_tri;
1311 liste_normales2.
ajouter(normal_f_i);
1316 for (
int j = 0;j<nb_voisins1;j++)
1319 liste_voisins.
ajouter(mgtri_1);
1323 for (
int j = 0;j<nb_voisins2;j++)
1326 liste_voisins.
ajouter(mgtri_2);
1330 for (
int j = 0;j<nb_voisins3;j++)
1333 liste_voisins.
ajouter(mgtri_3);
1336 int nb_voisins = liste_voisins.
get_nb();
1337 double w_ij = 1./nb_voisins;
1338 double phi_i_min = 10.;
1340 double phi_im = 0.0;
1341 double *phi_ij =
new double[nb_voisins];
1350 normal_f_i_mean = normal_f_i_mean + w_ij*normal_f_j;
1352 double prod_scalaire = normal_f_i*normal_f_j;
1353 if (prod_scalaire > 1.)
1357 if (prod_scalaire < -1.)
1359 prod_scalaire = -1.;
1361 phi_ij[j] =
acos(prod_scalaire)*un_sur_pi;
1363 if (phi_ij[j] < phi_i_min)
1365 phi_i_min = phi_ij[j];
1369 phi_im = phi_im + w_ij*phi_ij[j];
1372 normal_f_i_mean.
norme();
1377 s_i = s_i + w_ij*pow((phi_ij[j] - phi_im),2);
1387 OT_VECTEUR_3D normal_f_i_new = pond*normal_f_i_mean + (1. - pond)*eta_i;
1388 normal_f_i_new.
norme();
1389 liste_normales.
ajouter(normal_f_i_new);
1391 mgtri->change_nouveau_numero(k);
1395 LISTE_MG_NOEUD::iterator it_no;
1398 int nb_voisins_j = noeud_i->get_lien_triangle()->get_nb();
1399 double w_ij_prime = 0.0;
1401 OT_VECTEUR_3D v_i(noeud_i->get_x(),noeud_i->get_y(),noeud_i->get_z());
1402 for(
int j=0;j<nb_voisins_j;j++)
1409 double cj_x = 0.333333333333333*(n1->
get_x() + n2->
get_x() + n3->
get_x());
1410 double cj_y = 0.333333333333333*(n1->
get_y() + n2->
get_y() + n3->
get_y());
1411 double cj_z = 0.333333333333333*(n1->
get_z() + n2->
get_z() + n3->
get_z());
1413 OT_VECTEUR_3D vi_cj(cj_x - noeud_i->get_x(),cj_y - noeud_i->get_y(),cj_z - noeud_i->get_z());
1420 w_ij_prime = w_ij_prime + w_ij;
1421 v_temp = v_temp + w_ij*(vi_cj*normal_f_i_new)*normal_f_i_new;
1424 v_i = v_i + v_temp/w_ij_prime;
1425 int origine = noeud_i->get_origine();
1429 noeud_i->change_y(v_i.
get_y());
1430 noeud_i->change_z(v_i.
get_z());
1441 double critere = 1. - normal_f_i*normal_f_i_new;
1444 double tolerance = 0.01*nb_tri;
1445 if (nb_tri - l <= 0) fin = 1;
1448 while ((fin == 0) && (compteur < iter_max));
1459 std::vector<double> nouv_position_x;
1460 std::vector<double> nouv_position_y;
1461 std::vector<double> nouv_position_z;
1462 LISTE_MG_NOEUD::iterator it_no;
1465 int origine = noeud_i->get_origine();
1468 int nb_voisins_j = noeud_i->get_lien_triangle()->get_nb();
1470 double wij_sommej = 0.0;
1472 OT_VECTEUR_3D v_i(noeud_i->get_x(),noeud_i->get_y(),noeud_i->get_z());
1473 for(
int j=0;j<nb_voisins_j;j++)
1480 double cj_x = 0.333333333333333*(n1->
get_x() + n2->
get_x() + n3->
get_x());
1481 double cj_y = 0.333333333333333*(n1->
get_y() + n2->
get_y() + n3->
get_y());
1482 double cj_z = 0.333333333333333*(n1->
get_z() + n2->
get_z() + n3->
get_z());
1485 OT_VECTEUR_3D vi_cj(cj_x - noeud_i->get_x(),cj_y - noeud_i->get_y(),cj_z - noeud_i->get_z());
1487 wij_sommej=wij_sommej+wij;
1488 v_temp = v_temp + (wij*cj);
1491 v_i =v_temp/wij_sommej;
1492 nouv_position_x.push_back(v_i.
get_x());
1493 nouv_position_y.push_back(v_i.
get_y());
1494 nouv_position_z.push_back(v_i.
get_z());
1501 int origine = noeud_i->get_origine();
1504 noeud_i->
change_x(nouv_position_x[ind_noeud]);
1505 noeud_i->change_y(nouv_position_y[ind_noeud]);
1506 noeud_i->change_z(nouv_position_z[ind_noeud]);
1513 while (compteur < iter_max);
1520 double un_sur_pi = 1./M_PI;
1527 std::vector<double> nouv_position_x;
1528 std::vector<double> nouv_position_y;
1529 std::vector<double> nouv_position_z;
1533 LISTE_MG_TRIANGLE::iterator it_tri;
1540 liste_normales2.
ajouter(normal_f_i);
1545 for (
int j = 0;j<nb_voisins1;j++)
1548 liste_voisins.
ajouter(mgtri_1);
1552 for (
int j = 0;j<nb_voisins2;j++)
1555 liste_voisins.
ajouter(mgtri_2);
1559 for (
int j = 0;j<nb_voisins3;j++)
1562 liste_voisins.
ajouter(mgtri_3);
1565 int nb_voisins = liste_voisins.
get_nb();
1566 double w_ij = 1./nb_voisins;
1567 double phi_i_min = 10.;
1569 double phi_im = 0.0;
1570 double *phi_ij =
new double[nb_voisins];
1572 normal_f_i_mean = normal_f_i;
1580 normal_f_i_mean = normal_f_i_mean + normal_f_j;
1582 double prod_scalaire = normal_f_i*normal_f_j;
1583 if (prod_scalaire > 1.)
1587 if (prod_scalaire < -1.)
1589 prod_scalaire = -1.;
1591 phi_ij[j] =
acos(prod_scalaire)*un_sur_pi;
1593 if (phi_ij[j] < phi_i_min)
1595 phi_i_min = phi_ij[j];
1599 phi_im = phi_im + w_ij*phi_ij[j];
1602 normal_f_i_mean.
norme();
1607 s_i = s_i + w_ij*pow((phi_ij[j] - phi_im),2);
1617 OT_VECTEUR_3D normal_f_i_new = pond*normal_f_i_mean + (1. - pond)*eta_i;
1618 normal_f_i_new.
norme();
1619 liste_normales.
ajouter(normal_f_i_new);
1621 mgtri->change_nouveau_numero(k);
1625 LISTE_MG_NOEUD::iterator it_no;
1628 int origine = noeud_i->get_origine();
1631 int nb_voisins_j = noeud_i->get_lien_triangle()->get_nb();
1632 double w_ij_prime = 0.0;
1634 OT_VECTEUR_3D v_i(noeud_i->get_x(),noeud_i->get_y(),noeud_i->get_z());
1635 for(
int j=0;j<nb_voisins_j;j++)
1642 double cj_x = 0.333333333333333*(n1->
get_x() + n2->
get_x() + n3->
get_x());
1643 double cj_y = 0.333333333333333*(n1->
get_y() + n2->
get_y() + n3->
get_y());
1644 double cj_z = 0.333333333333333*(n1->
get_z() + n2->
get_z() + n3->
get_z());
1646 OT_VECTEUR_3D vi_cj(cj_x - noeud_i->get_x(),cj_y - noeud_i->get_y(),cj_z - noeud_i->get_z());
1648 v_temp = v_temp + (vi_cj*normal_f_i_new)*normal_f_i_new;
1651 v_i = v_i + (gamma/(2*nb_voisins_j))*v_temp;
1652 nouv_position_x.push_back(v_i.
get_x());
1653 nouv_position_y.push_back(v_i.
get_y());
1654 nouv_position_z.push_back(v_i.
get_z());
1662 int origine = noeud_i->get_origine();
1665 noeud_i->
change_x(nouv_position_x[ind_noeud]);
1666 noeud_i->change_y(nouv_position_y[ind_noeud]);
1667 noeud_i->change_z(nouv_position_z[ind_noeud]);
1680 double critere = 1. - normal_f_i*normal_f_i_new;
1683 double tolerance = 0.01*nb_tri;
1684 if (nb_tri - l <= 0) fin = 1;
1687 while ((fin == 0) && (compteur < iter_max));
1699 std::vector<double> nouv_position_x;
1700 std::vector<double> nouv_position_y;
1701 std::vector<double> nouv_position_z;
1702 LISTE_MG_NOEUD::iterator it_no;
1705 int origine = noeud_i->get_origine();
1712 int nb_voisins_j = noeud_i->get_lien_triangle()->get_nb();
1713 double delta_x = 0.0;
1714 double delta_y = 0.0;
1715 double delta_z = 0.0;
1716 double v_x = noeud_i->get_x();
1717 double v_y = noeud_i->get_y();
1718 double v_z = noeud_i->get_z();
1719 double multiplicateur = (1.0/nb_voisins_j);
1721 for(
int j=0;j<nb_voisins_j;j++)
1723 double v_i_x=liste_voisin.
get(j)->
get_x();
1724 double v_i_y=liste_voisin.
get(j)->
get_y();
1725 double v_i_z=liste_voisin.
get(j)->
get_z();
1726 delta_x = delta_x+(multiplicateur*(v_i_x-v_x));
1727 delta_y = delta_y+(multiplicateur*(v_i_y-v_y));
1728 delta_z = delta_z+(multiplicateur*(v_i_z-v_z));
1731 double x_prime = (v_x)+(lambda*delta_x);
1732 double y_prime = (v_y)+(lambda*delta_y);
1733 double z_prime = (v_z)+(lambda*delta_z);
1736 nouv_position_x.push_back(x_prime);
1737 nouv_position_y.push_back(y_prime);
1738 nouv_position_z.push_back(z_prime);
1745 int origine = noeud_i->get_origine();
1748 noeud_i->change_x(nouv_position_x[ind_noeud]);
1749 noeud_i->change_y(nouv_position_y[ind_noeud]);
1750 noeud_i->change_z(nouv_position_z[ind_noeud]);
1757 nouv_position_x.clear();
1758 nouv_position_y.clear();
1759 nouv_position_z.clear();
1762 int origine = noeud_i->get_origine();
1769 int nb_voisins_j = noeud_i->get_lien_triangle()->get_nb();
1770 double delta_x = 0.0;
1771 double delta_y = 0.0;
1772 double delta_z = 0.0;
1773 double v_x = noeud_i->get_x();
1774 double v_y = noeud_i->get_y();
1775 double v_z = noeud_i->get_z();
1776 double multiplicateur = (1.0/nb_voisins_j);
1778 for(
int j=0;j<nb_voisins_j;j++)
1780 double v_i_x=liste_voisin.
get(j)->
get_x();
1781 double v_i_y=liste_voisin.
get(j)->
get_y();
1782 double v_i_z=liste_voisin.
get(j)->
get_z();
1783 delta_x = delta_x+(multiplicateur*(v_i_x-v_x));
1784 delta_y = delta_y+(multiplicateur*(v_i_y-v_y));
1785 delta_z = delta_z+(multiplicateur*(v_i_z-v_z));
1788 double x_prime = (v_x)+(nu*delta_x);
1789 double y_prime = (v_y)+(nu*delta_y);
1790 double z_prime = (v_z)+(nu*delta_z);
1793 nouv_position_x.push_back(x_prime);
1794 nouv_position_y.push_back(y_prime);
1795 nouv_position_z.push_back(z_prime);
1802 int origine = noeud_i->get_origine();
1805 noeud_i->change_x(nouv_position_x[ind_noeud]);
1806 noeud_i->change_y(nouv_position_y[ind_noeud]);
1807 noeud_i->change_z(nouv_position_z[ind_noeud]);
1823 sprintf(mess,
"cycle taubin faite");
affiche(mess);
1825 sprintf(mess,
"incrémentation compt %d",compt);
affiche(mess);
1826 }
while (compt < iter_max);
1828 sprintf(mess,
"fin Taubin1995");
affiche(mess);
1837 double phi_im = 0.0;
1838 double ecart_type_i = 0.;
1846 LISTE_MG_TRIANGLE::iterator it_tri;
1853 liste_normales2.
ajouter(normal_f_i);
1858 for (
int j = 0;j<nb_voisins1;j++)
1861 liste_voisins.
ajouter(mgtri_1);
1865 for (
int j = 0;j<nb_voisins2;j++)
1868 liste_voisins.
ajouter(mgtri_2);
1872 for (
int j = 0;j<nb_voisins3;j++)
1875 liste_voisins.
ajouter(mgtri_3);
1878 int nb_voisins = liste_voisins.
get_nb();
1879 double w_ij = 1./nb_voisins;
1880 double phi_i_min = 10.;
1883 double *phi_ij =
new double[nb_voisins];
1885 normal_f_i_mean = normal_f_i;
1889 double un_sur_pi = 1./M_PI;
1894 normal_f_i_mean = normal_f_i_mean + normal_f_j;
1896 double prod_scalaire = normal_f_i*normal_f_j;
1897 if (prod_scalaire > 1.)
1901 if (prod_scalaire < -1.)
1903 prod_scalaire = -1.;
1905 phi_ij[j] =
acos(prod_scalaire)*un_sur_pi;
1907 if (phi_ij[j] < phi_i_min)
1909 phi_i_min = phi_ij[j];
1913 phi_im = phi_im + w_ij*phi_ij[j];
1916 normal_f_i_mean.
norme();
1921 s_i = s_i + w_ij*pow((phi_ij[j] - phi_im),2);
1926 ecart_type_i =
sqrt(s_i);
1929 while (ecart_type == 0);
1933 *vari2 = ecart_type_i;
1942 std::vector<double> coord_x;
1943 std::vector<double> coord_y;
1944 std::vector<double> coord_z;
1945 std::vector<double> vecteur_original;
1946 LISTE_MG_NOEUD::iterator it_no;
1953 coord_x.push_back(noeud->get_x());
1954 coord_y.push_back(noeud->get_y());
1955 coord_z.push_back(noeud->get_z());
1956 vecteur_original.push_back(
sqrt(coord_x[ii]*coord_x[ii] + coord_y[ii]*coord_y[ii] + coord_z[ii]*coord_z[ii]));
1965 sprintf(mess,
"Depart Taubin1995");
affiche(mess);
1966 double v_initial = 0.0;
1967 double v_final = 0.0;
1968 double v_taubin = 0.0;
1969 double v_taubin_prime = 0.0;
1970 double d_initial = 0.0;
1971 double d_final = 0.0;
1972 double d_taubin = 0.0;
1974 double sigma_ = sigma;
1977 double phi_im = 0.0;
1978 double ecart_type_i = 0.;
1979 int compteur_triangle_retourne =0;
1980 int compteur_total = 0;
1981 int compteur_taubin_initial = 0;
1982 int compteur_chen = 0;
1983 int compteur_taubin_chen = 0;
1984 int compteur_taubin_final = 0;
1985 int compteur_temp = 0;
1986 int compteur_taubin2D = 0;
1987 int triangle_final_retourne =0;
1988 int iter_taubin = itr_taubin;
1992 int activationPI = 1;
1993 int activationPI2 = 1;
1994 double condition_de_varience = 1000.0;
1995 int taubin_premiere_passe = 0;
2006 double varience_ori0 = 10.0;
2007 double varience_ori1 = 10.0;
2008 double varience_ori2 = 10.0;
2010 sprintf(mess,
" Moyenne des normes des triangles de la surface : %f",varience_ori0);
affiche(mess);
2011 sprintf(mess,
" Varience des normes des triangles de la surface : %f",varience_ori1);
affiche(mess);
2012 sprintf(mess,
" Ecart type des normes des triangles de la surface : %f",varience_ori2);
affiche(mess);
2016 v_taubin_prime = v_taubin;
2023 if (activationPI==1)
2025 if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))<-0.1)
2029 if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))>0.1)
2033 if (fabs(v_taubin)>(fabs(v_initial)*1.015))
2037 if (fabs(v_taubin)<(fabs(v_initial)*0.985))
2051 double qualmin,qualmax,qualmoy;
2054 int nbretourne=tab[0];
2061 compteur_triangle_retourne++;
2063 sprintf(mess,
"Triangle retourné");
2066 compteur_taubin_initial++;
2071 double varience0 = 0.0;
2072 double varience1 =0.0;
2073 double varience2 =0.0;
2076 if (((compteur_temp >= iter_taubin)&&(varience1<0.0275))||(compteur_taubin_initial >(2*iter_taubin)))
2078 taubin_premiere_passe = 1;
2083 while (taubin_premiere_passe == 0);
2093 sprintf(mess,
"Début de Chen pour %d iterations avec Taubin qui résoud les triangles retournés",iter_max);
affiche(mess);
2103 double qualmin,qualmax,qualmoy;
2106 int triangleretourner =tab[0];
2108 if (triangleretourner >0)
2112 v_taubin_prime = v_taubin;
2119 if (activationPI2 = 1)
2122 if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))<-0.1)
2127 if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))>0.1)
2132 if (fabs(v_taubin)>(fabs(v_initial)*1.015))
2136 if (fabs(v_taubin)<(fabs(v_initial)*0.985))
2145 triangleretourner = 1;
2146 sprintf(mess,
"Trianlge retourner pas régler");
affiche(mess);
2151 triangleretourner = 0;
2152 sprintf(mess,
"Trianlge retourner régler");
affiche(mess);
2154 compteur_triangle_retourne++;
2155 compteur_taubin_chen++;
2159 while ((triangleretourner > 0));
2167 while (compteur_chen < iter_max);
2169 sprintf(mess,
"Début du retour de volume avec Taubin1995 qui résoud les triangles retournés");
affiche(mess);
2172 if ((fabs(fabs(v_initial)-fabs(v_taubin)))>(0.02*(fabs(v_initial))))
2176 v_taubin_prime = v_taubin;
2183 if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))<-0.1)
2186 sprintf(mess,
"ajustement mineur 1");
affiche(mess);
2189 if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))>0.1)
2192 sprintf(mess,
"ajustement mineur 2");
affiche(mess);
2195 if (fabs(v_taubin)>(fabs(v_initial)*1.015))
2198 sprintf(mess,
"ajustement majeur 1");
affiche(mess);
2200 if (fabs(v_taubin)<(fabs(v_initial)*0.985))
2203 sprintf(mess,
"ajustement majeur 2");
affiche(mess);
2205 sprintf(mess,
"Volume: %f\n old vol: %f\n nu_: %f\n",v_taubin,v_taubin_prime, nu_);
affiche(mess);
2214 double qualmin,qualmax,qualmoy;
2217 int triangleretourner =tab[0];
2220 compteur_triangle_retourne++;
2221 sprintf(mess,
"Triangle retourné");
2223 triangle_final_retourne =1;
2225 else{triangle_final_retourne =0;}
2227 compteur_taubin_final++;
2232 while ((triangle_final_retourne ==0)&&(fabs(v_initial-v_taubin)>(fabs(0.02*v_initial))));
2244 double dismin=1e300,dismax=-1e300;
2245 double disminx=1e300,dismaxx=-1e300;
2246 double disminy=1e300,dismaxy=-1e300;
2247 double disminz=1e300,dismaxz=-1e300;
2248 double xmin=1e300,xmax=-1e300;
2249 double ymin=1e300,ymax=-1e300;
2250 double zmin=1e300,zmax=-1e300;
2255 double x=noeud->get_x();
2256 double y=noeud->get_y();
2257 double z=noeud->get_z();
2264 double dx=fabs(noeud->get_x()-coord_x[ii]);
2265 double dy=fabs(noeud->get_y()-coord_y[ii]);
2266 double dz=fabs(noeud->get_z()-coord_z[ii]);
2267 double dis=
sqrt(dx*dx+dy*dy+dz*dz);
2268 if (dx>dismaxx) dismaxx=dx;
2269 if (dx<disminx) disminx=dx;
2270 if (dy>dismaxy) dismaxy=dy;
2271 if (dy<disminy) disminy=dy;
2272 if (dz>dismaxz) dismaxz=dz;
2273 if (dz<disminz) disminz=dz;
2274 if (dis>dismax) dismax=dis;
2275 if (dis<dismin) dismin=dis;
2285 sprintf(mess,
"Déplacement absolu minimum en X : %f en Y : %f en Z : %f en amplitude : %f",disminx,disminy,disminz,dismin);
affiche(mess);
2286 sprintf(mess,
"Déplacement absolu maximum en X : %f en Y : %f en Z : %f en amplitude : %f",dismaxx,dismaxy,dismaxz,dismax);
affiche(mess);
2287 sprintf(mess,
"Déplacement absolu moyen (tous les noeuds) en X : %f en Y : %f en Z : %f en amplitude : %f",distotx/ii,distoty/ii,distotz/ii,distot/ii);
affiche(mess);
2288 sprintf(mess,
"Déplacement absolu moyen (les noeuds du non design) en X : %f en Y : %f en Z : %f en amplitude : %f",distotx/numdepla,distoty/numdepla,distotz/numdepla,distot/numdepla);
affiche(mess);
2289 double dx=xmax-xmin;
2290 double dy=ymax-ymin;
2291 double dz=zmax-zmin;
2293 if (dy>dmax) dmax=dy;
2294 if (dz>dmax) dmax=dz;
2295 sprintf(mess,
"Déplacement relatif moyen (tous les noeuds) en X : %f%% en Y : %f%% en Z : %f%% en amplitude : %f%%",distotx/ii/dx*100.,distoty/ii/dy*100.,distotz/ii/dz*100.,distot/ii/dmax*100.);
affiche(mess);
2296 sprintf(mess,
"Déplacement relatif moyen (les noeuds du non design) en X : %f%% en Y : %f%% en Z : %f%% en amplitude : %f%%",distotx/numdepla/dx*100.,distoty/numdepla/dy*100.,distotz/numdepla/dz*100.,distot/numdepla/dmax*100.);
affiche(mess);
2308 double delta_vol = v_final-v_initial;
2309 double vol_pourcent = (v_final/v_initial)*100;
2310 double delta_vol_pourcent = vol_pourcent-100;
2311 sprintf(mess,
"Volume initial: %f",v_initial);
affiche(mess);
2312 sprintf(mess,
"Volume final: %f",v_final);
affiche(mess);
2313 sprintf(mess,
"Volume final pourcentage: %f%%",vol_pourcent);
affiche(mess);
2314 sprintf(mess,
"Delta Volume: %f",delta_vol);
affiche(mess);
2315 sprintf(mess,
"Delta Volume pourcentage: %f%%",delta_vol_pourcent);
affiche(mess);
2316 sprintf(mess,
" Iteration inital Taubin1995: %i",compteur_taubin_initial);
affiche(mess);
2317 sprintf(mess,
" Iteration Chen2008: %i",compteur_chen);
affiche(mess);
2318 sprintf(mess,
" Iteration Taubin1995 dans Chen2008: %i",compteur_taubin_chen);
affiche(mess);
2320 sprintf(mess,
" sigma: %f",sigma);
affiche(mess);
2321 sprintf(mess,
" gamma_: %f",gamma_);
affiche(mess);
2322 sprintf(mess,
" filtre: %i",filtre);
affiche(mess);
2323 sprintf(mess,
" Iteration final Taubin1995: %i",compteur_taubin_final);
affiche(mess);
2324 sprintf(mess,
" lambda(depart): %f",lambda);
affiche(mess);
2325 sprintf(mess,
" nu(depart):%f",nu);
affiche(mess);
2326 sprintf(mess,
" nu(fin):%f",nu_);
affiche(mess);
2327 sprintf(mess,
" Iteration triangle retourné: %i",compteur_triangle_retourne);
affiche(mess);
2328 sprintf(mess,
" Iteration Total: %i",compteur_total);
affiche(mess);
2333 double eps_angle_retourne=0.03;
2339 double qualmin,qualmax,qualmoy;
2342 sprintf(mess,
"\n\nANALYSEUR DE MG MAILLAGE 2D");
affiche(mess);
2343 sprintf(mess,
" Nombre de triangles avec des noeuds fusionnés : %d",tab[6]);
affiche(mess);
2344 sprintf(mess,
" Nombre de triangles avec 1 voisin manquant : %d",tab[5]);
affiche(mess);
2345 sprintf(mess,
" critere d'angle limite pour l'inversion : %lf",eps_angle_retourne);
affiche(mess);
2346 sprintf(mess,
" qualite moyenne des triangles de frontiere : %lf",qualmoy);
affiche(mess);
2347 sprintf(mess,
" qualite min des triangles de frontiere : %lf",qualmin);
affiche(mess);
2348 sprintf(mess,
" qualite max des triangles de frontiere : %lf",qualmax);
affiche(mess);
2349 sprintf(mess,
" nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne3,tab[4],tab[4]*100./mg_mai->
get_nb_mg_triangle());
affiche(mess);
2350 sprintf(mess,
" nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne2,tab[3],tab[3]*100./mg_mai->
get_nb_mg_triangle());
affiche(mess);
2351 sprintf(mess,
" nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne1,tab[2],tab[2]*100./mg_mai->
get_nb_mg_triangle());
affiche(mess);
2352 sprintf(mess,
" nombre de triangles de frontiere >%lf : %d (%.2lf%%)",0.,tab[1],tab[1]*100./mg_mai->
get_nb_mg_triangle());
affiche(mess);
2353 sprintf(mess,
" nombre de triangles de frontiere retournes : %d (%.2lf%%)",tab[0],tab[0]*100./mg_mai->
get_nb_mg_triangle());
affiche(mess);
2355 double varience00 =0.0;
2356 double varience11 =0.0;
2357 double varience22 =0.0;
2359 sprintf(mess,
"\n Moyenne des normes des triangles de la surface : %f",varience00);
affiche(mess);
2360 sprintf(mess,
" Varience des normes des triangles de la surface : %f",varience11);
affiche(mess);
2361 sprintf(mess,
" Ecart type des normes des triangles de la surface : %f",varience22);
affiche(mess);
2363 return compteur_total;
2372 LISTE_MG_TRIANGLE::iterator it_tri;
2375 mgtri->change_nouveau_numero(0);
2378 LISTE_MG_NOEUD::iterator it_noeud;
2381 mgnoeud->change_nouveau_numero(0);
2384 LISTE_MG_TETRA::iterator it_tetra;
2387 int origine = mgtet->get_origine();
2411 int num1 = mgtet->get_triangle1()->get_nouveau_numero();
2412 int num2 = mgtet->get_triangle2()->get_nouveau_numero();
2413 int num3 = mgtet->get_triangle3()->get_nouveau_numero();
2414 int num4 = mgtet->get_triangle4()->get_nouveau_numero();
2419 mgtet->get_triangle1()->change_nouveau_numero(num1);
2420 mgtet->get_triangle2()->change_nouveau_numero(num2);
2421 mgtet->get_triangle3()->change_nouveau_numero(num3);
2422 mgtet->get_triangle4()->change_nouveau_numero(num4);
2428 int num = mgtri->get_nouveau_numero();
2431 MG_NOEUD* noeud1 = mgtri->get_noeud1();
2432 MG_NOEUD* noeud2 = mgtri->get_noeud2();
2433 MG_NOEUD* noeud3 = mgtri->get_noeud3();
2453 std::map<unsigned long,unsigned long> correspondidsom;
2454 std::map<unsigned long,unsigned long> correspondid;
2455 LISTE_MG_SOMMET::iterator its;
2458 if (som->get_nb_ccf()>0)
2463 correspondidsom[som->get_id()]=somno->
get_id();
2466 LISTE_MG_ARETE::iterator ita;
2469 if (are->get_nb_ccf()>0)
2474 correspondid[are->get_id()]=areel->
get_id();
2477 LISTE_MG_FACE::iterator itf;
2480 if (face->get_nb_ccf()>0)
2485 correspondid[face->get_id()]=facel->
get_id();
2497 int num = mgnoeud->get_nouveau_numero();
2500 double x = mgnoeud->get_x();
2501 double y = mgnoeud->get_y();
2502 double z = mgnoeud->get_z();
2504 int nb_tri=mgnoeud->get_lien_triangle()->get_nb();
2505 bool tri2d=
false,tri3d=
false;
2506 for (
int i=0;i<nb_tri;i++)
2508 if (mgnoeud->get_lien_triangle()->get(i)->get_nouveau_numero()==1)
2510 if (mgnoeud->get_lien_triangle()->get(i)->get_lien_topologie()->get_dimension()==2) tri2d=
true;
2511 if (mgnoeud->get_lien_triangle()->get(i)->get_lien_topologie()->get_dimension()==3) tri3d=
true;
2518 std::map<unsigned long,unsigned long>::iterator it=correspondidsom.find(mgnoeud->get_lien_topologie()->get_id());
2519 if (it!=correspondidsom.end())
2522 if (it!=correspondidsom.end())
2532 int originetet=mgtet->get_origine();
2540 MG_NOEUD* noeud1 = mgtet->get_noeud1();
2541 MG_NOEUD* noeud2 = mgtet->get_noeud2();
2542 MG_NOEUD* noeud3 = mgtet->get_noeud3();
2543 MG_NOEUD* noeud4 = mgtet->get_noeud4();
2559 if (it!=correspondid.end())
2561 MG_TRIANGLE_PEAU* tripeau =
insere_triangle(geo,mg_mai,noeud1,noeud2,noeud3,correspondid,topo,node1,node2,node3,mai2,origine);
2572 if (it!=correspondid.end())
2574 MG_TRIANGLE_PEAU* tripeau =
insere_triangle(geo,mg_mai,noeud1,noeud4,noeud2,correspondid,topo,node1,node4,node2,mai2,origine);
2585 if (it!=correspondid.end())
2587 MG_TRIANGLE_PEAU* tripeau =
insere_triangle(geo,mg_mai,noeud2,noeud4,noeud3,correspondid,topo,node2,node4,node3,mai2,origine);
2598 if (it!=correspondid.end())
2600 MG_TRIANGLE_PEAU* tripeau =
insere_triangle(geo,mg_mai,noeud1,noeud3,noeud4,correspondid,topo,node1,node3,node4,mai2,origine);
2626 std::vector<MG_TRIANGLE_PEAU*> *peau=
new std::vector<MG_TRIANGLE_PEAU*>;
2629 peau->push_back(tripeau);
2636 LISTE_MG_SEGMENT::iterator itseg;
2638 seg->change_nouveau_numero(0);
2643 for (
int i=0;i<nbpeau;i++)
2646 for (
int j=0;j<nbtri;j++)
2661 int nbnonmanifoldarete=nonmanifoldarete.
get_nb();
2662 for (
int i=0;i<nbnonmanifoldarete;i++)
2667 nonmanifoldnoeuddepuisarete.
ajouter(n1);
2668 nonmanifoldnoeuddepuisarete.
ajouter(n2);
2670 LISTE_MG_NOEUD::iterator itnoeud;
2673 if (nonmanifoldnoeuddepuisarete.
existe(no))
continue;
2677 nbmaniare = nonmanifoldarete.
get_nb();
2678 nbmanino = nonmanifoldnoeud.
get_nb();
2680 for (
int i=0;i<nbnonmanifoldarete;i++)
2686 for (
int j=0;j<nb_tetra;j++)
2697 if((no1 == noeud2) ||(no2 == noeud2) || (no3 == noeud2) || (no4 == noeud2))
2703 int nbnonmanifoldnoeud=nonmanifoldnoeud.
get_nb();
2704 for (
int i=0;i<nbnonmanifoldnoeud;i++)
2708 for (
int j = 0;j<nb_tetra;j++)
2718 *mai2_id = mai2->
get_id();
2719 if ((nbnonmanifoldarete != 0) || (nbnonmanifoldnoeud != 0))
2721 for (
int i=0;i<
lst_peau.size();i++)
2736 for (
int i=0;i<cardinalite_iter;i++)
2739 LISTE_MG_NOEUD::iterator it;
2741 if (no->get_lien_triangle()->get_nb()==3)
2750 sprintf(message,
" Itération %d, nombre de noeuds de cardinalite 3 : %d",i+1,nbcas);
2752 if (nbcas==0)
return i;
2753 for (
int j=0;j<nbcas;j++)
2770 for (
int k=0;k<3;k++)
2800 return cardinalite_iter;
2816 LISTE_MG_TRIANGLE::iterator itt;
2817 LISTE_MG_NOEUD::iterator itn;
2823 lstno.
ajouter(tri->get_noeud1());
2824 lstno.
ajouter(tri->get_noeud2());
2825 lstno.
ajouter(tri->get_noeud3());
2831 double x = mgnoeud->get_x();
2832 double y = mgnoeud->get_y();
2833 double z = mgnoeud->get_z();
2835 node->change_nouveau_numero(mgnoeud->get_id());
2840 MG_NOEUD* noeud1 = mgtri->get_noeud1();
2841 MG_NOEUD* noeud2 = mgtri->get_noeud2();
2842 MG_NOEUD* noeud3 = mgtri->get_noeud3();
2848 if (mgnoeud->get_nouveau_numero() == noeud1->
get_id()) no1 = mgnoeud;
2849 if (mgnoeud->get_nouveau_numero() == noeud2->
get_id()) no2 = mgnoeud;
2850 if (mgnoeud->get_nouveau_numero() == noeud3->
get_id()) no3 = mgnoeud;
2861 while (num!=peau->size())
2883 MG_TRIANGLE_PEAU*
MGOPT_POSTTRAITEMENT::insere_triangle(
MG_GEOMETRIE* geo,
MG_MAILLAGE* maiori,
MG_NOEUD* n1ori,
MG_NOEUD* n2ori,
MG_NOEUD* n3ori,std::map<unsigned long,unsigned long> &correspondid,
MG_ELEMENT_TOPOLOGIQUE* topo,
class MG_NOEUD *mgnoeud1,
class MG_NOEUD *mgnoeud2,
class MG_NOEUD *mgnoeud3,
MG_MAILLAGE* mg_maillage,
int origine)
2888 if (mgsegment1==NULL)
2893 std::map<unsigned long,unsigned long>::iterator it=correspondid.find(toposeg->
get_id());
2894 if (it!=correspondid.end())
2898 if (mgsegment2==NULL)
2903 std::map<unsigned long,unsigned long>::iterator it=correspondid.find(toposeg->
get_id());
2904 if (it!=correspondid.end())
2908 if (mgsegment3==NULL)
2913 std::map<unsigned long,unsigned long>::iterator it=correspondid.find(toposeg->
get_id());
2914 if (it!=correspondid.end())
2928 if (mgsegment1==NULL)
2930 if (mgsegment2==NULL)
2932 if (mgsegment3==NULL)
2941 double angleref=4.*M_PI;
2944 for (
int i=0;i<nb1;i++)
2945 for (
int j=0;j<nb2;j++)
2961 static int compteur=0;
2965 for (
int i=0;i<nb_tri;i++)
2990 while (tricour!=premier_triangle);
3004 double angle=get_angle_par_noeud<MG_NOEUD*>(noeud1,noeud2,noeud3,noeud4,noeud5,noeud6);
3011 w_s = exp(-(s*s)/(2.*sigma*sigma));
3018 w_s = exp(-(
sqrt(2.)*fabs(s))/sigma);
3025 w_s = 1./
sqrt(1+pow((s/sigma),2));
3035 std::map<int,MG_NOEUD*>::iterator it_map;
3037 for(
int i=0;i<(*no)->get_lien_segment()->get_nb();i++)
3039 seg=(*no)->get_lien_segment()->get(i);
3047 no_voisin=(*arete)[arete->size()-2];
3049 for(
int i=0;i<lst_no_voisins->size();i++)
3052 while((j<no_voisin->get_lien_segment()->get_nb())&&!find)
3058 for(it_map=lst_no_voisins->begin();it_map!=lst_no_voisins->end();it_map++)
3059 if((it_map->second->get_lien_segment()->est_dans_la_liste(seg))&&seg_valide)
3061 no_voisin=it_map->second;
3063 lst_no_voisins->erase(it_map);
3070 arete->push_back(no_voisin);
3077 void recherche_voisins(
MG_NOEUD* no,std::vector<MG_NOEUD*>* lst_no_1090_1091,std::vector<MG_NOEUD*>* arete,std::map<int,MG_NOEUD*>* lst_no_voisins,
bool arete_ouverte,std::vector<MG_NOEUD*>* lst_no_extr)
3088 for(
int k=0;k<lst_no_1090_1091->size();k++)
3089 if(((*lst_no_1090_1091)[k]==no_voisin)&&seg_bord&&(no_voisin!=(*arete)[arete->size()-2]))
3091 (*lst_no_voisins)[k]=no_voisin;
3095 for(
int k=0;k<lst_no_extr->size();k++)
3096 if(((*lst_no_extr)[k]==no_voisin))
3098 arete->push_back(no_voisin);
3099 lst_no_extr->erase(lst_no_extr->begin()+k);