ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/aster/src/mgopt_posttraitement.cpp
Revision: 833
Committed: Wed Oct 5 16:15:52 2016 UTC (8 years, 7 months ago) by francois
File size: 117070 byte(s)
Log Message:
resolution du bug de chois entre les methodes de lissage

File Contents

# User Rev Content
1 francois 222 #include "gestionversion.h"
2 francois 460 #include "mgopt_posttraitement.h"
3 francois 222 #include "fem_solution.h"
4     #include "fem_maillage.h"
5     #include "mg_maillage.h"
6     #include "mg_gestionnaire.h"
7     #include "mg_triangle_peau.h"
8 francois 335 #include "mg_geometrie_outils.h"
9 francois 412 #include "fem_maillage_outils.h"
10 francois 388 #include "tpl_fonctions_generiques.h"
11 cuillier 438 #include "ot_algorithme_geometrique.h"
12 francois 805 #include "mg_maillage_outils.h"
13     #include "mailleur_analyse.h"
14 francois 830 #include "mg_arete_element.h"
15 francois 793 #include "mg_face_element.h"
16 francois 830 #include "mg_volume_element.h"
17     #include "mg_sommet_noeud.h"
18 francois 343 #include "mg_export.h"
19 francois 222 #include <stdio.h>
20 picher 230 #include <stdlib.h>
21     #include <time.h>
22 francois 222 #include <string.h>
23 francois 224 #include <math.h>
24 nana 629 #include <complex>
25 mckenzie 798 //ajout pour pouvoir utiliser les fonction venat de mailleur_analyse.cpp
26     #include "mailleur_analyse.h"
27     #include "m3d_triangle.h"
28     #include "fct_taille.h"
29     #include "mg_segment.h"
30 francois 222 //---------------------------------------------------------------------------
31    
32    
33 francois 224
34 francois 460 MGOPT_POSTTRAITEMENT::MGOPT_POSTTRAITEMENT():affichageactif(0)
35 francois 222 {
36 francois 224 for (int i=0;i<9;i++) etat[i]=0;
37 francois 457 params.ajouter("decoupage",0.,OT_PARAMETRES::DOUBLE,"0. découpage en conservant les mailles entieres 1. découpage par isodensite");
38 nana 629 params.ajouter("seuil",0.5,OT_PARAMETRES::DOUBLE,"Valeur du seuil de densité pour les 2 découpages");
39 francois 457 params.ajouter("nomdensextra","densiteextra.sol",OT_PARAMETRES::STRING,"Nom du fichier comportant la solution de la densité extrapolé au noeud");
40     params.ajouter("consimpose",1.,OT_PARAMETRES::DOUBLE,"0. Maillage non design non inclus dans le decoupage par mailles entieres 1. Maillage design inclus");
41     params.ajouter("consoptimise",1.,OT_PARAMETRES::DOUBLE,"0. Maillage optimise non inclus dans le decoupage par mailles entieres 1. Maillage optimise inclus");
42     params.ajouter("consnooptimise",0.,OT_PARAMETRES::DOUBLE,"0. Maillage non optimise non inclus dans le decoupage par mailles entieres 1. Maillage non optimise inclus");
43     params.ajouter("reactivation",1.,OT_PARAMETRES::DOUBLE,"1. Reactivation de mailles isolées sur le long des aretes 0. non reactivation");
44 nana 629 params.ajouter("chen2005_debut",0.,OT_PARAMETRES::DOUBLE,"Numero d'itération du debut d'application du lissage de chen2005 0. méthode non utilisee");
45     params.ajouter("chen2005_itermax",10.,OT_PARAMETRES::DOUBLE,"Nombre d'itérations maximales du lissage de chen2005");
46 francois 457 params.ajouter("chen2005_epsilon",0.01,OT_PARAMETRES::DOUBLE,"Critere de convergence du lissage de chen2005");
47 francois 458 params.ajouter("chen2005_sigma",0.1,OT_PARAMETRES::DOUBLE,"Écart type du filtre de lissage de chen2005");
48     params.ajouter("chen2005_filtre",1.,OT_PARAMETRES::DOUBLE,"Choix du filtre de lissage de chen2005 1. Gaussian 2.Laplacien 3.elfallahford");
49 francois 457 params.ajouter("chen2008_debut",0.,OT_PARAMETRES::DOUBLE,"Numero d'itération du debut d'application deu lissage de chen2008 0. méthode non utilisee");
50 nana 629 params.ajouter("chen2008_itermax",10.,OT_PARAMETRES::DOUBLE,"Nombre d'itérations maximales du lissage de chen2008");
51 francois 457 params.ajouter("chen2008_epsilon",0.01,OT_PARAMETRES::DOUBLE,"Critere de convergence du lissage de chen2008");
52 francois 458 params.ajouter("chen2008_sigma",0.1,OT_PARAMETRES::DOUBLE,"Écart type du filtre de lissage de chen2008");
53 francois 457 params.ajouter("chen2008_gamma",1.,OT_PARAMETRES::DOUBLE,"Vitesse d'avancement de déplacement du lissage de chen2008");
54 francois 458 params.ajouter("chen2008_filtre",1.,OT_PARAMETRES::DOUBLE,"Choix du filtre de lissage de chen2008 1. Gaussian 2.Laplacien 3.elfallahford");
55 francois 457 params.ajouter("jiao2012_debut",0.,OT_PARAMETRES::DOUBLE,"Numero d'itération du debut d'application deu lissage de jiao2012 0. méthode non utilisee");
56 nana 629 params.ajouter("jiao2012_itermax",10.,OT_PARAMETRES::DOUBLE,"Nombre d'itérations maximales du lissage de jioa2012");
57 mckenzie 804 params.ajouter("McKenzie2016_debut",0.,OT_PARAMETRES::DOUBLE,"Numero d'itération du debut d'application du lissage de McKenzie2016 0. méthode non utilisee");
58     params.ajouter("McKenzie2016_lambda",0.33,OT_PARAMETRES::DOUBLE,"Paramète lambda, la valeur doit être positive");
59     params.ajouter("McKenzie2016_nu",-0.34,OT_PARAMETRES::DOUBLE,"Paramète nu, la valeur doit être negative et respecter 0<lambda<(-nu)");
60     params.ajouter("McKenzie2016_epsilon", 0.01000, OT_PARAMETRES::DOUBLE,"Critere de convergence du lissage de chen2008");
61     params.ajouter("McKenzie2016_sigma", 0.10000, OT_PARAMETRES::DOUBLE,"Écart type du filtre de lissage de chen2008");
62     params.ajouter("McKenzie2016_gamma_", 1.0, OT_PARAMETRES::DOUBLE,"Vitesse d'avancement de déplacement du lissage de chen2008");
63     params.ajouter("McKenzie2016_filtre", 1.0, OT_PARAMETRES::DOUBLE,"Choix du filtre de lissage de chen2008 1. Gaussian 2.Laplacien 3.elfallahford");
64     params.ajouter("McKenzie2016_itertaubmax",100.,OT_PARAMETRES::DOUBLE,"Nombre d'itérations maximales de la partie taubin du lissage de McKenzie2016");
65     params.ajouter("McKenzie2016_itermax",100.,OT_PARAMETRES::DOUBLE,"Nombre d'itérations maximales de la partie chen 2008 du lissage de McKenzie2016");
66     params.ajouter("Taubin1995_debut",0.,OT_PARAMETRES::DOUBLE,"Numero d'itération du debut d'application du lissage de Taubin1995 0. méthode non utilisee");
67     params.ajouter("Taubin1995_lambda",0.33,OT_PARAMETRES::DOUBLE,"Paramète lambda, la valeur doit être positive et moins de 1");
68     params.ajouter("Taubin1995_nu",-0.34,OT_PARAMETRES::DOUBLE,"Paramète nu, la valeur doit être negative et respecter 0<lambda<(-nu)");
69     params.ajouter("Taubin1995_itermax",100.,OT_PARAMETRES::DOUBLE,"Nombre d'itérations maximales du lissage Taubin1995");
70 francois 832 params.ajouter("cardinalite_debut",0.,OT_PARAMETRES::DOUBLE,"Numero d'itération du debut d'application de l'étude de cardinalite des noeuds");
71     params.ajouter("cardinalite_iter",2.,OT_PARAMETRES::DOUBLE,"Nombre d'itérations maximales de l'étude de cardinalite des noeuds");
72 francois 222 }
73    
74    
75 francois 460 MGOPT_POSTTRAITEMENT::~MGOPT_POSTTRAITEMENT()
76 francois 222 {
77 francois 224 for (int i=0;i<lst_peau.size();i++)
78     delete lst_peau[i];
79 francois 222 }
80 picher 233
81 francois 460 void MGOPT_POSTTRAITEMENT::active_affichage(void (*fonc)(char*))
82 francois 232 {
83     affiche=fonc;
84     affichageactif=1;
85     }
86 francois 222
87 picher 233
88 francois 457
89 francois 461 void MGOPT_POSTTRAITEMENT::posttraite(char *fichier)
90 francois 457 {
91     affiche((char*)"");
92     affiche((char*)"***********************************************************");
93     affiche((char*)"Post-traitement d'un calcul d'optimisation de topologie");
94     affiche((char*)"***********************************************************");
95     affiche((char*)"");
96     affiche((char*)"");
97     affiche((char*)"");
98     affiche((char*)"Écriture d'un fichier de parametres par défaut");
99     params.enregistrer(fichier);
100     }
101    
102    
103    
104 francois 460 void MGOPT_POSTTRAITEMENT::conserve(int origine)
105 francois 224 {
106     etat[(origine-1000)/10]=1;
107     }
108    
109 picher 233
110 francois 460 void MGOPT_POSTTRAITEMENT::copieorigine(FEM_MAILLAGE* mai)
111 picher 231 {
112 francois 309 LISTE_FEM_ELEMENT3::iterator it_tetra;
113     for (FEM_ELEMENT3* tet=mai->get_premier_element3(it_tetra);tet!=NULL;tet=mai->get_suivant_element3(it_tetra))
114 picher 233 {
115     MG_TETRA* mgtet=(MG_TETRA*)tet->get_mg_element_maillage();
116     mgtet->change_origine(mgtet->get_origine());
117     }
118     }
119 francois 457
120    
121 francois 830 void MGOPT_POSTTRAITEMENT::calcul_volume_ini(MG_MAILLAGE* mg_mai, double *volumetot,double *volumenondesign)
122 picher 233 {
123     LISTE_MG_TETRA::iterator it_tetra;
124     double volume_initial = 0.;
125     double volume_final = 0.;
126     for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
127     {
128     int originetet=mgtet->get_origine();
129     MG_NOEUD* noeud1 = mgtet->get_noeud1();
130     double x1 = noeud1->get_x();
131     double y1 = noeud1->get_y();
132     double z1 = noeud1->get_z();
133     MG_NOEUD* noeud2 = mgtet->get_noeud2();
134     double x2 = noeud2->get_x();
135     double y2 = noeud2->get_y();
136     double z2 = noeud2->get_z();
137     MG_NOEUD* noeud3 = mgtet->get_noeud3();
138     double x3 = noeud3->get_x();
139     double y3 = noeud3->get_y();
140     double z3 = noeud3->get_z();
141     MG_NOEUD* noeud4 = mgtet->get_noeud4();
142     double x4 = noeud4->get_x();
143     double y4 = noeud4->get_y();
144     double z4 = noeud4->get_z();
145     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));
146     volume_tet = volume_tet/6.;
147     volume_initial = volume_initial + volume_tet;
148 francois 830 if (originetet == MAGIC::ORIGINE::IMPOSE)
149 picher 233 {
150     volume_final = volume_final + volume_tet;
151     }
152     }
153 francois 830 *volumetot=volume_initial;
154     *volumenondesign=volume_final;
155 picher 233 }
156 francois 457
157 francois 460 void MGOPT_POSTTRAITEMENT::reactivation(MG_MAILLAGE* mg_mai,MG_GESTIONNAIRE& gest2)
158 picher 233 {
159 francois 457 cout << " Reactivation d'elements manquants sur aretes vives et faces planes" << endl;
160 picher 233 LISTE_MG_TETRA::iterator it_tetra;
161     for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
162     {
163     int originetet=mgtet->get_origine();
164     int compteur = 0;
165 francois 791 if (originetet == MAGIC::ORIGINE::MAILLEUR_AUTO)
166 picher 233 {
167     MG_TRIANGLE* tri1 = mgtet->get_triangle1();
168     MG_TRIANGLE* tri2 = mgtet->get_triangle2();
169     MG_TRIANGLE* tri3 = mgtet->get_triangle3();
170     MG_TRIANGLE* tri4 = mgtet->get_triangle4();
171     int nb_tet1 = tri1->get_lien_tetra()->get_nb();
172     for (int k = 0;k<nb_tet1;k++)
173     {
174     MG_TETRA* tet1 = tri1->get_lien_tetra()->get(k);
175     int ori1 = tet1->get_origine();
176 francois 791 if ((tet1 != mgtet) && (ori1 == MAGIC::ORIGINE::MAILLEUR_AUTO)) compteur++;
177 picher 233 }
178     int nb_tet2 = tri2->get_lien_tetra()->get_nb();
179     for (int k = 0;k<nb_tet2;k++)
180     {
181     MG_TETRA* tet2 = tri2->get_lien_tetra()->get(k);
182     int ori2 = tet2->get_origine();
183 francois 791 if ((tet2 != mgtet) && (ori2 == MAGIC::ORIGINE::MAILLEUR_AUTO)) compteur++;
184 picher 233 }
185     int nb_tet3 = tri3->get_lien_tetra()->get_nb();
186     for (int k = 0;k<nb_tet3;k++)
187     {
188     MG_TETRA* tet3 = tri3->get_lien_tetra()->get(k);
189     int ori3 = tet3->get_origine();
190 francois 791 if ((tet3 != mgtet) && (ori3 == MAGIC::ORIGINE::MAILLEUR_AUTO)) compteur++;
191 picher 233 }
192     int nb_tet4 = tri4->get_lien_tetra()->get_nb();
193     for (int k = 0;k<nb_tet4;k++)
194     {
195     MG_TETRA* tet4 = tri4->get_lien_tetra()->get(k);
196     int ori4 = tet4->get_origine();
197 francois 791 if ((tet4 != mgtet) && (ori4 == MAGIC::ORIGINE::MAILLEUR_AUTO)) compteur++;
198 picher 233 }
199 francois 791 if (compteur == 0) mgtet->change_origine(MAGIC::ORIGINE::OPTIMISE);
200 picher 233 }
201     }
202     }
203    
204    
205 francois 343
206    
207 francois 460 MG_MAILLAGE* MGOPT_POSTTRAITEMENT::extract_skin_par_decoupage(FEM_SOLUTION* sol,double limit,MG_GESTIONNAIRE& gest2,std::string nom)
208 francois 343 {
209     affiche((char*)"Extraction de l'enveloppe par découpage");
210     sol->active_solution(0);
211     FEM_MAILLAGE* mai=sol->get_maillage();
212     affiche((char*)" Extrapolation de la densité aux noeuds");
213     LISTE_FEM_NOEUD::iterator it;
214     for (FEM_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
215     {
216     double nume=0.;
217     double deno=0.;
218     int nb=no->get_lien_element3()->get_nb();
219     int passe=0;
220     for (int i=0;i<nb;i++)
221     {
222     FEM_ELEMENT3* tet=no->get_lien_element3()->get(i);
223 francois 791 if (tet->get_mg_element_maillage()->get_origine()!=MAGIC::ORIGINE::IMPOSE)
224 francois 343 {
225     double jac[9];
226     int col,ligne;
227     double volume=tet->get_jacobien(jac,jac,ligne,col,1.);
228     passe=1;
229     nume=nume+tet->get_solution()*volume;
230     deno=deno+volume;
231     }
232     }
233 nana 629 if (passe==1) no->change_solution(nume/deno); else no->change_solution(1.);
234 francois 343 }
235     if (nom!="")
236     {
237     affiche((char*)" Enregistrement de la densité aux noeuds");
238     MG_GESTIONNAIRE *gest=mai->get_mg_maillage()->get_gestionnaire();
239     std::string chemin=nom+".sol";
240 francois 383 FEM_SOLUTION* femdens=new FEM_SOLUTION(mai,1,(char*)chemin.c_str(),mai->get_nb_fem_element3(),"Extrapolation aux noeuds",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
241 francois 343 gest->ajouter_fem_solution(femdens);
242     femdens->change_legende(0,"Densite");
243     LISTE_FEM_ELEMENT3::iterator it3;
244     int i=0;
245     for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
246     {
247     MG_TETRA* tet2=(MG_TETRA*)tet->get_mg_element_maillage();
248 francois 791 if (tet2->get_origine()==MAGIC::ORIGINE::IMPOSE)
249 francois 343 {
250 francois 375 femdens->ecrire(1.,i,0,0);
251     femdens->ecrire(1.,i,0,1);
252     femdens->ecrire(1.,i,0,2);
253     femdens->ecrire(1.,i,0,3);
254 francois 343 }
255     else
256     {
257 francois 375 femdens->ecrire(tet->get_fem_noeud(0)->get_solution(),i,0,0);
258     femdens->ecrire(tet->get_fem_noeud(1)->get_solution(),i,0,1);
259     femdens->ecrire(tet->get_fem_noeud(2)->get_solution(),i,0,2);
260     femdens->ecrire(tet->get_fem_noeud(3)->get_solution(),i,0,3);
261 francois 343 }
262     i++;
263     }
264     MG_EXPORT exp;
265     exp.gmsh(mai,nom);
266     gest->supprimer_fem_solution(gest->get_nb_fem_solution()-1);
267     }
268 francois 793 gest2.vide();
269     MG_GEOMETRIE* geo=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL");
270     geo->change_valeur_unite(mai->get_mg_geometrie()->get_valeur_unite());
271     gest2.ajouter_mg_geometrie(geo);
272 francois 830 MG_VOLUME_ELEMENT* vol=new MG_VOLUME_ELEMENT();
273     geo->ajouter_mg_volume(vol);
274     vol->copie_ccf(*(mai->get_mg_geometrie()->get_mg_volume(0)));
275     std::map<unsigned long,unsigned long> correspondidsom;
276     std::map<unsigned long,unsigned long> correspondid;
277     LISTE_MG_SOMMET::iterator its;
278     for (MG_SOMMET* som=mai->get_mg_geometrie()->get_premier_sommet(its);som!=NULL;som=mai->get_mg_geometrie()->get_suivant_sommet(its))
279     {
280     if (som->get_nb_ccf()>0)
281     {
282     MG_SOMMET_NOEUD* somno=new MG_SOMMET_NOEUD();
283     geo->ajouter_mg_sommet(somno);
284     somno->copie_ccf(*som);
285     correspondidsom[som->get_id()]=somno->get_id();
286     }
287     }
288     LISTE_MG_ARETE::iterator ita;
289     for (MG_ARETE* are=mai->get_mg_geometrie()->get_premier_arete(ita);are!=NULL;are=mai->get_mg_geometrie()->get_suivant_arete(ita))
290     {
291     if (are->get_nb_ccf()>0)
292     {
293     MG_ARETE_ELEMENT* areel=new MG_ARETE_ELEMENT();
294     geo->ajouter_mg_arete(areel);
295     areel->copie_ccf(*are);
296     correspondid[are->get_id()]=areel->get_id();
297     }
298     }
299     LISTE_MG_FACE::iterator itf;
300     for (MG_FACE* face=mai->get_mg_geometrie()->get_premier_face(itf);face!=NULL;face=mai->get_mg_geometrie()->get_suivant_face(itf))
301     {
302     if (face->get_nb_ccf()>0)
303     {
304     MG_FACE_ELEMENT* facel=new MG_FACE_ELEMENT();
305     geo->ajouter_mg_face(facel);
306     facel->copie_ccf(*face);
307     correspondid[face->get_id()]=facel->get_id();
308     }
309     }
310     MG_FACE_ELEMENT* faceex=new MG_FACE_ELEMENT();
311     geo->ajouter_mg_face(faceex);
312     MG_FACE_ELEMENT* facenoex=new MG_FACE_ELEMENT();
313     geo->ajouter_mg_face(facenoex);
314 francois 793 MG_MAILLAGE* mgmai=new MG_MAILLAGE(geo);
315 francois 343 gest2.ajouter_mg_maillage(mgmai);
316    
317     MG_MAILLAGE* mgfem=mai->get_mg_maillage();
318     LISTE_MG_TRIANGLE::iterator itmg;
319     for (MG_TRIANGLE* tri=mgfem->get_premier_triangle(itmg);tri!=NULL;tri=mgfem->get_suivant_triangle(itmg))
320     tri->change_nouveau_numero(0);
321     affiche((char*)" Decoupage des tetra optimises");
322     LISTE_FEM_ELEMENT3::iterator it3;
323     for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
324     {
325     MG_TETRA* tet2=(MG_TETRA*)tet->get_mg_element_maillage();
326 francois 791 if (tet2->get_origine()==MAGIC::ORIGINE::IMPOSE)
327 francois 343 {
328 francois 791 tet2->get_triangle1()->change_origine(MAGIC::ORIGINE::IMPOSE);
329     tet2->get_triangle2()->change_origine(MAGIC::ORIGINE::IMPOSE);
330     tet2->get_triangle3()->change_origine(MAGIC::ORIGINE::IMPOSE);
331     tet2->get_triangle4()->change_origine(MAGIC::ORIGINE::IMPOSE);
332 francois 343 tet2->get_noeud1()->change_solution(tet->get_fem_noeud(0)->get_solution());
333     tet2->get_noeud2()->change_solution(tet->get_fem_noeud(1)->get_solution());
334     tet2->get_noeud3()->change_solution(tet->get_fem_noeud(2)->get_solution());
335     tet2->get_noeud4()->change_solution(tet->get_fem_noeud(3)->get_solution());
336     tet2->get_noeud1()->change_nouveau_numero(tet->get_fem_noeud(0)->get_id());
337     tet2->get_noeud2()->change_nouveau_numero(tet->get_fem_noeud(1)->get_id());
338     tet2->get_noeud3()->change_nouveau_numero(tet->get_fem_noeud(2)->get_id());
339     tet2->get_noeud4()->change_nouveau_numero(tet->get_fem_noeud(3)->get_id());
340     if (tet2->get_triangle1()->get_nouveau_numero()==0)
341     tet2->get_triangle1()->change_nouveau_numero(tet2->get_noeud4()->get_id());
342     else
343     tet2->get_triangle1()->change_nouveau_numero(-1);
344     if (tet2->get_triangle2()->get_nouveau_numero()==0)
345     tet2->get_triangle2()->change_nouveau_numero(tet2->get_noeud3()->get_id());
346     else
347     tet2->get_triangle2()->change_nouveau_numero(-1);
348     if (tet2->get_triangle3()->get_nouveau_numero()==0)
349     tet2->get_triangle3()->change_nouveau_numero(tet2->get_noeud1()->get_id());
350     else
351     tet2->get_triangle3()->change_nouveau_numero(-1);
352     if (tet2->get_triangle4()->get_nouveau_numero()==0)
353     tet2->get_triangle4()->change_nouveau_numero(tet2->get_noeud2()->get_id());
354     else
355     tet2->get_triangle4()->change_nouveau_numero(-1);
356     }
357     }
358    
359     TPL_LISTE_ENTITE<MG_TRIANGLE*> tri_impose_interne;
360     for (MG_TRIANGLE* tri=mgfem->get_premier_triangle(itmg);tri!=NULL;tri=mgfem->get_suivant_triangle(itmg))
361     {
362 francois 791 if (tri->get_origine()==MAGIC::ORIGINE::IMPOSE)
363 francois 343 if (tri->get_lien_topologie()->get_dimension()==3)
364     if (tri->get_nouveau_numero()>0)
365     tri_impose_interne.ajouter(tri);
366     }
367     for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
368     {
369 francois 791 if (tet->get_mg_element_maillage()->get_origine()!=MAGIC::ORIGINE::IMPOSE)
370 francois 343 {
371     FEM_NOEUD* no1=tet->get_fem_noeud(0);
372     FEM_NOEUD* no2=tet->get_fem_noeud(1);
373     FEM_NOEUD* no3=tet->get_fem_noeud(2);
374     FEM_NOEUD* no4=tet->get_fem_noeud(3);
375     std::vector<MG_NOEUD*> tab;
376 francois 792 interpole_segment(mai,no1,no2,&tab,limit,mgmai);
377     interpole_segment(mai,no1,no3,&tab,limit,mgmai);
378     interpole_segment(mai,no1,no4,&tab,limit,mgmai);
379     interpole_segment(mai,no2,no3,&tab,limit,mgmai);
380     interpole_segment(mai,no2,no4,&tab,limit,mgmai);
381     interpole_segment(mai,no3,no4,&tab,limit,mgmai);
382 francois 343 int nb=tab.size();
383     FEM_NOEUD* noext;
384     if (nb>0)
385     {
386     if (no1->get_solution()<limit) noext=no1;
387     if (no2->get_solution()<limit) noext=no2;
388     if (no3->get_solution()<limit) noext=no3;
389     if (no4->get_solution()<limit) noext=no4;
390     }
391     if (nb==3)
392     {
393 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(facenoex,tab[0],tab[1],tab[2],mgmai,MAGIC::ORIGINE::TRIANGULATION);
394 francois 343 oriente_tri(tri,noext->get_coord());
395     }
396     if (nb==4)
397     {
398     if (test_du_point_milieu(tab[0],tab[1],tet)==1)
399     {
400 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(facenoex,tab[0],tab[1],tab[2],mgmai,MAGIC::ORIGINE::TRIANGULATION);
401     MG_TRIANGLE_PEAU* tri2=insere_triangle(facenoex,tab[0],tab[1],tab[3],mgmai,MAGIC::ORIGINE::TRIANGULATION);
402 francois 343 oriente_tri(tri,noext->get_coord());
403     oriente_tri(tri2,noext->get_coord());
404     }
405     else if (test_du_point_milieu(tab[0],tab[2],tet)==1)
406     {
407 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(facenoex,tab[0],tab[2],tab[1],mgmai,MAGIC::ORIGINE::TRIANGULATION);
408     MG_TRIANGLE_PEAU* tri2=insere_triangle(facenoex,tab[0],tab[2],tab[3],mgmai,MAGIC::ORIGINE::TRIANGULATION);
409 francois 343 oriente_tri(tri,noext->get_coord());
410     oriente_tri(tri2,noext->get_coord());}
411     else if (test_du_point_milieu(tab[0],tab[3],tet)==1)
412     {
413 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(facenoex,tab[0],tab[3],tab[1],mgmai,MAGIC::ORIGINE::TRIANGULATION);
414     MG_TRIANGLE_PEAU* tri2=insere_triangle(facenoex,tab[0],tab[3],tab[2],mgmai,MAGIC::ORIGINE::TRIANGULATION);
415 francois 343 oriente_tri(tri,noext->get_coord());
416     oriente_tri(tri2,noext->get_coord());}
417     else if (test_du_point_milieu(tab[1],tab[2],tet)==1)
418     {
419 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(facenoex,tab[1],tab[2],tab[0],mgmai,MAGIC::ORIGINE::TRIANGULATION);
420     MG_TRIANGLE_PEAU* tri2=insere_triangle(facenoex,tab[1],tab[2],tab[3],mgmai,MAGIC::ORIGINE::TRIANGULATION);
421 francois 343 oriente_tri(tri,noext->get_coord());
422     oriente_tri(tri2,noext->get_coord());
423     }
424     else if (test_du_point_milieu(tab[1],tab[3],tet)==1)
425     {
426 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(facenoex,tab[1],tab[3],tab[0],mgmai,MAGIC::ORIGINE::TRIANGULATION);
427     MG_TRIANGLE_PEAU* tri2=insere_triangle(facenoex,tab[1],tab[3],tab[2],mgmai,MAGIC::ORIGINE::TRIANGULATION);
428 francois 343 oriente_tri(tri,noext->get_coord());
429     oriente_tri(tri2,noext->get_coord());}
430     else
431     {
432 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(facenoex,tab[2],tab[3],tab[0],mgmai,MAGIC::ORIGINE::TRIANGULATION);
433     MG_TRIANGLE_PEAU* tri2=insere_triangle(facenoex,tab[2],tab[3],tab[1],mgmai,MAGIC::ORIGINE::TRIANGULATION);
434 francois 343 oriente_tri(tri,noext->get_coord());
435     oriente_tri(tri2,noext->get_coord());
436     }
437    
438     }
439     }
440     }
441     affiche((char*)" Decoupage des triangles non design interne au volume");
442     for (int i=0;i<tri_impose_interne.get_nb();i++)
443     {
444     MG_TRIANGLE* tri=tri_impose_interne.get(i);
445     MG_NOEUD* no1=tri->get_noeud1();
446     MG_NOEUD* no2=tri->get_noeud2();
447     MG_NOEUD* no3=tri->get_noeud3();
448     std::vector<MG_NOEUD*> tab;
449     int num1=-1;
450     int num2=-1;
451     int num3=-1;
452     if (no1->get_solution()<limit)
453     {
454 francois 830 MG_NOEUD* no=get_noeud_peau(mai->get_fem_noeudid(no1->get_nouveau_numero()),mgmai,correspondidsom,geo);
455 francois 343 tab.push_back(no);
456     num1=1;
457     }
458     if (no2->get_solution()<limit)
459     {
460 francois 830 MG_NOEUD* no=get_noeud_peau(mai->get_fem_noeudid(no2->get_nouveau_numero()),mgmai,correspondidsom,geo);
461 francois 343 tab.push_back(no);
462     num2=1;
463     }
464     if (no3->get_solution()<limit)
465     {
466 francois 830 MG_NOEUD* no=get_noeud_peau(mai->get_fem_noeudid(no3->get_nouveau_numero()),mgmai,correspondidsom,geo);
467 francois 343 tab.push_back(no);
468     num3=1;
469     }
470 francois 792 if (num1*num2<0) interpole_segment(mai,mai->get_fem_noeudid(no1->get_nouveau_numero()),mai->get_fem_noeudid(no2->get_nouveau_numero()),&tab,limit,mgmai);
471     if (num1*num3<0) interpole_segment(mai,mai->get_fem_noeudid(no1->get_nouveau_numero()),mai->get_fem_noeudid(no3->get_nouveau_numero()),&tab,limit,mgmai);
472     if (num2*num3<0) interpole_segment(mai,mai->get_fem_noeudid(no2->get_nouveau_numero()),mai->get_fem_noeudid(no3->get_nouveau_numero()),&tab,limit,mgmai);
473 francois 343 MG_NOEUD* noint=mgfem->get_mg_noeudid(tri->get_nouveau_numero());
474     int nb=tab.size();
475     if (nb==3)
476     {
477 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(facenoex,tab[0],tab[1],tab[2],mgmai,MAGIC::ORIGINE::IMPOSE);
478 francois 343 oriente_tri(tri,noint->get_coord());
479     tri->inverse_sens();
480     }
481     if (nb==4)
482     {
483 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(facenoex,tab[0],tab[1],tab[2],mgmai,MAGIC::ORIGINE::IMPOSE);
484     MG_TRIANGLE_PEAU* tri2=insere_triangle(facenoex,tab[1],tab[2],tab[3],mgmai,MAGIC::ORIGINE::IMPOSE);
485 francois 343 oriente_tri(tri,noint->get_coord());
486     tri->inverse_sens();
487     oriente_tri(tri2,noint->get_coord());
488     tri2->inverse_sens();
489     }
490     }
491 francois 793 affiche((char*)" Decoupage des triangles sur la frontiere du volume");
492 francois 343 LISTE_FEM_ELEMENT2::iterator it2;
493     for (FEM_ELEMENT2* tri=mai->get_premier_element2(it2);tri!=NULL;tri=mai->get_suivant_element2(it2))
494     {
495     std::vector<MG_NOEUD*> tab;
496     FEM_NOEUD *no1=tri->get_fem_noeud(0);
497     FEM_NOEUD *no2=tri->get_fem_noeud(1);
498     FEM_NOEUD *no3=tri->get_fem_noeud(2);
499     int ori=((MG_FACE*)tri->get_lien_topologie())->get_mg_coface(0)->get_orientation();
500     OT_VECTEUR_3D n1n2(no1->get_coord(),no2->get_coord());
501     OT_VECTEUR_3D n1n3(no1->get_coord(),no3->get_coord());
502     OT_VECTEUR_3D nor=n1n3&n1n2;
503     double xyzext[3];
504     xyzext[0]=no1->get_x()+nor.get_x()*ori;
505     xyzext[1]=no1->get_y()+nor.get_y()*ori;
506     xyzext[2]=no1->get_z()+nor.get_z()*ori;
507 francois 791 if (tri->get_mg_element_maillage()->get_origine()==MAGIC::ORIGINE::IMPOSE)
508 francois 343 {
509 francois 830 MG_NOEUD *mgno1=get_noeud_peau(no1,mgmai,correspondidsom,geo);
510     MG_NOEUD *mgno2=get_noeud_peau(no2,mgmai,correspondidsom,geo);
511     MG_NOEUD *mgno3=get_noeud_peau(no3,mgmai,correspondidsom,geo);
512 francois 792 int num1=interpole_segment(mai,no1,no2,&tab,limit,mgmai,0);
513     int num2=interpole_segment(mai,no1,no3,&tab,limit,mgmai,0);
514     int num3=interpole_segment(mai,no2,no3,&tab,limit,mgmai,0);
515 francois 343 int nb=tab.size();
516 francois 830 MG_MAILLAGE* maiori=mai->get_mg_maillage();
517     MG_NOEUD* n1ori=(MG_NOEUD*)no1->get_mg_element_maillage();
518     MG_NOEUD* n2ori=(MG_NOEUD*)no2->get_mg_element_maillage();
519     MG_NOEUD* n3ori=(MG_NOEUD*)no3->get_mg_element_maillage();
520     MG_FACE* face=faceex;
521     std::map<unsigned long,unsigned long>::iterator it=correspondid.find(tri->get_mg_element_maillage()->get_lien_topologie()->get_id());
522     if (it!=correspondid.end())
523     face=geo->get_mg_faceid(it->second);
524 francois 343 if (nb==0)
525     {
526 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno2,mgno3,mgmai,MAGIC::ORIGINE::IMPOSE);
527 francois 343 oriente_tri(tri,xyzext);
528     }
529     if (nb==1)
530     {
531     if (num1==1)
532     {
533 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno3,tab[0],mgmai,MAGIC::ORIGINE::IMPOSE);
534     MG_TRIANGLE_PEAU* tri2=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno2,mgno3,tab[0],mgmai,MAGIC::ORIGINE::IMPOSE);
535 francois 343 oriente_tri(tri,xyzext);
536     oriente_tri(tri2,xyzext);
537     }
538     if (num2==1)
539     {
540 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno2,tab[0],mgmai,MAGIC::ORIGINE::IMPOSE);
541     MG_TRIANGLE_PEAU* tri2=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno2,mgno3,tab[0],mgmai,MAGIC::ORIGINE::IMPOSE);
542 francois 343 oriente_tri(tri,xyzext);
543     oriente_tri(tri2,xyzext);
544     }
545     if (num3==1)
546     {
547 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno2,tab[0],mgmai,MAGIC::ORIGINE::IMPOSE);
548     MG_TRIANGLE_PEAU* tri2=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno3,tab[0],mgmai,MAGIC::ORIGINE::IMPOSE);
549 francois 343 oriente_tri(tri,xyzext);
550     oriente_tri(tri2,xyzext);
551     }
552     }
553     if (nb==2)
554     {
555     if (num1==0)
556     {
557 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno2,tab[0],mgmai,MAGIC::ORIGINE::IMPOSE);
558     MG_TRIANGLE_PEAU* tri2=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno2,tab[0],tab[1],mgmai,MAGIC::ORIGINE::IMPOSE);
559     MG_TRIANGLE_PEAU* tri3=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno3,tab[0],tab[1],mgmai,MAGIC::ORIGINE::IMPOSE);
560 francois 343 oriente_tri(tri,xyzext);
561     oriente_tri(tri2,xyzext);
562     oriente_tri(tri3,xyzext);
563     }
564     if (num2==0)
565     {
566 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,mgno3,tab[0],mgmai,MAGIC::ORIGINE::IMPOSE);
567     MG_TRIANGLE_PEAU* tri2=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno3,tab[0],tab[1],mgmai,MAGIC::ORIGINE::IMPOSE);
568     MG_TRIANGLE_PEAU* tri3=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno2,tab[0],tab[1],mgmai,MAGIC::ORIGINE::IMPOSE);
569 francois 343 oriente_tri(tri,xyzext);
570     oriente_tri(tri2,xyzext);
571     oriente_tri(tri3,xyzext);
572     }
573     if (num2==0)
574     {
575 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno2,mgno3,tab[0],mgmai,MAGIC::ORIGINE::IMPOSE);
576     MG_TRIANGLE_PEAU* tri2=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno3,tab[0],tab[1],mgmai,MAGIC::ORIGINE::IMPOSE);
577     MG_TRIANGLE_PEAU* tri3=insere_triangle(geo,maiori,n1ori,n2ori,n3ori,correspondid,face,mgno1,tab[0],tab[1],mgmai,MAGIC::ORIGINE::IMPOSE);
578 francois 343 oriente_tri(tri,xyzext);
579     oriente_tri(tri2,xyzext);
580     oriente_tri(tri3,xyzext);
581     }
582     }
583     }
584     else if ((no1->get_solution()>=limit) && (no2->get_solution()>=limit) && (no3->get_solution()>=limit))
585     {
586 francois 830 MG_NOEUD *mgno1=get_noeud_peau(no1,mgmai,correspondidsom,geo);
587     MG_NOEUD *mgno2=get_noeud_peau(no2,mgmai,correspondidsom,geo);
588     MG_NOEUD *mgno3=get_noeud_peau(no3,mgmai,correspondidsom,geo);
589     MG_TRIANGLE_PEAU* tri=insere_triangle(faceex,mgno1,mgno2,mgno3,mgmai,MAGIC::ORIGINE::TRIANGULATION);
590 francois 343 oriente_tri(tri,xyzext);
591     }
592     else if (!((no1->get_solution()<limit) && (no2->get_solution()<limit) && (no3->get_solution()<limit)))
593     {
594     std::vector<MG_NOEUD*> tab;
595     int num1=-1;
596     int num2=-1;
597     int num3=-1;
598     if (no1->get_solution()>=limit)
599     {
600 francois 830 MG_NOEUD* no=get_noeud_peau(no1,mgmai,correspondidsom,geo);
601 francois 343 tab.push_back(no);
602     num1=1;
603     }
604     if (no2->get_solution()>=limit)
605     {
606 francois 830 MG_NOEUD* no=get_noeud_peau(no2,mgmai,correspondidsom,geo);
607 francois 343 tab.push_back(no);
608     num2=1;
609     }
610     if (no3->get_solution()>=limit)
611     {
612 francois 830 MG_NOEUD* no=get_noeud_peau(no3,mgmai,correspondidsom,geo);
613 francois 343 tab.push_back(no);
614     num3=1;
615     }
616 francois 792 if (num1*num2<0) interpole_segment(mai,no1,no2,&tab,limit,mgmai);
617     if (num1*num3<0) interpole_segment(mai,no1,no3,&tab,limit,mgmai);
618     if (num2*num3<0) interpole_segment(mai,no2,no3,&tab,limit,mgmai);
619 francois 343 int nb=tab.size();
620     if (nb==3)
621     {
622 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(faceex,tab[0],tab[1],tab[2],mgmai,MAGIC::ORIGINE::TRIANGULATION);
623 francois 343 oriente_tri(tri,xyzext);
624     }
625     if (nb==4)
626     {
627 francois 830 MG_TRIANGLE_PEAU* tri=insere_triangle(faceex,tab[0],tab[1],tab[2],mgmai,MAGIC::ORIGINE::TRIANGULATION);
628     MG_TRIANGLE_PEAU* tri2=insere_triangle(faceex,tab[1],tab[2],tab[3],mgmai,MAGIC::ORIGINE::TRIANGULATION);
629 francois 343 oriente_tri(tri,xyzext);
630     oriente_tri(tri2,xyzext);
631     }
632     }
633     }
634     LISTE_MG_TRIANGLE::iterator it_tri;
635     for (MG_TRIANGLE* mgtri=mgmai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mgmai->get_suivant_triangle(it_tri))
636     {
637     MG_TRIANGLE_PEAU* tripeau=(MG_TRIANGLE_PEAU*)mgtri;
638     MG_TRIANGLE_PEAU* voisin1=recherche_voisin(tripeau->get_noeud1(),tripeau->get_noeud2(),tripeau);
639     MG_TRIANGLE_PEAU* voisin2=recherche_voisin(tripeau->get_noeud2(),tripeau->get_noeud3(),tripeau);
640     MG_TRIANGLE_PEAU* voisin3=recherche_voisin(tripeau->get_noeud3(),tripeau->get_noeud1(),tripeau);
641     tripeau->change_voisin1(voisin1);
642     tripeau->change_voisin2(voisin2);
643     tripeau->change_voisin3(voisin3);
644     tripeau->change_nouveau_numero(0);
645     }
646     int fin;
647     do
648     {
649     fin=1;
650     for (MG_TRIANGLE* mgtri=mgmai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mgmai->get_suivant_triangle(it_tri))
651     {
652     MG_TRIANGLE_PEAU *tripeau=(MG_TRIANGLE_PEAU*)mgtri;
653     if (tripeau->get_nouveau_numero()==0)
654     {
655     fin=0;
656     std::vector<MG_TRIANGLE_PEAU*> *peau=new std::vector<MG_TRIANGLE_PEAU*>;
657     lst_peau.push_back(peau);
658     tripeau->change_nouveau_numero(1);
659     peau->push_back(tripeau);
660     determine_peau(peau);
661     }
662     }
663     }
664     while (fin==0);
665 francois 457 return mgmai;
666     }
667 nana 629
668    
669 francois 460 void MGOPT_POSTTRAITEMENT::suppression_peaux_isoles(MG_MAILLAGE* mgmai)
670 francois 457 {
671     affiche((char*)"Suppression des peaux isolées");
672 francois 343
673     char message[500];
674     for (int cas=0;cas<2;cas++)
675     {
676 francois 457 if (cas==0) affiche((char*)" Analyse initiale des peaux");
677     if (cas==1) affiche((char*)" Analyse finale des peaux");
678     int nbisole=0;
679 francois 343 for (int i=0;i<lst_peau.size();i++)
680     {
681     int isole=1;
682     for (int j=0;j<lst_peau[i]->size();j++)
683 francois 791 if ((*lst_peau[i])[j]->get_origine()==MAGIC::ORIGINE::IMPOSE) {isole=0;break;}
684 francois 343 if (isole==1)
685     {
686 francois 457 nbisole++;
687 francois 343 for (int j=0;j<lst_peau[i]->size();j++)
688     {
689     mgmai->supprimer_mg_triangleid((*lst_peau[i])[j]->get_id());
690     }
691     lst_peau[i]->clear();
692     }
693     }
694 francois 457 sprintf(message," %d peaux, %d non isoles, %d isoles",(int)lst_peau.size(),(int)lst_peau.size()-nbisole,nbisole);
695     affiche(message);
696 francois 343 for (std::vector<std::vector<MG_TRIANGLE_PEAU*> *>::iterator j=lst_peau.end()-1;j>lst_peau.begin();j--)
697     if ((*j)->size()==0)
698     lst_peau.erase(j);
699     }
700 francois 457 LISTE_MG_TRIANGLE::iterator itmg;
701 francois 343 for (MG_TRIANGLE* tri=mgmai->get_premier_triangle(itmg);tri!=NULL;tri=mgmai->get_suivant_triangle(itmg))
702     {
703 francois 791 if (tri->get_origine()==MAGIC::ORIGINE::IMPOSE)
704 francois 343 {
705 francois 791 tri->get_noeud1()->change_origine(MAGIC::ORIGINE::IMPOSE);
706     tri->get_noeud2()->change_origine(MAGIC::ORIGINE::IMPOSE);
707     tri->get_noeud3()->change_origine(MAGIC::ORIGINE::IMPOSE);
708 francois 343 }
709     }
710 cuillier 438
711 francois 343 }
712    
713 nana 629
714 francois 460 void MGOPT_POSTTRAITEMENT::oriente_tri(MG_TRIANGLE_PEAU* tri,double *xyz)
715 francois 343 {
716     MG_NOEUD* no1=tri->get_noeud1();
717     MG_NOEUD* no2=tri->get_noeud2();
718     MG_NOEUD* no3=tri->get_noeud3();
719     OT_VECTEUR_3D n1n2(no1->get_coord(),no2->get_coord());
720     OT_VECTEUR_3D n1n3(no1->get_coord(),no3->get_coord());
721 francois 805 OT_VECTEUR_3D normal=n1n3&n1n2;
722 francois 343 OT_VECTEUR_3D dir(no1->get_coord(),xyz);
723     dir.norme();
724     normal.norme();
725     double ps=normal*dir;
726     if (ps<0) tri->inverse_sens();
727     }
728    
729    
730    
731 francois 830 MG_NOEUD* MGOPT_POSTTRAITEMENT::get_noeud_peau(FEM_NOEUD* no,MG_MAILLAGE* mai,std::map<unsigned long,unsigned long> &correspondid,MG_GEOMETRIE* geo)
732 francois 343 {
733     static std::map<std::string,MG_NOEUD*> correspond;
734     unsigned long id=no->get_id();
735     char message[255];
736     sprintf(message,"_%lu_",id);
737     std::string key=message;
738     MG_NOEUD* mgno=correspond[key];
739     if (mgno==NULL)
740     {
741 francois 792 int origine=MAGIC::ORIGINE::TRIANGULATION;
742     if (((MG_NOEUD*)no->get_mg_element_maillage())->get_lien_topologie()->get_dimension()==1) origine=MAGIC::ORIGINE::TRIANGULATION_ARETE;
743 francois 830 MG_ELEMENT_TOPOLOGIQUE* ele=NULL;
744     std::map<unsigned long,unsigned long>::iterator it=correspondid.find(no->get_mg_element_maillage()->get_lien_topologie()->get_id());
745     if (it!=correspondid.end())
746     ele=geo->get_mg_sommetid(it->second);
747 francois 792 mgno=new MG_NOEUD(NULL,no->get_x(),no->get_y(),no->get_z(),origine);
748 francois 830 if (it!=correspondid.end())
749     ((MG_SOMMET_NOEUD*)ele)->change_mg_noeud(mgno);
750 francois 343 mai->ajouter_mg_noeud(mgno);
751     correspond[key]=mgno;
752     }
753     return mgno;
754     }
755    
756    
757 francois 460 int MGOPT_POSTTRAITEMENT::test_du_point_milieu(MG_NOEUD* no1,MG_NOEUD* no2,FEM_ELEMENT3* tet)
758 francois 343 {
759     double *xyz1=no1->get_coord();
760     double *xyz2=no2->get_coord();
761     double xyz[3];
762     xyz[0]=0.5*(xyz1[0]+xyz2[0]);
763     xyz[1]=0.5*(xyz1[1]+xyz2[1]);
764     xyz[2]=0.5*(xyz1[2]+xyz2[2]);
765 francois 412 FEM_MAILLAGE_OUTILS ot;
766 francois 388 if (((ot.estdansletetra(tet,xyz[0],xyz[1],xyz[2])>>1)&1)==1) return 1;
767     //if (((MG_MAILLAGE_OUTILS::estdansletetra(tet,xyz[0],xyz[1],xyz[2])>>1)&1)==1) return 1;
768 francois 343 return 0;
769     }
770    
771    
772    
773 francois 792 int MGOPT_POSTTRAITEMENT::interpole_segment(FEM_MAILLAGE* fem,FEM_NOEUD* no1,FEM_NOEUD* no2,std::vector<MG_NOEUD*> *tab,double limit,MG_MAILLAGE* mai,int creation)
774 francois 343 {
775     static std::map<std::string,MG_NOEUD*> correspond;
776     unsigned long id1=no1->get_id();
777     unsigned long id2=no2->get_id();
778     char message[255];
779     sprintf(message,"_%lu_%lu_",id1,id2);
780     std::string key1=message;
781     sprintf(message,"_%lu_%lu_",id2,id1);
782     std::string key2=message;
783     double sol1=no1->get_solution();
784     double sol2=no2->get_solution();
785 francois 792 MG_NOEUD* n1=(MG_NOEUD*)no1->get_mg_element_maillage();
786     MG_NOEUD* n2=(MG_NOEUD*)no2->get_mg_element_maillage();
787     MG_SEGMENT *seg=fem->get_mg_maillage()->get_mg_segment(n1->get_id(),n2->get_id());
788     int origine=MAGIC::ORIGINE::TRIANGULATION;
789     if (seg->get_lien_topologie()->get_dimension()==2) origine=MAGIC::ORIGINE::TRIANGULATION_ARETE;
790     if (seg->get_lien_topologie()->get_dimension()==1) origine=MAGIC::ORIGINE::TRIANGULATION_ARETE;
791    
792 francois 345 if (fabs(sol1-limit)<0.0000001)
793     {
794     sprintf(message,"%lu",id1);
795     std::string key=message;
796     MG_NOEUD* no=correspond[key];
797     if (no==NULL)
798     {
799     double *xyz1=no1->get_coord();
800 francois 792 no=new MG_NOEUD(NULL,xyz1[0],xyz1[1],xyz1[2],origine);
801 francois 345 mai->ajouter_mg_noeud(no);
802     correspond[key]=no;
803     }
804     int present=0;
805     for (int i=0;i<tab->size();i++)
806     if ((*tab)[i]==no) present=1;
807     if (present==0)
808     {
809     tab->push_back(no);
810     return 1;
811     }
812     else return 0;
813     }
814     if (fabs(sol2-limit)<0.0000001)
815     {
816     sprintf(message,"%lu",id2);
817     std::string key=message;
818     MG_NOEUD* no=correspond[key];
819     if (no==NULL)
820     {
821     double *xyz2=no2->get_coord();
822 francois 792 no=new MG_NOEUD(NULL,xyz2[0],xyz2[1],xyz2[2],origine);
823 francois 345 mai->ajouter_mg_noeud(no);
824     correspond[key]=no;
825     }
826     int present=0;
827     for (int i=0;i<tab->size();i++)
828     if ((*tab)[i]==no) present=1;
829     if (present==0)
830     {
831     tab->push_back(no);
832     return 1;
833     }
834     else return 0;
835    
836     }
837    
838     if (((sol1<limit) && (sol2>limit))||((sol1>limit) && (sol2<limit)))
839 francois 343 {
840     MG_NOEUD* no=correspond[key1];
841     if (no==NULL) no=correspond[key2];
842     if ((no==NULL) && (creation==1))
843     {
844     double t=(limit-sol1)/(sol2-sol1);
845     double xyz[3];
846     double *xyz1=no1->get_coord();
847     double *xyz2=no2->get_coord();
848     xyz[0]=xyz1[0]+t*(xyz2[0]-xyz1[0]);
849     xyz[1]=xyz1[1]+t*(xyz2[1]-xyz1[1]);
850     xyz[2]=xyz1[2]+t*(xyz2[2]-xyz1[2]);
851 francois 792 no=new MG_NOEUD(NULL,xyz[0],xyz[1],xyz[2],origine);
852 francois 343 mai->ajouter_mg_noeud(no);
853     correspond[key1]=no;
854     }
855     if (no!=NULL)
856     {
857     tab->push_back(no);
858     return 1;
859     }
860     }
861     return 0;
862     }
863    
864 francois 460 void MGOPT_POSTTRAITEMENT::lire_params(char *fichier)
865 francois 457 {
866     params.lire(fichier);
867     }
868 francois 343
869 francois 830 void MGOPT_POSTTRAITEMENT::posttraite(FEM_SOLUTION* sol, MG_GESTIONNAIRE& gest2,char *nomparam,char *nomout)
870 picher 233 {
871 francois 830 strcat(nomout,".volume");
872     FILE *in=fopen(nomout,"wt");
873     fprintf(in,"Suivi du volume pendant le posttraitement d'une optimisation de topologie\n");
874     fprintf(in,"**************************************************************************\n\n\n\n");
875 francois 457 if (nomparam!=NULL) lire_params(nomparam);
876 francois 830 FEM_MAILLAGE* fem=sol->get_maillage();
877     affiche((char*)"Calcul du volume de depart");
878     double voltot=0.;
879     double volnon=0.;
880     calcul_volume_ini(fem->get_mg_maillage(),&voltot,&volnon);
881     fprintf(in,"Statistique initiale\n");
882     fprintf(in,"Volume total=%.14le\nVolume non design=%.14le\nVolume à optimiser=%.14le\n\n\n\n",voltot,volnon,voltot-volnon);
883 francois 272 affiche((char*)"Extraction du maillage de surface");
884 francois 457 int decoup=params.get_valeur("decoupage");
885     MG_MAILLAGE* mgmai;
886     if (decoup==0)
887     {
888     affiche((char*)" Découpage par mailles 3D entieres");
889     adapte_seuil(fem,sol);
890     mgmai=extract_skin_maille_entiere(fem,gest2);
891     }
892     if (decoup==1)
893     {
894     affiche((char*)" Découpage par isodensité");
895     double seuil=params.get_valeur("seuil");
896     std::string nomfich=params.get_nom("nomdensextra");
897     mgmai=extract_skin_par_decoupage(sol,seuil,gest2,nomfich.c_str());
898     }
899     suppression_peaux_isoles(mgmai);
900 francois 830 affiche((char*)"Calcul du volume après extraction de la peau");
901     MG_MAILLAGE_OUTILS ot;
902     double v=ot.get_volume(mgmai);
903     fprintf(in,"Statistique après extraction de la peau\n");
904 francois 831 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));
905 francois 457 affiche((char*)"Procedure de lissage");
906     int chen2005_debut=params.get_valeur("chen2005_debut");
907     int chen2008_debut=params.get_valeur("chen2008_debut");
908     int jiao2012_debut=params.get_valeur("jiao2012_debut");
909 mckenzie 804 int McKenzie2016_debut=params.get_valeur("McKenzie2016_debut");
910     int Taubin1995_debut=params.get_valeur("Taubin1995_debut");
911 francois 832 int cardinalite_debut=params.get_valeur("cardinalite_debut");
912     int cardinalite_iter=params.get_valeur("cardinalite_iter");
913 francois 457 int chen2005fait=0;
914     if (chen2005_debut==0) chen2005fait=1;
915     int chen2008fait=0;
916     if (chen2008_debut==0) chen2008fait=1;
917     int jiao2012fait=0;
918     if (jiao2012_debut==0) jiao2012fait=1;
919 mckenzie 804 int McKenzie2016fait=0;
920     if (McKenzie2016_debut==0) McKenzie2016fait=1;
921     int Taubin1995fait=0;
922     if (Taubin1995_debut==0) Taubin1995fait=1;
923 francois 832 int cardinalitefait=0;
924     if (cardinalite_debut==0) cardinalitefait=1;
925 mckenzie 798
926 francois 457 int fin=0;
927     int iteration=1;
928     do
929     {
930 francois 830 char nomiteration[500];
931     strcpy(nomiteration,"aucun lissage");
932 francois 833 int next=2000000000;
933     if (chen2005fait==0) next=std::min(next,chen2005_debut);
934     if (chen2008fait==0) next=std::min(next,chen2008_debut);
935     if (jiao2012fait==0) next=std::min(next,jiao2012_debut);
936     if (McKenzie2016fait==0) next=std::min(next,McKenzie2016_debut);
937     if (Taubin1995fait==0) next=std::min(next,Taubin1995_debut);
938     if (cardinalitefait==0) next=std::min(next,cardinalite_debut);
939     if ((iteration>=chen2005_debut) && (chen2005_debut==next))
940 francois 457 {
941     char message[300];
942     sprintf(message, " Iteration %d : lissage de Chen 2005",iteration);
943     affiche(message);
944     double epsilon=params.get_valeur("chen2005_epsilon");
945     double sigma=params.get_valeur("chen2005_sigma");
946     int iter_max=params.get_valeur("chen2005_itermax");
947     int nbiter=lissage_chen2005(mgmai,gest2,epsilon,sigma,iter_max);
948     if (nbiter==iter_max) sprintf(message," Arrêt de la procédure de lissage de Chen2005 après %d itérations",nbiter);
949     else sprintf(message," Convergence de la procédure de lissage de Chen2005 après %d itérations",nbiter);
950     affiche(message);
951     chen2005fait=1;
952     iteration=iteration+nbiter;
953 francois 830 strcpy(nomiteration,"lissage de Chen2005");
954 francois 457 }
955 francois 833 else if ((iteration>=chen2008_debut) && (chen2008_debut==next))
956 francois 457 {
957     char message[300];
958     sprintf(message, " Iteration %d : lissage de Chen 2008",iteration);
959     affiche(message);
960     double epsilon=params.get_valeur("chen2008_epsilon");
961     double sigma=params.get_valeur("chen2008_sigma");
962     double gamma=params.get_valeur("chen2008_gamma");
963     int iter_max=params.get_valeur("chen2008_itermax");
964     int nbiter=lissage_chen2008(mgmai,gest2,sigma,gamma,epsilon,iter_max);
965     if (nbiter==iter_max) sprintf(message," Arrêt de la procédure de lissage de Chen2008 après %d itérations",nbiter);
966     else sprintf(message," Convergence de la procédure de lissage de Chen2008 après %d itérations",nbiter);
967     affiche(message);
968     chen2008fait=1;
969     iteration=iteration+nbiter;
970 francois 830 strcpy(nomiteration,"lissage de Chen2008");
971 francois 457 }
972 francois 833 else if ((iteration>=jiao2012_debut) && (jiao2012_debut==next))
973 francois 457 {
974     char message[300];
975     sprintf(message, " Iteration %d : lissage de Jiao 2012",iteration);
976     affiche(message);
977     int iter_max=params.get_valeur("jiao2012_itermax");
978     int nbiter=lissage_jiao2012(mgmai,gest2,iter_max);
979     if (nbiter==iter_max) sprintf(message," Arrêt de la procédure de lissage de Jiao2012 après %d itérations",nbiter);
980     else sprintf(message," Convergence de la procédure de lissage de Jiao2012 après %d itérations",nbiter);
981     affiche(message);
982     jiao2012fait=1;
983     iteration=iteration+nbiter;
984 francois 830 strcpy(nomiteration,"lissage de Jiao2012");
985 francois 457 }
986 francois 833 else if ((iteration>=McKenzie2016_debut) && (McKenzie2016_debut==next))
987 nana 629 {
988     char message[300];
989 mckenzie 804 sprintf(message, "Lissage de McKenzie2016");
990 mckenzie 798 affiche(message);
991 mckenzie 804 double lambda=params.get_valeur("McKenzie2016_lambda");
992     double nu=params.get_valeur("McKenzie2016_nu");
993     double epsilon=params.get_valeur("McKenzie2016_epsilon");
994     double sigma=params.get_valeur("McKenzie2016_sigma");
995     double gamma_ =params.get_valeur("McKenzie2016_sigma");
996     int filtre=params.get_valeur("McKenzie2016_filtre");
997     int iter_max=params.get_valeur("McKenzie2016_itermax");
998     int itr_taubin=params.get_valeur("McKenzie2016_itertaubmax");
999     int nbiter=lissage_McKenzie2016(mgmai,gest2,lambda,nu,epsilon,sigma,gamma_,filtre, iter_max, itr_taubin);
1000     if (nbiter==iter_max) sprintf(message," Arrêt de la procédure de lissage de McKenzie2016 après %d itérations",nbiter);
1001     else sprintf(message," Convergence de la procédure de lissage de McKenzie2016 après %d itérations",nbiter);
1002 mckenzie 798 affiche(message);
1003 mckenzie 804 McKenzie2016fait=1;
1004 mckenzie 798 iteration=iteration+nbiter;
1005 francois 830 strcpy(nomiteration,"lissage de McKenzie2016");
1006 mckenzie 798 }
1007 mckenzie 804
1008 francois 833 else if ((iteration>=Taubin1995_debut) && (Taubin1995_debut==next))
1009 mckenzie 804 {
1010     char message[300];
1011     sprintf(message, "Lissage de Taubin1995");
1012     affiche(message);
1013     double lambda=params.get_valeur("Taubin1995_lambda");
1014     double nu=params.get_valeur("Taubin1995_nu");
1015     int iter_max=params.get_valeur("Taubin1995_itermax");
1016     int nbiter=lissage_Taubin1995(mgmai,gest2,lambda,nu, iter_max);
1017     if (nbiter==iter_max) sprintf(message," Arrêt de la procédure de lissage de Taubin1995 après %d itérations",nbiter);
1018     else sprintf(message," Convergence de la procédure de lissage de Taubin1995 après %d itérations",nbiter);
1019     affiche(message);
1020     Taubin1995fait=1;
1021     iteration=iteration+nbiter;
1022 francois 830 strcpy(nomiteration,"lissage de Taubin1995");
1023 mckenzie 804 }
1024 francois 833 else if ((iteration>=cardinalite_debut) && (cardinalite_debut==next))
1025 francois 832 {
1026     char message[300];
1027     sprintf(message, "Étude de la cardinalite des noeuds");
1028     affiche(message);
1029     int nb=cardinalite(mgmai,cardinalite_iter);
1030     if (nb!=cardinalite_iter)
1031     sprintf(message, "Cardinalité des noeuds convergé");
1032     else
1033     sprintf(message, "Cardinalité des noeuds non convergé");
1034     affiche(message);
1035     strcpy(nomiteration,"Cardinalité");
1036     iteration=iteration+nb;
1037     cardinalitefait=1;
1038     }
1039 francois 830 else
1040     {
1041     iteration++;
1042     }
1043 francois 457 if (chen2005fait==1)
1044     if (chen2008fait==1)
1045     if (jiao2012fait==1)
1046 mckenzie 804 if (McKenzie2016fait==1)
1047     if (Taubin1995fait==1)
1048 francois 832 if (cardinalitefait==1)
1049     fin=1;
1050 francois 833 if (strcmp(nomiteration,"aucun lissage")!=0)
1051     {
1052     MG_MAILLAGE_OUTILS ot;
1053     double v=ot.get_volume(mgmai);
1054     fprintf(in,"Statistique après itération %d %s\n",iteration-1,nomiteration);
1055     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));
1056     }
1057 francois 831
1058 francois 457 }
1059     while (fin==0);
1060 mckenzie 798
1061 francois 830 fclose(in);
1062 francois 457 }
1063    
1064    
1065 francois 460 MG_MAILLAGE* MGOPT_POSTTRAITEMENT::extract_skin_maille_entiere(FEM_MAILLAGE* mai,MG_GESTIONNAIRE &gest2)
1066 francois 457 {
1067     //Menu de la methode de lissage
1068     affiche((char*)"Extraction du maillage de surface");
1069 picher 231 int coderesu = 0;
1070 picher 233 int mai2_id;
1071 francois 457 int imp=params.get_valeur("consimpose");
1072     int opti=params.get_valeur("consoptimise");
1073     int m_auto=params.get_valeur("consnooptimise");
1074 francois 791 if (opti==1) conserve(MAGIC::ORIGINE::OPTIMISE);
1075     if (imp==1) conserve(MAGIC::ORIGINE::IMPOSE);
1076     if (m_auto==1) conserve(MAGIC::ORIGINE::MAILLEUR_AUTO);
1077 francois 457 copieorigine(mai);
1078 picher 233 MG_MAILLAGE* mg_mai = (MG_MAILLAGE*)mai->get_mg_maillage();
1079 francois 457 //gain_poids(mg_mai,gest2);
1080     int reactiv=params.get_valeur("reactivation");
1081 picher 233 if (reactiv == 1)
1082     {
1083     reactivation(mg_mai,gest2);
1084     }
1085 francois 457 affiche((char*)" Analyse des cas non manifold");
1086 picher 231 do
1087     {
1088 francois 457 int nbmaniare,nbmanino,nbpeau;
1089     coderesu = extract_skin(mg_mai,gest2,nbpeau,nbmaniare,nbmanino,&mai2_id);
1090     char message[500];
1091     sprintf(message," %d peaux. %d manifold par arete. %d manifold par noeud",nbpeau,nbmaniare,nbmanino);
1092     affiche(message);
1093     // gain_poids(mg_mai,gest2);
1094 picher 231 }
1095     while (coderesu == 0);
1096 picher 233
1097     MG_MAILLAGE* mg_mai2=gest2.get_mg_maillageid(mai2_id);
1098 francois 457
1099     return mg_mai2;
1100    
1101 picher 231 }
1102    
1103 nana 629
1104 francois 460 void MGOPT_POSTTRAITEMENT::adapte_seuil(class FEM_MAILLAGE* fem,FEM_SOLUTION* solution)
1105 picher 230 {
1106 francois 457 double seuil=params.get_valeur("seuil");
1107     solution->active_solution(0);
1108     LISTE_FEM_ELEMENT3::iterator it;
1109     for (FEM_ELEMENT3 *tet=fem->get_premier_element3(it);tet!=NULL;tet=fem->get_suivant_element3(it))
1110 picher 230 {
1111 francois 791 if (((MG_TETRA*)tet->get_mg_element_maillage())->get_origine()!=MAGIC::ORIGINE::IMPOSE)
1112 francois 457 if (tet->get_solution()>seuil)
1113 francois 791 ((MG_TETRA*)tet->get_mg_element_maillage())->change_origine(MAGIC::ORIGINE::OPTIMISE);
1114 francois 457 else
1115 francois 791 ((MG_TETRA*)tet->get_mg_element_maillage())->change_origine(MAGIC::ORIGINE::MAILLEUR_AUTO);
1116 francois 457
1117 picher 230 }
1118     }
1119 francois 224
1120 francois 457
1121     //---------------------------- Lissage Chen 2005 Gilles Philippe -------------------------------------------------------------------------
1122 francois 460 int MGOPT_POSTTRAITEMENT::lissage_chen2005(MG_MAILLAGE* mg_mai,MG_GESTIONNAIRE& gest2, double epsilon, double sigma, int iter_max)
1123 picher 230 {
1124 francois 457 //Methode de lissage inspiree de Chen(2005) par Gilles Philipe Picher Martel
1125 picher 230 double un_sur_pi = 1./M_PI;
1126     int compteur = 0;
1127     int fin = 0;
1128 francois 224
1129 francois 457
1130 picher 230 do
1131     {
1132     TPL_LISTE_ENTITE<OT_VECTEUR_3D> liste_normales;
1133 picher 233 TPL_LISTE_ENTITE<OT_VECTEUR_3D> liste_normales2;
1134 picher 230 TPL_LISTE_ENTITE<double> liste_wij;
1135     LISTE_MG_TRIANGLE::iterator it_tri;
1136     int k = 0; //pour identifier les triangles pour liste_normales et liste_wij
1137     for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
1138     {
1139     MG_TRIANGLE_PEAU* mgtri_i = (MG_TRIANGLE_PEAU*)mgtri;
1140     OT_VECTEUR_3D normal_f_i = mgtri_i->calcul_normal();
1141 picher 233 normal_f_i.norme();
1142     liste_normales2.ajouter(normal_f_i);
1143 picher 230 //Remplissage de la liste des voisins du triangle i
1144     TPL_MAP_ENTITE<MG_TRIANGLE_PEAU*> liste_voisins;
1145     MG_NOEUD* noeud1 = mgtri_i->get_noeud1();
1146     double nb_voisins1 = noeud1->get_lien_triangle()->get_nb();
1147     for (int j = 0;j<nb_voisins1;j++)
1148     {
1149     MG_TRIANGLE_PEAU* mgtri_1 = (MG_TRIANGLE_PEAU*) noeud1->get_lien_triangle()->get(j);
1150     liste_voisins.ajouter(mgtri_1);
1151     }
1152     MG_NOEUD* noeud2 = mgtri_i->get_noeud2();
1153     double nb_voisins2 = noeud2->get_lien_triangle()->get_nb();
1154     for (int j = 0;j<nb_voisins2;j++)
1155     {
1156     MG_TRIANGLE_PEAU* mgtri_2 = (MG_TRIANGLE_PEAU*) noeud2->get_lien_triangle()->get(j);
1157     liste_voisins.ajouter(mgtri_2);
1158     }
1159     MG_NOEUD* noeud3 = mgtri_i->get_noeud3();
1160     double nb_voisins3 = noeud3->get_lien_triangle()->get_nb();
1161     for (int j = 0;j<nb_voisins3;j++)
1162     {
1163     MG_TRIANGLE_PEAU* mgtri_3 = (MG_TRIANGLE_PEAU*) noeud3->get_lien_triangle()->get(j);
1164     liste_voisins.ajouter(mgtri_3);
1165     }
1166     liste_voisins.supprimer(mgtri_i);
1167     int nb_voisins = liste_voisins.get_nb();
1168     double w_ij = 1./nb_voisins;
1169     double phi_i_min = 10.;
1170     double s_i = 0.0;
1171     double phi_im = 0.0;
1172 picher 231 double *phi_ij = new double[nb_voisins];
1173 picher 230 OT_VECTEUR_3D normal_f_i_mean(0.,0.,0.);
1174     OT_VECTEUR_3D eta_i(0.,0.,0.);
1175     TPL_MAP_ENTITE<MG_TRIANGLE_PEAU*>::ITERATEUR it;
1176     int j = 0;
1177     for(MG_TRIANGLE_PEAU* mgtri_j=liste_voisins.get_premier(it);mgtri_j!=NULL;mgtri_j=liste_voisins.get_suivant(it))
1178     {
1179     OT_VECTEUR_3D normal_f_j = mgtri_j->calcul_normal();
1180     //1-Calculer la normale moyenne pour chaque triangle
1181     normal_f_i_mean = normal_f_i_mean + w_ij*normal_f_j;
1182 francois 457 //2.1-On calcul l'angle entre normal_f_i et normal_f_j pour j allant de 1 a Nb_voisins
1183 picher 230 double prod_scalaire = normal_f_i*normal_f_j;
1184 picher 233 if (prod_scalaire > 1.)
1185     {
1186     prod_scalaire = 1.;
1187     }
1188     if (prod_scalaire < -1.)
1189     {
1190     prod_scalaire = -1.;
1191     }
1192 picher 230 phi_ij[j] = acos(prod_scalaire)*un_sur_pi;
1193     //2.2-On trouve le plus petit des angles et la normale heta_i correspondante
1194     if (phi_ij[j] < phi_i_min)
1195     {
1196     phi_i_min = phi_ij[j];
1197     eta_i = normal_f_j;
1198     }
1199     //3.1-On calcul l'angle moyen phi_im
1200     phi_im = phi_im + w_ij*phi_ij[j];
1201     j++;
1202     }
1203     normal_f_i_mean.norme();
1204     j = 0;
1205     for(MG_TRIANGLE_PEAU* mgtri_j=liste_voisins.get_premier(it);mgtri_j!=NULL;mgtri_j=liste_voisins.get_suivant(it))
1206     {
1207     //3.2-Calcul de s_i selon la variance
1208     s_i = s_i + w_ij*pow((phi_ij[j] - phi_im),2);
1209     j++;
1210     }
1211 picher 231 delete[] phi_ij;
1212 picher 230 //4-On calcule une nouvelle normale pour chaque triangle
1213 francois 458 double pond;
1214     int num=params.get_valeur("chen2005_filtre");
1215     if (num==1) pond=ponderation_gaussian(s_i,sigma);
1216     else if (num==2) pond=ponderation_laplacian(s_i,sigma);
1217     else if (num==3) pond=ponderation_elfallahford(s_i,sigma);
1218     OT_VECTEUR_3D normal_f_i_new = pond*normal_f_i_mean + (1. - pond)*eta_i;
1219 picher 230 normal_f_i_new.norme();
1220     liste_normales.ajouter(normal_f_i_new);
1221     liste_wij.ajouter(w_ij);
1222     mgtri->change_nouveau_numero(k);
1223     k++;
1224     }
1225    
1226     LISTE_MG_NOEUD::iterator it_no;
1227     for (MG_NOEUD* noeud_i=mg_mai->get_premier_noeud(it_no);noeud_i!=NULL;noeud_i=mg_mai->get_suivant_noeud(it_no))
1228     {
1229     int nb_voisins_j = noeud_i->get_lien_triangle()->get_nb();
1230     double w_ij_prime = 0.0;
1231     OT_VECTEUR_3D v_temp(0.,0.,0.);
1232     OT_VECTEUR_3D v_i(noeud_i->get_x(),noeud_i->get_y(),noeud_i->get_z());
1233     for(int j=0;j<nb_voisins_j;j++)
1234     {
1235     MG_TRIANGLE_PEAU* mgtri_j = (MG_TRIANGLE_PEAU*) noeud_i->get_lien_triangle()->get(j);
1236 francois 457 //On calcule le centroide cj du triangle mgtri_j
1237 picher 230 MG_NOEUD* n1 = mgtri_j->get_noeud1();
1238     MG_NOEUD* n2 = mgtri_j->get_noeud2();
1239     MG_NOEUD* n3 = mgtri_j->get_noeud3();
1240     double cj_x = 0.333333333333333*(n1->get_x() + n2->get_x() + n3->get_x());
1241     double cj_y = 0.333333333333333*(n1->get_y() + n2->get_y() + n3->get_y());
1242     double cj_z = 0.333333333333333*(n1->get_z() + n2->get_z() + n3->get_z());
1243     //On forme le vecteur vi_cj
1244     OT_VECTEUR_3D vi_cj(cj_x - noeud_i->get_x(),cj_y - noeud_i->get_y(),cj_z - noeud_i->get_z());
1245     OT_VECTEUR_3D normal_f_i_new = liste_normales.get(mgtri_j->get_nouveau_numero());
1246 francois 457 // w_ij_prime correspond a la somme des aires des triangles voisins du noeuds
1247 picher 233 OT_VECTEUR_3D AB(n2->get_x() - n1->get_x(),n2->get_y() - n1->get_y(),n2->get_z() - n1->get_z());
1248     OT_VECTEUR_3D AC(n3->get_x() - n1->get_x(),n3->get_y() - n1->get_y(),n3->get_z() - n1->get_z());
1249     OT_VECTEUR_3D prodvect = AB&AC;
1250     double w_ij = 0.5*prodvect.get_longueur();
1251 picher 230 w_ij_prime = w_ij_prime + w_ij;
1252     v_temp = v_temp + w_ij*(vi_cj*normal_f_i_new)*normal_f_i_new;
1253     }
1254 francois 457 //5-On met a jour la position des noeuds
1255 picher 230 v_i = v_i + v_temp/w_ij_prime;
1256 picher 233 int origine = noeud_i->get_origine();
1257 francois 791 if (origine != MAGIC::ORIGINE::IMPOSE)
1258 picher 233 {
1259     noeud_i->change_x(v_i.get_x());
1260     noeud_i->change_y(v_i.get_y());
1261     noeud_i->change_z(v_i.get_z());
1262     }
1263 picher 230 }
1264 francois 457 //Critere d'arret de l'algorithme
1265 picher 230 int l=0;
1266     int nb_tri = mg_mai->get_nb_mg_triangle();
1267     for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
1268     {
1269     MG_TRIANGLE_PEAU* mgtri_i = (MG_TRIANGLE_PEAU*)mgtri;
1270 picher 233 OT_VECTEUR_3D normal_f_i = liste_normales2.get(mgtri_i->get_nouveau_numero());
1271 picher 230 OT_VECTEUR_3D normal_f_i_new = liste_normales.get(mgtri_i->get_nouveau_numero());
1272 picher 248 double critere = 1. - normal_f_i*normal_f_i_new;
1273 picher 230 if (critere <= epsilon) l++;
1274     }
1275 picher 248 double tolerance = 0.01*nb_tri;
1276     if (nb_tri - l <= 0) fin = 1;
1277 picher 230 compteur++;
1278     }
1279     while ((fin == 0) && (compteur < iter_max));
1280    
1281 francois 457 return compteur;
1282     }
1283 picher 230
1284 francois 457 //---------------------------- Lissage Jiao 2012 -------------------------------------------------------------------------
1285 francois 460 int MGOPT_POSTTRAITEMENT::lissage_jiao2012(MG_MAILLAGE* mg_mai,MG_GESTIONNAIRE& gest2, int iter_max)
1286 picher 248 {
1287 francois 457 // Lissage global avec methode de lissage inspiree de JIAO IMR2012 par Jean Christophe sept 2013
1288 picher 248 int compteur = 0;
1289    
1290 cuillier 438 do
1291     {
1292     vector<double> nouv_position_x;
1293     vector<double> nouv_position_y;
1294     vector<double> nouv_position_z;
1295     LISTE_MG_NOEUD::iterator it_no;
1296     for (MG_NOEUD* noeud_i=mg_mai->get_premier_noeud(it_no);noeud_i!=NULL;noeud_i=mg_mai->get_suivant_noeud(it_no))
1297     {
1298     int origine = noeud_i->get_origine();
1299 francois 791 if (origine != MAGIC::ORIGINE::IMPOSE)
1300 cuillier 438 {
1301     int nb_voisins_j = noeud_i->get_lien_triangle()->get_nb();
1302     double wij = 0.0;
1303     double wij_sommej = 0.0;
1304     OT_VECTEUR_3D v_temp(0.,0.,0.);
1305     OT_VECTEUR_3D v_i(noeud_i->get_x(),noeud_i->get_y(),noeud_i->get_z());
1306     for(int j=0;j<nb_voisins_j;j++)
1307     {
1308     MG_TRIANGLE_PEAU* mgtri_j = (MG_TRIANGLE_PEAU*) noeud_i->get_lien_triangle()->get(j);
1309 francois 457 //On calcule le centroide cj du triangle mgtri_j
1310 cuillier 438 MG_NOEUD* n1 = mgtri_j->get_noeud1();
1311     MG_NOEUD* n2 = mgtri_j->get_noeud2();
1312     MG_NOEUD* n3 = mgtri_j->get_noeud3();
1313     double cj_x = 0.333333333333333*(n1->get_x() + n2->get_x() + n3->get_x());
1314     double cj_y = 0.333333333333333*(n1->get_y() + n2->get_y() + n3->get_y());
1315     double cj_z = 0.333333333333333*(n1->get_z() + n2->get_z() + n3->get_z());
1316     //On forme le vecteur vi_cj et le vecteur cj
1317     OT_VECTEUR_3D cj(cj_x ,cj_y,cj_z);
1318     OT_VECTEUR_3D vi_cj(cj_x - noeud_i->get_x(),cj_y - noeud_i->get_y(),cj_z - noeud_i->get_z());
1319     wij=vi_cj.get_longueur();
1320     wij_sommej=wij_sommej+wij;
1321     v_temp = v_temp + (wij*cj);
1322     }
1323     //5-On calcule la nouvelle position des noeuds et on affecte au tableau temporaire
1324     v_i =v_temp/wij_sommej;
1325     nouv_position_x.push_back(v_i.get_x());
1326     nouv_position_y.push_back(v_i.get_y());
1327     nouv_position_z.push_back(v_i.get_z());
1328     }
1329     }
1330     //On actualise la position des noeuds
1331     int ind_noeud=0;
1332     for (MG_NOEUD* noeud_i=mg_mai->get_premier_noeud(it_no);noeud_i!=NULL;noeud_i=mg_mai->get_suivant_noeud(it_no))
1333     {
1334     int origine = noeud_i->get_origine();
1335 francois 791 if (origine != MAGIC::ORIGINE::IMPOSE)
1336 cuillier 438 {
1337     noeud_i->change_x(nouv_position_x[ind_noeud]);
1338     noeud_i->change_y(nouv_position_y[ind_noeud]);
1339     noeud_i->change_z(nouv_position_z[ind_noeud]);
1340     ind_noeud++;
1341     }
1342     }
1343     //Critere d'arret de l'algorithme
1344     compteur++;
1345     }
1346     while (compteur < iter_max);
1347    
1348 francois 457 return compteur;
1349 cuillier 438 }
1350    
1351 francois 457 //---------------------------- Lissage Chen 2008 -------------------------------------------------------------------------
1352 francois 460 int MGOPT_POSTTRAITEMENT::lissage_chen2008(MG_MAILLAGE* mg_mai,MG_GESTIONNAIRE& gest2, double sigma, double gamma, double epsilon, int iter_max)
1353 cuillier 438 {
1354 francois 457 //Lissage global inspire de Chen(2008) corrige par Jean Christophe sept 2013
1355 cuillier 438 double un_sur_pi = 1./M_PI;
1356     int compteur = 0;
1357     int fin = 0;
1358 francois 457 compteur = 0;
1359 cuillier 438
1360     do
1361     {
1362     vector<double> nouv_position_x;
1363     vector<double> nouv_position_y;
1364     vector<double> nouv_position_z;
1365     TPL_LISTE_ENTITE<OT_VECTEUR_3D> liste_normales;
1366     TPL_LISTE_ENTITE<OT_VECTEUR_3D> liste_normales2;
1367     TPL_LISTE_ENTITE<double> liste_wij;
1368     LISTE_MG_TRIANGLE::iterator it_tri;
1369     int k = 0; //pour identifier les triangles pour liste_normales et liste_wij
1370     for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
1371     {
1372     MG_TRIANGLE_PEAU* mgtri_i = (MG_TRIANGLE_PEAU*)mgtri;
1373     OT_VECTEUR_3D normal_f_i = mgtri_i->calcul_normal();
1374     normal_f_i.norme();
1375     liste_normales2.ajouter(normal_f_i);
1376     //Remplissage de la liste des voisins du triangle i
1377     TPL_MAP_ENTITE<MG_TRIANGLE_PEAU*> liste_voisins;
1378     MG_NOEUD* noeud1 = mgtri_i->get_noeud1();
1379     double nb_voisins1 = noeud1->get_lien_triangle()->get_nb();
1380     for (int j = 0;j<nb_voisins1;j++)
1381     {
1382     MG_TRIANGLE_PEAU* mgtri_1 = (MG_TRIANGLE_PEAU*) noeud1->get_lien_triangle()->get(j);
1383     liste_voisins.ajouter(mgtri_1);
1384     }
1385     MG_NOEUD* noeud2 = mgtri_i->get_noeud2();
1386     double nb_voisins2 = noeud2->get_lien_triangle()->get_nb();
1387     for (int j = 0;j<nb_voisins2;j++)
1388     {
1389     MG_TRIANGLE_PEAU* mgtri_2 = (MG_TRIANGLE_PEAU*) noeud2->get_lien_triangle()->get(j);
1390     liste_voisins.ajouter(mgtri_2);
1391     }
1392     MG_NOEUD* noeud3 = mgtri_i->get_noeud3();
1393     double nb_voisins3 = noeud3->get_lien_triangle()->get_nb();
1394     for (int j = 0;j<nb_voisins3;j++)
1395     {
1396     MG_TRIANGLE_PEAU* mgtri_3 = (MG_TRIANGLE_PEAU*) noeud3->get_lien_triangle()->get(j);
1397     liste_voisins.ajouter(mgtri_3);
1398     }
1399     liste_voisins.supprimer(mgtri_i);
1400     int nb_voisins = liste_voisins.get_nb();
1401     double w_ij = 1./nb_voisins;
1402     double phi_i_min = 10.;
1403     double s_i = 0.0;
1404     double phi_im = 0.0;
1405     double *phi_ij = new double[nb_voisins];
1406     OT_VECTEUR_3D normal_f_i_mean(0.,0.,0.);
1407     normal_f_i_mean = normal_f_i;
1408     OT_VECTEUR_3D eta_i(0.,0.,0.);
1409     TPL_MAP_ENTITE<MG_TRIANGLE_PEAU*>::ITERATEUR it;
1410     int j = 0;
1411     for(MG_TRIANGLE_PEAU* mgtri_j=liste_voisins.get_premier(it);mgtri_j!=NULL;mgtri_j=liste_voisins.get_suivant(it))
1412     {
1413     OT_VECTEUR_3D normal_f_j = mgtri_j->calcul_normal();
1414     //1-Calculer la normale moyenne pour chaque triangle
1415     normal_f_i_mean = normal_f_i_mean + normal_f_j;
1416 francois 457 //2.1-On calcule l'angle entre normal_f_i et normal_f_j pour j allant de 1 a Nb_voisins
1417 cuillier 438 double prod_scalaire = normal_f_i*normal_f_j;
1418     if (prod_scalaire > 1.)
1419     {
1420     prod_scalaire = 1.;
1421     }
1422     if (prod_scalaire < -1.)
1423     {
1424     prod_scalaire = -1.;
1425     }
1426     phi_ij[j] = acos(prod_scalaire)*un_sur_pi;
1427     //2.2-On trouve le plus petit des angles et la normale heta_i correspondante
1428     if (phi_ij[j] < phi_i_min)
1429     {
1430     phi_i_min = phi_ij[j];
1431     eta_i = normal_f_j;
1432     }
1433 francois 457 //3.1-On calcule l'angle moyen phi_im
1434 cuillier 438 phi_im = phi_im + w_ij*phi_ij[j];
1435     j++;
1436     }
1437     normal_f_i_mean.norme();
1438     j = 0;
1439     for(MG_TRIANGLE_PEAU* mgtri_j=liste_voisins.get_premier(it);mgtri_j!=NULL;mgtri_j=liste_voisins.get_suivant(it))
1440     {
1441     //3.2-Calcul de s_i selon la variance
1442     s_i = s_i + w_ij*pow((phi_ij[j] - phi_im),2);
1443     j++;
1444     }
1445     delete[] phi_ij;
1446     //4-On calcule une nouvelle normale pour chaque triangle
1447 francois 458 double pond;
1448     int num=params.get_valeur("chen2008_filtre");
1449     if (num==1) pond=ponderation_gaussian(s_i,sigma);
1450     else if (num==2) pond=ponderation_laplacian(s_i,sigma);
1451     else if (num==3) pond=ponderation_elfallahford(s_i,sigma);
1452     OT_VECTEUR_3D normal_f_i_new = pond*normal_f_i_mean + (1. - pond)*eta_i;
1453 cuillier 438 normal_f_i_new.norme();
1454     liste_normales.ajouter(normal_f_i_new);
1455     liste_wij.ajouter(w_ij);
1456     mgtri->change_nouveau_numero(k);
1457     k++;
1458     }
1459    
1460     LISTE_MG_NOEUD::iterator it_no;
1461     for (MG_NOEUD* noeud_i=mg_mai->get_premier_noeud(it_no);noeud_i!=NULL;noeud_i=mg_mai->get_suivant_noeud(it_no))
1462     {
1463     int origine = noeud_i->get_origine();
1464 francois 791 if (origine != MAGIC::ORIGINE::IMPOSE)
1465 cuillier 438 {
1466     int nb_voisins_j = noeud_i->get_lien_triangle()->get_nb();
1467     double w_ij_prime = 0.0;
1468     OT_VECTEUR_3D v_temp(0.,0.,0.);
1469     OT_VECTEUR_3D v_i(noeud_i->get_x(),noeud_i->get_y(),noeud_i->get_z());
1470     for(int j=0;j<nb_voisins_j;j++)
1471     {
1472     MG_TRIANGLE_PEAU* mgtri_j = (MG_TRIANGLE_PEAU*) noeud_i->get_lien_triangle()->get(j);
1473 francois 457 //On calcule le centroide cj du triangle mgtri_j
1474 cuillier 438 MG_NOEUD* n1 = mgtri_j->get_noeud1();
1475     MG_NOEUD* n2 = mgtri_j->get_noeud2();
1476     MG_NOEUD* n3 = mgtri_j->get_noeud3();
1477     double cj_x = 0.333333333333333*(n1->get_x() + n2->get_x() + n3->get_x());
1478     double cj_y = 0.333333333333333*(n1->get_y() + n2->get_y() + n3->get_y());
1479     double cj_z = 0.333333333333333*(n1->get_z() + n2->get_z() + n3->get_z());
1480     //On forme le vecteur vi_cj
1481     OT_VECTEUR_3D vi_cj(cj_x - noeud_i->get_x(),cj_y - noeud_i->get_y(),cj_z - noeud_i->get_z());
1482     OT_VECTEUR_3D normal_f_i_new = liste_normales.get(mgtri_j->get_nouveau_numero());
1483     v_temp = v_temp + (vi_cj*normal_f_i_new)*normal_f_i_new;
1484     }
1485 francois 457 //5-On met a jour la position des noeuds
1486 cuillier 438 v_i = v_i + (gamma/(2*nb_voisins_j))*v_temp;
1487     nouv_position_x.push_back(v_i.get_x());
1488     nouv_position_y.push_back(v_i.get_y());
1489     nouv_position_z.push_back(v_i.get_z());
1490     }
1491     }
1492    
1493     //On actualise la position des noeuds
1494     int ind_noeud=0;
1495     for (MG_NOEUD* noeud_i=mg_mai->get_premier_noeud(it_no);noeud_i!=NULL;noeud_i=mg_mai->get_suivant_noeud(it_no))
1496     {
1497     int origine = noeud_i->get_origine();
1498 francois 791 if (origine != MAGIC::ORIGINE::IMPOSE)
1499 cuillier 438 {
1500     noeud_i->change_x(nouv_position_x[ind_noeud]);
1501     noeud_i->change_y(nouv_position_y[ind_noeud]);
1502     noeud_i->change_z(nouv_position_z[ind_noeud]);
1503     ind_noeud++;
1504     }
1505     }
1506    
1507     //Critere d'arret de l'algorithme
1508     int l=0;
1509     int nb_tri = mg_mai->get_nb_mg_triangle();
1510     for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
1511     {
1512     MG_TRIANGLE_PEAU* mgtri_i = (MG_TRIANGLE_PEAU*)mgtri;
1513     OT_VECTEUR_3D normal_f_i = liste_normales2.get(mgtri_i->get_nouveau_numero());
1514     OT_VECTEUR_3D normal_f_i_new = liste_normales.get(mgtri_i->get_nouveau_numero());
1515     double critere = 1. - normal_f_i*normal_f_i_new;
1516 picher 248 if (critere <= epsilon) l++;
1517     }
1518     double tolerance = 0.01*nb_tri;
1519     if (nb_tri - l <= 0) fin = 1;
1520     compteur++;
1521     }
1522     while ((fin == 0) && (compteur < iter_max));
1523    
1524 francois 457 return compteur;
1525    
1526 picher 248 }
1527    
1528 cuillier 438
1529 nana 629
1530 mckenzie 804 //---------------------------- Cycle Taubin 1995 par Bryan McKnezie 2016-------------------------------------------------------------------------
1531 francois 805 int MGOPT_POSTTRAITEMENT::cycle_taubin1995(MG_MAILLAGE* mg_mai,MG_GESTIONNAIRE& gest2, double lambda, double nu)
1532 mckenzie 798 {
1533    
1534     /////partie lambda du lissage
1535     vector<double> nouv_position_x;
1536     vector<double> nouv_position_y;
1537     vector<double> nouv_position_z;
1538     LISTE_MG_NOEUD::iterator it_no;
1539     for (MG_NOEUD* noeud_i=mg_mai->get_premier_noeud(it_no);noeud_i!=NULL;noeud_i=mg_mai->get_suivant_noeud(it_no))
1540     {
1541     int origine = noeud_i->get_origine();
1542 francois 805 if ((origine != MAGIC::ORIGINE::IMPOSE)&& (noeud_i->get_lien_topologie()==NULL))//((origine != MAGIC::ORIGINE::IMPOSE)&& (origine != MAGIC::ORIGINE::TRIANGULATION_ARETE)&&(noeud_i->get_lien_topologie()==NULL))///////////////////////////////////////////////////////////////////////////////
1543 mckenzie 798 {
1544 francois 805 TPL_MAP_ENTITE<MG_NOEUD*> liste_voisin;
1545     MG_MAILLAGE_OUTILS ot;
1546     ot.get_noeud_voisin(noeud_i,liste_voisin,2);
1547    
1548 mckenzie 798 int nb_voisins_j = noeud_i->get_lien_triangle()->get_nb();
1549     double delta_x = 0.0;
1550     double delta_y = 0.0;
1551     double delta_z = 0.0;
1552 francois 805 double v_x = noeud_i->get_x();//v_1->get_x();
1553     double v_y = noeud_i->get_y();//v_1->get_y();
1554     double v_z = noeud_i->get_z();//v_1->get_z();
1555     double multiplicateur = (1.0/nb_voisins_j);
1556    
1557 mckenzie 798 for(int j=0;j<nb_voisins_j;j++)
1558     {
1559 francois 805 double v_i_x=liste_voisin.get(j)->get_x();
1560     double v_i_y=liste_voisin.get(j)->get_y();
1561     double v_i_z=liste_voisin.get(j)->get_z();
1562 mckenzie 798 delta_x = delta_x+(multiplicateur*(v_i_x-v_x));
1563     delta_y = delta_y+(multiplicateur*(v_i_y-v_y));
1564     delta_z = delta_z+(multiplicateur*(v_i_z-v_z));
1565    
1566     }
1567 francois 805 double x_prime = (v_x)+(lambda*delta_x);
1568     double y_prime = (v_y)+(lambda*delta_y);
1569     double z_prime = (v_z)+(lambda*delta_z);
1570 mckenzie 798
1571 francois 805 //On calcule la nouvelle position des noeuds et on affecte au tableau temporaire
1572     nouv_position_x.push_back(x_prime);
1573     nouv_position_y.push_back(y_prime);
1574     nouv_position_z.push_back(z_prime);
1575 mckenzie 798 }
1576     }
1577     //On actualise la position des noeuds
1578     int ind_noeud=0;
1579     for (MG_NOEUD* noeud_i=mg_mai->get_premier_noeud(it_no);noeud_i!=NULL;noeud_i=mg_mai->get_suivant_noeud(it_no))
1580     {
1581     int origine = noeud_i->get_origine();
1582     if ((origine != MAGIC::ORIGINE::IMPOSE)&& (noeud_i->get_lien_topologie()==NULL))//((origine != MAGIC::ORIGINE::IMPOSE)&& (origine != MAGIC::ORIGINE::TRIANGULATION_ARETE)&&(noeud_i->get_lien_topologie()==NULL))///////////////////////////////////////////////////////////////////////////////
1583     {
1584     noeud_i->change_x(nouv_position_x[ind_noeud]);
1585     noeud_i->change_y(nouv_position_y[ind_noeud]);
1586     noeud_i->change_z(nouv_position_z[ind_noeud]);
1587     ind_noeud++;
1588     }
1589     }
1590    
1591    
1592     //partie nu du lissage
1593 francois 805 nouv_position_x.clear();
1594     nouv_position_y.clear();
1595     nouv_position_z.clear();
1596     for (MG_NOEUD* noeud_i=mg_mai->get_premier_noeud(it_no);noeud_i!=NULL;noeud_i=mg_mai->get_suivant_noeud(it_no))
1597 mckenzie 798 {
1598 francois 805 int origine = noeud_i->get_origine();
1599     if ((origine != MAGIC::ORIGINE::IMPOSE)&& (noeud_i->get_lien_topologie()==NULL))//((origine != MAGIC::ORIGINE::IMPOSE)&& (origine != MAGIC::ORIGINE::TRIANGULATION_ARETE)&&(noeud_i2->get_lien_topologie()==NULL))///////////////////////////////////////////////////////////////////////////////
1600 mckenzie 798 {
1601 francois 805 TPL_MAP_ENTITE<MG_NOEUD*> liste_voisin;
1602     MG_MAILLAGE_OUTILS ot;
1603     ot.get_noeud_voisin(noeud_i,liste_voisin,2);
1604    
1605     int nb_voisins_j = noeud_i->get_lien_triangle()->get_nb();
1606 mckenzie 798 double delta_x = 0.0;
1607     double delta_y = 0.0;
1608     double delta_z = 0.0;
1609 francois 805 double v_x = noeud_i->get_x();//v_1->get_x();
1610     double v_y = noeud_i->get_y();//v_1->get_y();
1611     double v_z = noeud_i->get_z();//v_1->get_z();
1612     double multiplicateur = (1.0/nb_voisins_j);
1613    
1614 mckenzie 798 for(int j=0;j<nb_voisins_j;j++)
1615     {
1616 francois 805 double v_i_x=liste_voisin.get(j)->get_x();
1617     double v_i_y=liste_voisin.get(j)->get_y();
1618     double v_i_z=liste_voisin.get(j)->get_z();
1619 mckenzie 798 delta_x = delta_x+(multiplicateur*(v_i_x-v_x));
1620     delta_y = delta_y+(multiplicateur*(v_i_y-v_y));
1621     delta_z = delta_z+(multiplicateur*(v_i_z-v_z));
1622    
1623     }
1624 francois 805 double x_prime = (v_x)+(nu*delta_x);
1625     double y_prime = (v_y)+(nu*delta_y);
1626     double z_prime = (v_z)+(nu*delta_z);
1627 mckenzie 798
1628 francois 805 //On calcule la nouvelle position des noeuds et on affecte au tableau temporaire
1629     nouv_position_x.push_back(x_prime);
1630     nouv_position_y.push_back(y_prime);
1631     nouv_position_z.push_back(z_prime);
1632 mckenzie 798 }
1633 francois 805 }
1634 mckenzie 798 //On actualise la position des noeuds
1635 francois 805 ind_noeud=0;
1636     for (MG_NOEUD* noeud_i=mg_mai->get_premier_noeud(it_no);noeud_i!=NULL;noeud_i=mg_mai->get_suivant_noeud(it_no))
1637 mckenzie 798 {
1638 francois 805 int origine = noeud_i->get_origine();
1639     if ((origine != MAGIC::ORIGINE::IMPOSE)&& ( noeud_i->get_lien_topologie()==NULL))//((origine != MAGIC::ORIGINE::IMPOSE)&& (origine != MAGIC::ORIGINE::TRIANGULATION_ARETE)&&( noeud_i2->get_lien_topologie()==NULL))/////////////////////////////////////////////////////////////////////////////
1640 mckenzie 798 {
1641 francois 805 noeud_i->change_x(nouv_position_x[ind_noeud]);
1642     noeud_i->change_y(nouv_position_y[ind_noeud]);
1643     noeud_i->change_z(nouv_position_z[ind_noeud]);
1644     ind_noeud++;
1645 mckenzie 798 }
1646     }
1647 francois 805 return 1;
1648 mckenzie 798
1649     }
1650    
1651 mckenzie 804 //---------------------------- Lissage Taubin 1995 par Bryan McKenzie-------------------------------------------------------------------------
1652     int MGOPT_POSTTRAITEMENT::lissage_Taubin1995(MG_MAILLAGE* mg_mai,MG_GESTIONNAIRE& gest2, double lambda, double nu, int iter_max)
1653 mckenzie 798 {
1654 mckenzie 804 int compt = 0;
1655     int ok = 0;
1656     char mess[200];
1657     do
1658     {
1659     int taubin=cycle_taubin1995(mg_mai, gest2, lambda, nu);
1660     sprintf(mess, "cycle taubin faite"); affiche(mess);
1661     compt = compt+1;
1662     sprintf(mess, "incrémentation compt %d",compt); affiche(mess);
1663     }while (compt < iter_max);
1664     return compt;
1665     sprintf(mess, "fin Taubin1995"); affiche(mess);
1666     }
1667    
1668    
1669     //---------------------------- Varience/Ecart type/ pour McKenzie2016-------------------------------------------------------------------------
1670     void MGOPT_POSTTRAITEMENT::varience_McKenzie2016(MG_MAILLAGE* mg_mai,MG_GESTIONNAIRE& gest2, double *vari0,double *vari1,double *vari2)
1671     {
1672     char mess[300];
1673     int ecart_type = 0;
1674 mckenzie 798 double s_i = 0.0;
1675     double phi_im = 0.0;
1676     double ecart_type_i = 0.;
1677 mckenzie 804 ecart_type = 0;
1678 mckenzie 798 do
1679     {
1680    
1681     TPL_LISTE_ENTITE<OT_VECTEUR_3D> liste_normales;
1682     TPL_LISTE_ENTITE<OT_VECTEUR_3D> liste_normales2;
1683     TPL_LISTE_ENTITE<double> liste_wij;
1684     LISTE_MG_TRIANGLE::iterator it_tri;
1685     int k = 0; //pour identifier les triangles pour liste_normales et liste_wij
1686     for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
1687     {
1688     MG_TRIANGLE_PEAU* mgtri_i = (MG_TRIANGLE_PEAU*)mgtri;
1689     OT_VECTEUR_3D normal_f_i = mgtri_i->calcul_normal();
1690     normal_f_i.norme();
1691     liste_normales2.ajouter(normal_f_i);
1692     //Remplissage de la liste des voisins du triangle i
1693     TPL_MAP_ENTITE<MG_TRIANGLE_PEAU*> liste_voisins;
1694     MG_NOEUD* noeud1 = mgtri_i->get_noeud1();
1695     double nb_voisins1 = noeud1->get_lien_triangle()->get_nb();
1696     for (int j = 0;j<nb_voisins1;j++)
1697     {
1698     MG_TRIANGLE_PEAU* mgtri_1 = (MG_TRIANGLE_PEAU*) noeud1->get_lien_triangle()->get(j);
1699     liste_voisins.ajouter(mgtri_1);
1700     }
1701     MG_NOEUD* noeud2 = mgtri_i->get_noeud2();
1702     double nb_voisins2 = noeud2->get_lien_triangle()->get_nb();
1703     for (int j = 0;j<nb_voisins2;j++)
1704     {
1705     MG_TRIANGLE_PEAU* mgtri_2 = (MG_TRIANGLE_PEAU*) noeud2->get_lien_triangle()->get(j);
1706     liste_voisins.ajouter(mgtri_2);
1707     }
1708     MG_NOEUD* noeud3 = mgtri_i->get_noeud3();
1709     double nb_voisins3 = noeud3->get_lien_triangle()->get_nb();
1710     for (int j = 0;j<nb_voisins3;j++)
1711     {
1712     MG_TRIANGLE_PEAU* mgtri_3 = (MG_TRIANGLE_PEAU*) noeud3->get_lien_triangle()->get(j);
1713     liste_voisins.ajouter(mgtri_3);
1714     }
1715     liste_voisins.supprimer(mgtri_i);
1716     int nb_voisins = liste_voisins.get_nb();
1717     double w_ij = 1./nb_voisins;
1718     double phi_i_min = 10.;
1719     s_i = 0.0;
1720     phi_im = 0.0;
1721     double *phi_ij = new double[nb_voisins];
1722     OT_VECTEUR_3D normal_f_i_mean(0.,0.,0.);
1723     normal_f_i_mean = normal_f_i;
1724     OT_VECTEUR_3D eta_i(0.,0.,0.);
1725     TPL_MAP_ENTITE<MG_TRIANGLE_PEAU*>::ITERATEUR it;
1726     int j = 0;
1727     double un_sur_pi = 1./M_PI;
1728     for(MG_TRIANGLE_PEAU* mgtri_j=liste_voisins.get_premier(it);mgtri_j!=NULL;mgtri_j=liste_voisins.get_suivant(it))
1729     {
1730     OT_VECTEUR_3D normal_f_j = mgtri_j->calcul_normal();
1731     //1-Calculer la normale moyenne pour chaque triangle
1732     normal_f_i_mean = normal_f_i_mean + normal_f_j;
1733     //2.1-On calcule l'angle entre normal_f_i et normal_f_j pour j allant de 1 a Nb_voisins
1734     double prod_scalaire = normal_f_i*normal_f_j;
1735     if (prod_scalaire > 1.)
1736     {
1737     prod_scalaire = 1.;
1738     }
1739     if (prod_scalaire < -1.)
1740     {
1741     prod_scalaire = -1.;
1742     }
1743     phi_ij[j] = acos(prod_scalaire)*un_sur_pi;
1744     //2.2-On trouve le plus petit des angles et la normale heta_i correspondante
1745     if (phi_ij[j] < phi_i_min)
1746     {
1747     phi_i_min = phi_ij[j];
1748     eta_i = normal_f_j;
1749     }
1750     //3.1-On calcule l'angle moyen phi_im
1751     phi_im = phi_im + w_ij*phi_ij[j];
1752     j++;
1753     }
1754     normal_f_i_mean.norme();
1755     j = 0;
1756     for(MG_TRIANGLE_PEAU* mgtri_j=liste_voisins.get_premier(it);mgtri_j!=NULL;mgtri_j=liste_voisins.get_suivant(it))
1757     {
1758     //3.2-Calcul de s_i selon la variance
1759     s_i = s_i + w_ij*pow((phi_ij[j] - phi_im),2);
1760     j++;
1761     }
1762     delete[] phi_ij;
1763     }
1764     ecart_type_i = sqrt(s_i);
1765     ecart_type = 1;
1766     }
1767     while (ecart_type == 0);
1768     ecart_type = 0;//reinitialisation d'ecart_type pour la prochainepasse
1769 mckenzie 804 *vari0 = phi_im;
1770     *vari1 = s_i;
1771     *vari2 = ecart_type_i;
1772     //return &varience[0];
1773 mckenzie 798
1774     }
1775    
1776    
1777 mckenzie 804 //---------------------------- Lissage McKenzie2016 par Bryan Mckenzie 2016-------------------------------------------------------------------------
1778     int MGOPT_POSTTRAITEMENT::lissage_McKenzie2016(MG_MAILLAGE* mg_mai,MG_GESTIONNAIRE& gest2, double lambda, double nu, double epsilon,double sigma,double gamma_,int filtre, int iter_max, int itr_taubin)
1779 mckenzie 798 {
1780 mckenzie 804 // Lissage global avec methode de lissage inspiree de Taubin 1995 et Chen 2008 par Bryan McKenzie 2016
1781 mckenzie 798
1782    
1783     //sauvegarde des differents position de noeuds pour conservation des position
1784     vector<double> coord_x;
1785     vector<double> coord_y;
1786     vector<double> coord_z;
1787     vector<double> vecteur_original;
1788     LISTE_MG_NOEUD::iterator it_no;
1789     int ii=0;
1790     for (MG_NOEUD* noeud=mg_mai->get_premier_noeud(it_no);noeud!=NULL;noeud=mg_mai->get_suivant_noeud(it_no))
1791     {
1792     MG_NOEUD* tri=(MG_NOEUD*)noeud;
1793     if(tri->get_origine()!=MAGIC::ORIGINE::MAILLEUR_AUTO)
1794     {
1795     coord_x.push_back(noeud->get_x());
1796     coord_y.push_back(noeud->get_y());
1797     coord_z.push_back(noeud->get_z());
1798     vecteur_original.push_back(sqrt(coord_x[ii]*coord_x[ii] + coord_y[ii]*coord_y[ii] + coord_z[ii]*coord_z[ii]));
1799     ii++;
1800     }
1801    
1802     }
1803    
1804    
1805    
1806     char mess[300];
1807     sprintf(mess, "Depart Taubin1995"); affiche(mess);
1808     double v_initial = 0.0;
1809     double v_final = 0.0;
1810     double v_taubin = 0.0;
1811     double v_taubin_prime = 0.0;
1812     double d_initial = 0.0;
1813     double d_final = 0.0;
1814     double d_taubin = 0.0;
1815     double nu_ = nu;
1816     double sigma_ = sigma;//variable utiliser pour sassuré que la pièce ne grossie pas dan taubin_chen 2
1817     int ecart_type = 0;
1818     double s_i = 0.0;
1819     double phi_im = 0.0;
1820     double ecart_type_i = 0.;
1821     int compteur_triangle_retourne =0;
1822     int compteur_total = 0;
1823     int compteur_taubin_initial = 0;
1824     int compteur_chen = 0;
1825     int compteur_taubin_chen = 0;
1826     int compteur_taubin_final = 0;
1827     int compteur_temp = 0;
1828     int compteur_taubin2D = 0;
1829     int triangle_final_retourne =0;
1830     int iter_taubin = itr_taubin;
1831    
1832    
1833    
1834     int activationPI = 1; // variable qui active l'adjustement du volume dans taubin1995
1835     int activationPI2 = 1; // variable qui active l'adjustement du volume dans taubin_chen
1836     double condition_de_varience = 1000.0; //variable de sortie pour les prenières iteration taubin pour s'assuré que la surface a une certaine surface lisse
1837     int taubin_premiere_passe = 0;
1838    
1839     /// Calcul du volume initial
1840 francois 805 MG_MAILLAGE_OUTILS ot;
1841     v_initial=ot.get_volume(mg_mai);
1842    
1843 mckenzie 798
1844    
1845     //******************parti taubin pur***********************************//
1846    
1847    
1848    
1849     //calcule de la varience et l'écart type pour la surface du maillaige au début
1850 mckenzie 804 double varience_ori0 = 10.0;
1851     double varience_ori1 = 10.0;
1852     double varience_ori2 = 10.0;
1853     varience_McKenzie2016(mg_mai,gest2, &varience_ori0, &varience_ori1, &varience_ori2);
1854     sprintf(mess," Moyenne des normes des triangles de la surface : %f",varience_ori0); affiche(mess);
1855     sprintf(mess," Varience des normes des triangles de la surface : %f",varience_ori1); affiche(mess);
1856     sprintf(mess," Ecart type des normes des triangles de la surface : %f",varience_ori2); affiche(mess);
1857 francois 805 v_taubin=v_initial; //ajout vincent
1858 mckenzie 798 do
1859     {
1860     v_taubin_prime = v_taubin;//assignation du volume de l'itération précédente pour fair la loi de controle
1861     int taubin=cycle_taubin1995(mg_mai, gest2, lambda, nu);
1862    
1863     /// Calcul du volume
1864 francois 805 MG_MAILLAGE_OUTILS ot;
1865     v_taubin=ot.get_volume(mg_mai);
1866 mckenzie 798
1867     //implemantion d'un PI por controler le volume
1868 francois 805 if (activationPI==1)
1869     {
1870 mckenzie 798 if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))<-0.1)//fine adjustment makes part bigger if new iteration of part is smaller than the preceeding pass and volume is less than 10% bigger than original
1871     {
1872     nu_ =nu_-0.00005;
1873     }
1874     if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))>0.1)//fine adjustment makes part smaller if part is much bigger than preceeding pass and the volume is larger than original
1875     {
1876     nu_ = nu_+0.00005;
1877     }
1878     if (fabs(v_taubin)>(fabs(v_initial)*1.015))//gross adjustment makes part smaller if part is 3% bigger than original make smaller
1879     {
1880     nu_ =nu_+0.0005;
1881     }
1882     if (fabs(v_taubin)<(fabs(v_initial)*0.985))//gross adjustment makes part bigger if it is smaller than the original
1883     {
1884     nu_ =nu_-0.0005;
1885     }
1886 francois 805 }
1887     //double un_sur_pi = 1./M_PI;
1888 mckenzie 798
1889    
1890    
1891    
1892     //code qui vérifie la qualité des different trianges
1893 francois 805 MAILLEUR_ANALYSE m3d(mg_mai);
1894     m3d.change_eps_angle_retourne(0.03000);
1895     m3d.change_borne(0.1,0.2,0.5);
1896     double qualmin,qualmax,qualmoy;
1897     int tab[7];
1898     m3d.analyse_qualite_maillage_2D(NULL,qualmin,qualmax,qualmoy,tab);
1899     int nbretourne=tab[0];
1900 mckenzie 798 int itri=0;
1901    
1902    
1903 francois 805
1904 mckenzie 798 if (tab[0]>0)
1905     {
1906     compteur_triangle_retourne++;
1907     compteur_temp--;
1908     sprintf(mess, "Triangle retourné");
1909     affiche(mess);
1910     }
1911     compteur_taubin_initial++;
1912     compteur_total++;
1913     compteur_temp++;
1914    
1915    
1916     //calcule de la varience et l'écart type pour la surface du maillaige au début
1917 mckenzie 804 double varience0 = 0.0;
1918     double varience1 =0.0;
1919     double varience2 =0.0;
1920     varience_McKenzie2016(mg_mai,gest2, &varience0, &varience1, &varience2);
1921    
1922     if (((compteur_temp >= iter_taubin)&&(varience1<0.0275))||(compteur_taubin_initial >(2*iter_taubin)))
1923 mckenzie 798 {
1924     taubin_premiere_passe = 1;
1925     }
1926    
1927    
1928     }
1929     while (taubin_premiere_passe == 0);
1930    
1931    
1932    
1933    
1934    
1935    
1936    
1937    
1938    
1939     //code d'utilisation de chen pour garder la forme et de taubin pour retirer les triangles retournés
1940 francois 805 sprintf(mess, "Début de Chen pour %d iterations avec Taubin qui résoud les triangles retournés",iter_max); affiche(mess);
1941 mckenzie 798
1942     do
1943     {
1944    
1945 mckenzie 804 int nbiter=lissage_chen2008(mg_mai,gest2,sigma,gamma_,epsilon,1);
1946 mckenzie 798
1947     // code de vérifiaction de triangle retourner
1948 francois 805 MAILLEUR_ANALYSE m3d(mg_mai);
1949     m3d.change_eps_angle_retourne(0.03000);
1950     m3d.change_borne(0.1,0.2,0.5);
1951     double qualmin,qualmax,qualmoy;
1952     int tab[7];
1953     m3d.analyse_qualite_maillage_2D(NULL,qualmin,qualmax,qualmoy,tab);
1954     int triangleretourner =tab[0];
1955 mckenzie 798
1956     //code de retourenage de triangle inverser avec taubin 1995
1957 francois 805 if (triangleretourner >0)
1958 mckenzie 798 {
1959     do
1960     {
1961     v_taubin_prime = v_taubin;//assignation du volume de l'itération précédente pour fair la loi de controle
1962     int taubin=cycle_taubin1995(mg_mai, gest2, lambda, nu);
1963    
1964     /// Calcul du volume
1965 francois 805 MG_MAILLAGE_OUTILS ot;
1966     v_taubin=ot.get_volume(mg_mai);
1967 mckenzie 798
1968     //implemantion d'un PI por controler le volume
1969     if (activationPI2 = 1)
1970     {
1971    
1972     if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))<-0.1)//fine adjustment makes part bigger if new iteration of part is smaller than the preceeding pass and volume is less than 10% bigger than original
1973     {
1974     nu_ =nu_-0.00005;
1975     }
1976    
1977     if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))>0.1)//fine adjustment makes part smaller if part is much bigger than preceeding pass and the volume is larger than original
1978     {
1979     nu_ = nu_+0.00005;
1980     }
1981    
1982     if (fabs(v_taubin)>(fabs(v_initial)*1.015))//gross adjustment makes part smaller if part is 3% bigger than original make smaller
1983     {
1984     nu_ =nu_+0.0005;
1985     }
1986 mckenzie 804 if (fabs(v_taubin)<(fabs(v_initial)*0.985))//gross adjustment makes part bigger if it is smaller than the original
1987 mckenzie 798 {
1988     nu_ =nu_-0.0005;
1989     }
1990     }
1991    
1992     //code qui vérifie la qualité des different trianges
1993 francois 805 m3d.analyse_qualite_maillage_2D(NULL,qualmin,qualmax,qualmoy,tab);
1994     if (tab[0]>0)
1995 mckenzie 798 {
1996     triangleretourner = 1;
1997     sprintf(mess, "Trianlge retourner pas régler"); affiche(mess);
1998    
1999     }
2000     else
2001     {
2002     triangleretourner = 0;
2003     sprintf(mess, "Trianlge retourner régler"); affiche(mess);
2004     }
2005     compteur_triangle_retourne++;
2006     compteur_taubin_chen++;
2007     compteur_total++;
2008     }
2009    
2010     while ((triangleretourner > 0));
2011    
2012     }
2013     compteur_total++;
2014     compteur_chen++;
2015    
2016    
2017     }
2018     while (compteur_chen < iter_max);
2019    
2020     sprintf(mess, "Début du retour de volume avec Taubin1995 qui résoud les triangles retournés"); affiche(mess);
2021     // passe final de taubin pour revenir au volume initial
2022 francois 805 v_taubin=ot.get_volume(mg_mai);
2023 mckenzie 798
2024 francois 805 if ((fabs(fabs(v_initial)-fabs(v_taubin)))>(0.02*(fabs(v_initial))))
2025 mckenzie 798 {
2026     do
2027     {
2028     v_taubin_prime = v_taubin;
2029     int taubin=cycle_taubin1995(mg_mai, gest2, lambda, nu);
2030    
2031     /// Calcul du volume
2032 francois 805 v_taubin=ot.get_volume(mg_mai);
2033 mckenzie 798
2034     //implemantion d'un PDF pour controler le volume
2035    
2036     if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))<-0.1)//fine adjustment makes part bigger if new iteration of part is smaller than the preceeding pass and volume is less than 10% bigger than original
2037     {
2038     nu_ =nu_-0.00002;
2039     sprintf(mess, "ajustement mineur 1"); affiche(mess);
2040     }
2041    
2042     if (((fabs(v_taubin)-fabs(v_taubin_prime))/fabs(v_taubin))>0.1)//fine adjustment makes part smaller if part is much bigger than preceeding pass and the volume is larger than original
2043     {
2044     nu_ = nu_+0.00002;
2045     sprintf(mess, "ajustement mineur 2"); affiche(mess);
2046     }
2047    
2048     if (fabs(v_taubin)>(fabs(v_initial)*1.015))//gross adjustment makes part smaller if part is 1.5% bigger than original make smaller
2049     {
2050     nu_ =nu_+0.0005;
2051     sprintf(mess, "ajustement majeur 1"); affiche(mess);
2052     }
2053     if (fabs(v_taubin)<(fabs(v_initial)*0.985))//gross adjustment makes part bigger if it is more than 1.5% smaller than the original
2054     {
2055     nu_ =nu_-0.0005;
2056     sprintf(mess, "ajustement majeur 2"); affiche(mess);
2057     }
2058     sprintf(mess, "Volume: %f\n old vol: %f\n nu_: %f\n",v_taubin,v_taubin_prime, nu_); affiche(mess);
2059    
2060    
2061    
2062    
2063     //code qui vérifie la qualité des different trianges
2064 francois 805 MAILLEUR_ANALYSE m3d(mg_mai);
2065     m3d.change_eps_angle_retourne(0.03000);
2066     m3d.change_borne(0.1,0.2,0.5);
2067     double qualmin,qualmax,qualmoy;
2068     int tab[7];
2069     m3d.analyse_qualite_maillage_2D(NULL,qualmin,qualmax,qualmoy,tab);
2070     int triangleretourner =tab[0];
2071     if (tab[0]>0)
2072 mckenzie 798 {
2073     compteur_triangle_retourne++;
2074     sprintf(mess, "Triangle retourné");
2075     affiche(mess);
2076     triangle_final_retourne =1;
2077     }
2078     else{triangle_final_retourne =0;}
2079    
2080     compteur_taubin_final++;
2081     compteur_total++;
2082    
2083     }
2084    
2085     while ((triangle_final_retourne ==0)&&(fabs(v_initial-v_taubin)>(fabs(0.02*v_initial))));//((compteur_ < 1000));
2086    
2087     }
2088    
2089     ////////////////////////////calcul du mouvement des noeuds par rapport a l'original
2090     /******************code qui calcule la moyenne de pourcentage de déplacement des differents noeuds*/
2091     //LISTE_MG_NOEUD::iterator it_no;
2092     ii=0;
2093 francois 805 int numdepla=0;
2094     double distot=0;
2095     double distotx=0;
2096     double distoty=0;
2097     double distotz=0;
2098     double dismin=1e300,dismax=-1e300;
2099     double disminx=1e300,dismaxx=-1e300;
2100     double disminy=1e300,dismaxy=-1e300;
2101     double disminz=1e300,dismaxz=-1e300;
2102     double xmin=1e300,xmax=-1e300;
2103     double ymin=1e300,ymax=-1e300;
2104     double zmin=1e300,zmax=-1e300;
2105 mckenzie 798 for (MG_NOEUD* noeud=mg_mai->get_premier_noeud(it_no);noeud!=NULL;noeud=mg_mai->get_suivant_noeud(it_no))
2106     {
2107 francois 805 if(noeud->get_origine()!=MAGIC::ORIGINE::IMPOSE)////////
2108 mckenzie 798 {
2109 francois 805 double x=noeud->get_x();
2110     double y=noeud->get_y();
2111     double z=noeud->get_z();
2112     if (x<xmin) xmin=x;
2113     if (y<ymin) ymin=y;
2114     if (z<zmin) zmin=z;
2115     if (x>xmax) xmax=x;
2116     if (y>ymax) ymax=y;
2117     if (z>zmax) zmax=z;
2118     double dx=fabs(noeud->get_x()-coord_x[ii]);
2119     double dy=fabs(noeud->get_y()-coord_y[ii]);
2120     double dz=fabs(noeud->get_z()-coord_z[ii]);
2121     double dis=sqrt(dx*dx+dy*dy+dz*dz);
2122     if (dx>dismaxx) dismaxx=dx;
2123     if (dx<disminx) disminx=dx;
2124     if (dy>dismaxy) dismaxy=dy;
2125     if (dy<disminy) disminy=dy;
2126     if (dz>dismaxz) dismaxz=dz;
2127     if (dz<disminz) disminz=dz;
2128     if (dis>dismax) dismax=dis;
2129     if (dis<dismin) dismin=dis;
2130     distot=distot+dis;
2131     distotx=distoty+dx;
2132     distoty=distoty+dy;
2133     distotz=distotz+dz;
2134     numdepla++;
2135 mckenzie 798 }
2136 francois 805 ii++;
2137 mckenzie 798 }
2138 francois 805 affiche((char*)"");
2139     sprintf(mess, "Déplacement absolu minimum en X : %f en Y : %f en Z : %f en amplitude : %f",disminx,disminy,disminz,dismin); affiche(mess);
2140     sprintf(mess, "Déplacement absolu maximum en X : %f en Y : %f en Z : %f en amplitude : %f",dismaxx,dismaxy,dismaxz,dismax); affiche(mess);
2141     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);
2142     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);
2143     double dx=xmax-xmin;
2144     double dy=ymax-ymin;
2145     double dz=zmax-zmin;
2146     double dmax=dx;
2147     if (dy>dmax) dmax=dy;
2148     if (dz>dmax) dmax=dz;
2149     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);
2150     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);
2151 mckenzie 798
2152    
2153    
2154 francois 805 affiche((char*)"");
2155 mckenzie 798
2156 francois 805 affiche((char*)"");
2157    
2158    
2159    
2160 mckenzie 798 /// Calcul du volume final
2161 francois 805 v_final=ot.get_volume(mg_mai);
2162    
2163 mckenzie 798 double delta_vol = v_final-v_initial;
2164     double vol_pourcent = (v_final/v_initial)*100;
2165     double delta_vol_pourcent = vol_pourcent-100;
2166     sprintf(mess, "Volume initial: %f",v_initial);affiche(mess);
2167     sprintf(mess, "Volume final: %f",v_final);affiche(mess);
2168 francois 805 sprintf(mess, "Volume final pourcentage: %f%%",vol_pourcent);affiche(mess);
2169 mckenzie 798 sprintf(mess, "Delta Volume: %f",delta_vol);affiche(mess);
2170 francois 805 sprintf(mess, "Delta Volume pourcentage: %f%%",delta_vol_pourcent);affiche(mess);
2171 mckenzie 798 sprintf(mess, " Iteration inital Taubin1995: %i",compteur_taubin_initial); affiche(mess);
2172     sprintf(mess, " Iteration Chen2008: %i",compteur_chen); affiche(mess);
2173     sprintf(mess, " Iteration Taubin1995 dans Chen2008: %i",compteur_taubin_chen); affiche(mess);
2174     sprintf(mess, " epsilon: %f",epsilon); affiche(mess);
2175     sprintf(mess, " sigma: %f",sigma); affiche(mess);
2176     sprintf(mess, " gamma_: %f",gamma_); affiche(mess);
2177     sprintf(mess, " filtre: %i",filtre); affiche(mess);
2178     sprintf(mess, " Iteration final Taubin1995: %i",compteur_taubin_final); affiche(mess);
2179     sprintf(mess, " lambda(depart): %f",lambda); affiche(mess);
2180     sprintf(mess, " nu(depart):%f",nu); affiche(mess);
2181     sprintf(mess, " nu(fin):%f",nu_); affiche(mess);
2182     sprintf(mess, " Iteration triangle retourné: %i",compteur_triangle_retourne); affiche(mess);
2183     sprintf(mess, " Iteration Total: %i",compteur_total); affiche(mess);
2184    
2185    
2186    
2187     //verification de nombre de triange retournée
2188 francois 805 MAILLEUR_ANALYSE m3d(mg_mai);
2189     double eps_angle_retourne=0.03;
2190     m3d.change_eps_angle_retourne(eps_angle_retourne);
2191     double borne1=0.1;
2192     double borne2=0.2;
2193     double borne3=0.5;
2194     m3d.change_borne(borne1,borne2,borne3);
2195     double qualmin,qualmax,qualmoy;
2196     int tab[7];
2197     m3d.analyse_qualite_maillage_2D(NULL,qualmin,qualmax,qualmoy,tab);
2198     sprintf(mess,"\n\nANALYSEUR DE MG MAILLAGE 2D"); affiche(mess);
2199 mckenzie 798 sprintf(mess," Nombre de triangles avec des noeuds fusionnés : %d",tab[6]); affiche(mess);
2200     sprintf(mess," Nombre de triangles avec 1 voisin manquant : %d",tab[5]); affiche(mess);
2201     sprintf(mess," critere d'angle limite pour l'inversion : %lf",eps_angle_retourne); affiche(mess);
2202 francois 805 sprintf(mess," qualite moyenne des triangles de frontiere : %lf",qualmoy); affiche(mess);
2203 mckenzie 798 sprintf(mess," qualite min des triangles de frontiere : %lf",qualmin); affiche(mess);
2204     sprintf(mess," qualite max des triangles de frontiere : %lf",qualmax); affiche(mess);
2205 francois 805 sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne3,tab[4],tab[4]*100./mg_mai->get_nb_mg_triangle()); affiche(mess);
2206     sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne2,tab[3],tab[3]*100./mg_mai->get_nb_mg_triangle()); affiche(mess);
2207     sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne1,tab[2],tab[2]*100./mg_mai->get_nb_mg_triangle()); affiche(mess);
2208     sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",0.,tab[1],tab[1]*100./mg_mai->get_nb_mg_triangle()); affiche(mess);
2209     sprintf(mess," nombre de triangles de frontiere retournes : %d (%.2lf%%)",tab[0],tab[0]*100./mg_mai->get_nb_mg_triangle()); affiche(mess);
2210 mckenzie 798
2211     //calcule de la varience et l'écart type pour la surface du maillaige
2212 mckenzie 804 double varience00 =0.0;
2213     double varience11 =0.0;
2214     double varience22 =0.0;
2215     varience_McKenzie2016(mg_mai,gest2, &varience00, &varience11, &varience22);
2216 francois 805 sprintf(mess,"\n Moyenne des normes des triangles de la surface : %f",varience00); affiche(mess);
2217 mckenzie 804 sprintf(mess," Varience des normes des triangles de la surface : %f",varience11); affiche(mess);
2218     sprintf(mess," Ecart type des normes des triangles de la surface : %f",varience22); affiche(mess);
2219 mckenzie 798
2220     return compteur_total;
2221     }
2222    
2223    
2224    
2225    
2226 francois 457 //---------------------------- Extract skin -------------------------------------------------------------------------
2227 francois 460 int MGOPT_POSTTRAITEMENT::extract_skin(MG_MAILLAGE* mg_mai,MG_GESTIONNAIRE& gest2,int &nbpeau,int &nbmaniare,int &nbmanino, int *mai2_id)
2228 cuillier 438 {
2229    
2230 francois 457 //etape 0 - On commence par mettre a zero tous les nouveau_numero des triangles et des noeuds du maillage
2231 francois 222 LISTE_MG_TRIANGLE::iterator it_tri;
2232     for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
2233     {
2234     mgtri->change_nouveau_numero(0);
2235 francois 791 mgtri->change_origine(MAGIC::ORIGINE::MAILLEUR_AUTO);
2236 francois 222 }
2237     LISTE_MG_NOEUD::iterator it_noeud;
2238     for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
2239     {
2240     mgnoeud->change_nouveau_numero(0);
2241     }
2242    
2243 francois 457 //etape 1 - On boucle ensuite tous les tetraedres pour ajouter un compteur du nombre de fois qu'un triangle appartient a 1 tetra
2244 picher 233 LISTE_MG_TETRA::iterator it_tetra;
2245     for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
2246 francois 222 {
2247     int origine = mgtet->get_origine();
2248 francois 791 if (origine==MAGIC::ORIGINE::IMPOSE)
2249 francois 222 {
2250 francois 791 mgtet->get_triangle1()->change_origine(MAGIC::ORIGINE::IMPOSE);
2251     mgtet->get_triangle2()->change_origine(MAGIC::ORIGINE::IMPOSE);
2252     mgtet->get_triangle3()->change_origine(MAGIC::ORIGINE::IMPOSE);
2253     mgtet->get_triangle4()->change_origine(MAGIC::ORIGINE::IMPOSE);
2254 francois 224 }
2255 francois 791 if (origine==MAGIC::ORIGINE::OPTIMISE)
2256 francois 224 {
2257 francois 791 if (mgtet->get_triangle1()->get_origine()!=MAGIC::ORIGINE::IMPOSE) mgtet->get_triangle1()->change_origine(MAGIC::ORIGINE::OPTIMISE);
2258     if (mgtet->get_triangle2()->get_origine()!=MAGIC::ORIGINE::IMPOSE) mgtet->get_triangle2()->change_origine(MAGIC::ORIGINE::OPTIMISE);
2259     if (mgtet->get_triangle3()->get_origine()!=MAGIC::ORIGINE::IMPOSE) mgtet->get_triangle3()->change_origine(MAGIC::ORIGINE::OPTIMISE);
2260     if (mgtet->get_triangle4()->get_origine()!=MAGIC::ORIGINE::IMPOSE) mgtet->get_triangle4()->change_origine(MAGIC::ORIGINE::OPTIMISE);
2261 francois 224 }
2262    
2263 francois 791 if (((origine == MAGIC::ORIGINE::OPTIMISE) && (etat[(MAGIC::ORIGINE::OPTIMISE-1000)/10]==1) ) ||
2264     ((origine == MAGIC::ORIGINE::IMPOSE) && (etat[(MAGIC::ORIGINE::IMPOSE-1000)/10]==1) ) ||
2265     ((origine == MAGIC::ORIGINE::MAILLEUR_AUTO) && (etat[(MAGIC::ORIGINE::MAILLEUR_AUTO-1000)/10]==1) ) ||
2266     ((origine == MAGIC::ORIGINE::TRIANGULATION) && (etat[(MAGIC::ORIGINE::TRIANGULATION-1000)/10]==1) ) ||
2267     ((origine == MAGIC::ORIGINE::MODIFICATION) && (etat[(MAGIC::ORIGINE::MODIFICATION-1000)/10]==1) ) ||
2268     ((origine == MAGIC::ORIGINE::DUPLIQUER) && (etat[(MAGIC::ORIGINE::DUPLIQUER-1000)/10]==1) ) )
2269 francois 224
2270     {
2271 francois 222 int num1 = mgtet->get_triangle1()->get_nouveau_numero();
2272     int num2 = mgtet->get_triangle2()->get_nouveau_numero();
2273     int num3 = mgtet->get_triangle3()->get_nouveau_numero();
2274     int num4 = mgtet->get_triangle4()->get_nouveau_numero();
2275     num1++;
2276     num2++;
2277     num3++;
2278     num4++;
2279     mgtet->get_triangle1()->change_nouveau_numero(num1);
2280     mgtet->get_triangle2()->change_nouveau_numero(num2);
2281     mgtet->get_triangle3()->change_nouveau_numero(num3);
2282     mgtet->get_triangle4()->change_nouveau_numero(num4);
2283     }
2284     }
2285    
2286 francois 457 //etape 2 - On boucle l'ensemble des triangles identifies a l'etape 1 pour identifier les noeuds leur appartenant
2287 francois 222 for (MG_TRIANGLE* mgtri=mg_mai->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mg_mai->get_suivant_triangle(it_tri))
2288     {
2289     int num = mgtri->get_nouveau_numero();
2290     if (num == 1)
2291     {
2292     MG_NOEUD* noeud1 = mgtri->get_noeud1();
2293     MG_NOEUD* noeud2 = mgtri->get_noeud2();
2294     MG_NOEUD* noeud3 = mgtri->get_noeud3();
2295     noeud1->change_nouveau_numero(1);
2296     noeud2->change_nouveau_numero(1);
2297     noeud3->change_nouveau_numero(1);
2298 francois 791 if (mgtri->get_origine()==MAGIC::ORIGINE::IMPOSE)
2299 picher 248 {
2300 francois 791 noeud1->change_origine(MAGIC::ORIGINE::IMPOSE);
2301     noeud2->change_origine(MAGIC::ORIGINE::IMPOSE);
2302     noeud3->change_origine(MAGIC::ORIGINE::IMPOSE);
2303 picher 248 }
2304 francois 222 }
2305     }
2306    
2307 francois 457 //etape 3 - On cree un nouveau maillage pour la peau
2308 francois 793 gest2.vide();
2309     MG_GEOMETRIE* geo=new MG_GEOMETRIE((char*)"VIRTUEL",(char*)"VIRTUEL");
2310     geo->change_valeur_unite(mg_mai->get_mg_geometrie()->get_valeur_unite());
2311     gest2.ajouter_mg_geometrie(geo);
2312 francois 830 MG_VOLUME_ELEMENT* vol=new MG_VOLUME_ELEMENT();
2313     geo->ajouter_mg_volume(vol);
2314     vol->copie_ccf(*(mg_mai->get_mg_geometrie()->get_mg_volume(0)));
2315     std::map<unsigned long,unsigned long> correspondidsom;
2316     std::map<unsigned long,unsigned long> correspondid;
2317     LISTE_MG_SOMMET::iterator its;
2318     for (MG_SOMMET* som=mg_mai->get_mg_geometrie()->get_premier_sommet(its);som!=NULL;som=mg_mai->get_mg_geometrie()->get_suivant_sommet(its))
2319     {
2320     if (som->get_nb_ccf()>0)
2321     {
2322     MG_SOMMET_NOEUD* somno=new MG_SOMMET_NOEUD();
2323     geo->ajouter_mg_sommet(somno);
2324     somno->copie_ccf(*som);
2325     correspondidsom[som->get_id()]=somno->get_id();
2326     }
2327     }
2328     LISTE_MG_ARETE::iterator ita;
2329     for (MG_ARETE* are=mg_mai->get_mg_geometrie()->get_premier_arete(ita);are!=NULL;are=mg_mai->get_mg_geometrie()->get_suivant_arete(ita))
2330     {
2331     if (are->get_nb_ccf()>0)
2332     {
2333     MG_ARETE_ELEMENT* areel=new MG_ARETE_ELEMENT();
2334     geo->ajouter_mg_arete(areel);
2335     areel->copie_ccf(*are);
2336     correspondid[are->get_id()]=areel->get_id();
2337     }
2338     }
2339     LISTE_MG_FACE::iterator itf;
2340     for (MG_FACE* face=mg_mai->get_mg_geometrie()->get_premier_face(itf);face!=NULL;face=mg_mai->get_mg_geometrie()->get_suivant_face(itf))
2341     {
2342     if (face->get_nb_ccf()>0)
2343     {
2344     MG_FACE_ELEMENT* facel=new MG_FACE_ELEMENT();
2345     geo->ajouter_mg_face(facel);
2346     facel->copie_ccf(*face);
2347     correspondid[face->get_id()]=facel->get_id();
2348     }
2349     }
2350     MG_FACE_ELEMENT* faceex=new MG_FACE_ELEMENT();
2351     geo->ajouter_mg_face(faceex);
2352     MG_FACE_ELEMENT* facenoex=new MG_FACE_ELEMENT();
2353     geo->ajouter_mg_face(facenoex);
2354 francois 793 MG_MAILLAGE* mai2 = new MG_MAILLAGE(geo);
2355 francois 830 //MG_MAILLAGE* mai2 = new MG_MAILLAGE(NULL);
2356 francois 222 gest2.ajouter_mg_maillage(mai2);
2357    
2358 francois 457 //etape 4 - On boucle l'ensemble des noeuds identifies a l'etape 2 pour les recreer dans le second maillage
2359 francois 222 for (MG_NOEUD* mgnoeud=mg_mai->get_premier_noeud(it_noeud);mgnoeud!=NULL;mgnoeud=mg_mai->get_suivant_noeud(it_noeud))
2360     {
2361     int num = mgnoeud->get_nouveau_numero();
2362     if (num == 1)
2363     {
2364     double x = mgnoeud->get_x();
2365     double y = mgnoeud->get_y();
2366     double z = mgnoeud->get_z();
2367 francois 791 int origine=MAGIC::ORIGINE::TRIANGULATION;
2368 francois 792 int nb_tri=mgnoeud->get_lien_triangle()->get_nb();
2369     bool tri2d=false,tri3d=false;
2370     for (int i=0;i<nb_tri;i++)
2371     {
2372     if (mgnoeud->get_lien_triangle()->get(i)->get_nouveau_numero()==1)
2373     {
2374     if (mgnoeud->get_lien_triangle()->get(i)->get_lien_topologie()->get_dimension()==2) tri2d=true;
2375     if (mgnoeud->get_lien_triangle()->get(i)->get_lien_topologie()->get_dimension()==3) tri3d=true;
2376     }
2377     }
2378     if ((tri2d)&&(tri3d)) origine=MAGIC::ORIGINE::TRIANGULATION_ARETE;
2379     if (mgnoeud->get_lien_topologie()->get_dimension()==1) origine=MAGIC::ORIGINE::TRIANGULATION_ARETE;
2380 francois 791 if (mgnoeud->get_origine()==MAGIC::ORIGINE::IMPOSE) origine=MAGIC::ORIGINE::IMPOSE;
2381 francois 830 MG_ELEMENT_TOPOLOGIQUE* topo=NULL;
2382     std::map<unsigned long,unsigned long>::iterator it=correspondidsom.find(mgnoeud->get_lien_topologie()->get_id());
2383     if (it!=correspondidsom.end())
2384     topo=geo->get_mg_sommetid(it->second);
2385     MG_NOEUD* noeud1 = new MG_NOEUD(topo,x,y,z,origine);
2386     if (it!=correspondidsom.end())
2387     ((MG_SOMMET_NOEUD*)topo)->change_mg_noeud(noeud1);
2388 francois 222 mai2->ajouter_mg_noeud(noeud1);
2389     mgnoeud->change_nouveau_numero(noeud1->get_id());
2390 francois 234 noeud1->change_nouveau_numero(mgnoeud->get_id());
2391 francois 222 }
2392     }
2393    
2394 francois 457 // etape 5 - On boucle l'ensemble des triangles identifies a l'etape 1 pour les recreer dans le maillage 2
2395 picher 233 for (MG_TETRA* mgtet=mg_mai->get_premier_tetra(it_tetra);mgtet!=NULL;mgtet=mg_mai->get_suivant_tetra(it_tetra))
2396 francois 222 {
2397 francois 224 int originetet=mgtet->get_origine();
2398 francois 791 if (((originetet == MAGIC::ORIGINE::OPTIMISE) && (etat[(MAGIC::ORIGINE::OPTIMISE-1000)/10]==1) ) ||
2399     ((originetet == MAGIC::ORIGINE::IMPOSE) && (etat[(MAGIC::ORIGINE::IMPOSE-1000)/10]==1) ) ||
2400     ((originetet == MAGIC::ORIGINE::MAILLEUR_AUTO) && (etat[(MAGIC::ORIGINE::MAILLEUR_AUTO-1000)/10]==1) ) ||
2401     ((originetet == MAGIC::ORIGINE::TRIANGULATION) && (etat[(MAGIC::ORIGINE::TRIANGULATION-1000)/10]==1) ) ||
2402     ((originetet == MAGIC::ORIGINE::MODIFICATION) && (etat[(MAGIC::ORIGINE::MODIFICATION-1000)/10]==1) ) ||
2403     ((originetet == MAGIC::ORIGINE::DUPLIQUER) && (etat[(MAGIC::ORIGINE::DUPLIQUER-1000)/10]==1) ) )
2404 francois 222 {
2405 francois 224 MG_NOEUD* noeud1 = mgtet->get_noeud1();
2406     MG_NOEUD* noeud2 = mgtet->get_noeud2();
2407     MG_NOEUD* noeud3 = mgtet->get_noeud3();
2408     MG_NOEUD* noeud4 = mgtet->get_noeud4();
2409 francois 222 MG_NOEUD* node1 = mai2->get_mg_noeudid(noeud1->get_nouveau_numero());
2410     MG_NOEUD* node2 = mai2->get_mg_noeudid(noeud2->get_nouveau_numero());
2411     MG_NOEUD* node3 = mai2->get_mg_noeudid(noeud3->get_nouveau_numero());
2412 francois 224 MG_NOEUD* node4 = mai2->get_mg_noeudid(noeud4->get_nouveau_numero());
2413     MG_TRIANGLE* tri1=mgtet->get_triangle1();
2414     MG_TRIANGLE* tri2=mgtet->get_triangle2();
2415     MG_TRIANGLE* tri3=mgtet->get_triangle3();
2416     MG_TRIANGLE* tri4=mgtet->get_triangle4();
2417     if (tri1->get_nouveau_numero()==1)
2418     {
2419 francois 791 int origine=MAGIC::ORIGINE::TRIANGULATION;
2420     if (tri1->get_origine()==MAGIC::ORIGINE::IMPOSE) origine=MAGIC::ORIGINE::IMPOSE;
2421 francois 830 MG_FACE* topo=facenoex;
2422     if (tri1->get_lien_topologie()->get_dimension()==2) topo=faceex;
2423     std::map<unsigned long,unsigned long>::iterator it=correspondid.find(tri1->get_lien_topologie()->get_id());
2424     if (it!=correspondid.end())
2425     topo=geo->get_mg_faceid(it->second);
2426     MG_TRIANGLE_PEAU* tripeau = insere_triangle(geo,mg_mai,noeud1,noeud2,noeud3,correspondid,topo,node1,node2,node3,mai2,origine);
2427 francois 224 tripeau->change_nouveau_numero(0);
2428     tri1->change_nouveau_numero(0);
2429     }
2430     if (tri2->get_nouveau_numero()==1)
2431     {
2432 francois 791 int origine=MAGIC::ORIGINE::TRIANGULATION;
2433     if (tri2->get_origine()==MAGIC::ORIGINE::IMPOSE) origine=MAGIC::ORIGINE::IMPOSE;
2434 francois 830 MG_FACE* topo=facenoex;
2435     if (tri2->get_lien_topologie()->get_dimension()==2) topo=faceex;
2436     std::map<unsigned long,unsigned long>::iterator it=correspondid.find(tri2->get_lien_topologie()->get_id());
2437     if (it!=correspondid.end())
2438     topo=geo->get_mg_faceid(it->second);
2439     MG_TRIANGLE_PEAU* tripeau = insere_triangle(geo,mg_mai,noeud1,noeud4,noeud2,correspondid,topo,node1,node4,node2,mai2,origine);
2440 francois 224 tripeau->change_nouveau_numero(0);
2441     tri2->change_nouveau_numero(0);
2442     }
2443     if (tri3->get_nouveau_numero()==1)
2444     {
2445 francois 791 int origine=MAGIC::ORIGINE::TRIANGULATION;
2446 francois 830 MG_FACE* topo=facenoex;
2447     if (tri3->get_lien_topologie()->get_dimension()==2) topo=faceex;
2448 francois 791 if (tri3->get_origine()==MAGIC::ORIGINE::IMPOSE) origine=MAGIC::ORIGINE::IMPOSE;
2449 francois 830 std::map<unsigned long,unsigned long>::iterator it=correspondid.find(tri3->get_lien_topologie()->get_id());
2450     if (it!=correspondid.end())
2451     topo=geo->get_mg_faceid(it->second);
2452     MG_TRIANGLE_PEAU* tripeau = insere_triangle(geo,mg_mai,noeud2,noeud4,noeud3,correspondid,topo,node2,node4,node3,mai2,origine);
2453 francois 224 tripeau->change_nouveau_numero(0);
2454     tri3->change_nouveau_numero(0);
2455     }
2456     if (tri4->get_nouveau_numero()==1)
2457     {
2458 francois 791 int origine=MAGIC::ORIGINE::TRIANGULATION;
2459 francois 830 MG_FACE* topo=facenoex;
2460     if (tri4->get_lien_topologie()->get_dimension()==2) topo=faceex;
2461 francois 791 if (tri4->get_origine()==MAGIC::ORIGINE::IMPOSE) origine=MAGIC::ORIGINE::IMPOSE;
2462 francois 830 std::map<unsigned long,unsigned long>::iterator it=correspondid.find(tri4->get_lien_topologie()->get_id());
2463     if (it!=correspondid.end())
2464     topo=geo->get_mg_faceid(it->second);
2465     MG_TRIANGLE_PEAU* tripeau = insere_triangle(geo,mg_mai,noeud1,noeud3,noeud4,correspondid,topo,node1,node3,node4,mai2,origine);
2466 francois 224 tripeau->change_nouveau_numero(0);
2467     tri4->change_nouveau_numero(0);
2468     }
2469 francois 222 }
2470 francois 224 }
2471     // etape 6 recherche des vosins
2472     for (MG_TRIANGLE* mgtri=mai2->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mai2->get_suivant_triangle(it_tri))
2473     {
2474     MG_TRIANGLE_PEAU* tripeau=(MG_TRIANGLE_PEAU*)mgtri;
2475     MG_TRIANGLE_PEAU* voisin1=recherche_voisin(tripeau->get_noeud1(),tripeau->get_noeud2(),tripeau);
2476     MG_TRIANGLE_PEAU* voisin2=recherche_voisin(tripeau->get_noeud2(),tripeau->get_noeud3(),tripeau);
2477     MG_TRIANGLE_PEAU* voisin3=recherche_voisin(tripeau->get_noeud3(),tripeau->get_noeud1(),tripeau);
2478     tripeau->change_voisin1(voisin1);
2479     tripeau->change_voisin2(voisin2);
2480     tripeau->change_voisin3(voisin3);
2481     }
2482 francois 457 // etape 7 - On recherche les peaux
2483 francois 224 int fin;
2484     do
2485     {
2486     fin=1;
2487     for (MG_TRIANGLE* mgtri=mai2->get_premier_triangle(it_tri);mgtri!=NULL;mgtri=mai2->get_suivant_triangle(it_tri))
2488     {
2489     MG_TRIANGLE_PEAU *tripeau=(MG_TRIANGLE_PEAU*)mgtri;
2490     if (tripeau->get_nouveau_numero()==0)
2491     {
2492     fin=0;
2493     std::vector<MG_TRIANGLE_PEAU*> *peau=new std::vector<MG_TRIANGLE_PEAU*>;
2494     lst_peau.push_back(peau);
2495     tripeau->change_nouveau_numero(1);
2496     peau->push_back(tripeau);
2497     determine_peau(peau);
2498     }
2499     }
2500     }
2501     while (fin==0);
2502 francois 457 nbpeau=lst_peau.size();
2503 francois 224 //test de manifold
2504     LISTE_MG_SEGMENT::iterator itseg;
2505     for (MG_SEGMENT* seg=mai2->get_premier_segment(itseg);seg!=NULL;seg=mai2->get_suivant_segment(itseg))
2506     seg->change_nouveau_numero(0);
2507     TPL_MAP_ENTITE<MG_SEGMENT*> nonmanifoldarete;
2508     TPL_MAP_ENTITE<MG_NOEUD*> nonmanifoldnoeud;
2509 francois 234 TPL_MAP_ENTITE<MG_NOEUD*> nonmanifoldnoeuddepuisarete;
2510 francois 457 nbpeau=lst_peau.size();
2511 francois 224 for (int i=0;i<nbpeau;i++)
2512     {
2513     int nbtri=lst_peau[i]->size();
2514     for (int j=0;j<nbtri;j++)
2515     {
2516     MG_TRIANGLE_PEAU* tripeau=(*lst_peau[i])[j];
2517     tripeau->get_segment1()->change_nouveau_numero(tripeau->get_segment1()->get_nouveau_numero()+1);
2518     tripeau->get_segment2()->change_nouveau_numero(tripeau->get_segment2()->get_nouveau_numero()+1);
2519     tripeau->get_segment3()->change_nouveau_numero(tripeau->get_segment3()->get_nouveau_numero()+1);
2520     if (tripeau->get_segment1()->get_nouveau_numero()>2)
2521     nonmanifoldarete.ajouter(tripeau->get_segment1());
2522     if (tripeau->get_segment2()->get_nouveau_numero()>2)
2523     nonmanifoldarete.ajouter(tripeau->get_segment2());
2524     if (tripeau->get_segment3()->get_nouveau_numero()>2)
2525     nonmanifoldarete.ajouter(tripeau->get_segment3());
2526     }
2527     }
2528 picher 233
2529 francois 224 int nbnonmanifoldarete=nonmanifoldarete.get_nb();
2530     for (int i=0;i<nbnonmanifoldarete;i++)
2531     {
2532     MG_SEGMENT* seg=nonmanifoldarete.get(i);
2533     MG_NOEUD* n1=seg->get_noeud1();
2534     MG_NOEUD* n2=seg->get_noeud2();
2535 francois 234 nonmanifoldnoeuddepuisarete.ajouter(n1);
2536     nonmanifoldnoeuddepuisarete.ajouter(n2);
2537 francois 224 }
2538 francois 234 LISTE_MG_NOEUD::iterator itnoeud;
2539     for (MG_NOEUD* no=mai2->get_premier_noeud(itnoeud);no!=NULL;no=mai2->get_suivant_noeud(itnoeud))
2540     {
2541     if (nonmanifoldnoeuddepuisarete.existe(no)) continue;
2542     if (est_non_manifold(no)) nonmanifoldnoeud.ajouter(no);
2543     }
2544 francois 224
2545 francois 457 nbmaniare = nonmanifoldarete.get_nb();
2546     nbmanino = nonmanifoldnoeud.get_nb();
2547 picher 230
2548 francois 457 //etape 8 - Traitement des cas de non manifold
2549     //non manifold par arete
2550 picher 233 for (int i=0;i<nbnonmanifoldarete;i++)
2551     {
2552     MG_SEGMENT* segment=nonmanifoldarete.get(i);
2553 francois 234 MG_NOEUD* noeud1 = mg_mai->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
2554     MG_NOEUD* noeud2 = mg_mai->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
2555     int nb_tetra = noeud1->get_lien_tetra()->get_nb();
2556     for (int j=0;j<nb_tetra;j++)
2557 picher 233 {
2558 francois 234 MG_TETRA* mgtet =noeud1->get_lien_tetra()->get(j);
2559     int originetet=mgtet->get_origine();
2560 francois 791 if (originetet == MAGIC::ORIGINE::MAILLEUR_AUTO)
2561 picher 233 {
2562 francois 457 //On reactive le tetra si l'autre noeud du segment lui appartient aussi
2563 francois 234 MG_NOEUD* no1 = mgtet->get_noeud1();
2564     MG_NOEUD* no2 = mgtet->get_noeud2();
2565     MG_NOEUD* no3 = mgtet->get_noeud3();
2566     MG_NOEUD* no4 = mgtet->get_noeud4();
2567     if((no1 == noeud2) ||(no2 == noeud2) || (no3 == noeud2) || (no4 == noeud2))
2568 francois 791 mgtet->change_origine(MAGIC::ORIGINE::OPTIMISE);
2569 picher 233 }
2570     }
2571     }
2572    
2573     //non manifold par noeud
2574 picher 231 int nbnonmanifoldnoeud=nonmanifoldnoeud.get_nb();
2575     for (int i=0;i<nbnonmanifoldnoeud;i++)
2576     {
2577 francois 234 MG_NOEUD* noeud=mg_mai->get_mg_noeudid(nonmanifoldnoeud.get(i)->get_nouveau_numero());
2578     int nb_tetra = noeud->get_lien_tetra()->get_nb();
2579     for (int j = 0;j<nb_tetra;j++)
2580 francois 345 {
2581 francois 234 MG_TETRA* mgtet =noeud->get_lien_tetra()->get(j);
2582     int originetet=mgtet->get_origine();
2583 francois 791 if (originetet == MAGIC::ORIGINE::MAILLEUR_AUTO)
2584 picher 231 {
2585 francois 791 mgtet->change_origine(MAGIC::ORIGINE::OPTIMISE);
2586 picher 231 }
2587     }
2588     }
2589 francois 234 *mai2_id = mai2->get_id();
2590     if ((nbnonmanifoldarete != 0) || (nbnonmanifoldnoeud != 0))
2591     {
2592     for (int i=0;i<lst_peau.size();i++)
2593     {
2594     delete lst_peau[i];
2595     }
2596     lst_peau.clear();
2597     gest2.supprimer_mg_maillageid(*mai2_id);
2598     return 0;
2599     }
2600 picher 230
2601 francois 234 return 1;
2602 francois 222 }
2603    
2604 francois 832
2605     int MGOPT_POSTTRAITEMENT::cardinalite(MG_MAILLAGE* mgmai, int cardinalite_iter)
2606     {
2607     for (int i=0;i<cardinalite_iter;i++)
2608     {
2609     TPL_MAP_ENTITE<MG_NOEUD*> lst;
2610     LISTE_MG_NOEUD::iterator it;
2611     for (MG_NOEUD* no=mgmai->get_premier_noeud(it);no!=NULL;no=mgmai->get_suivant_noeud(it))
2612     if (no->get_lien_triangle()->get_nb()==3)
2613     {
2614     if (no->get_lien_triangle()->get(0)->get_origine()!=MAGIC::ORIGINE::IMPOSE)
2615     if (no->get_lien_triangle()->get(1)->get_origine()!=MAGIC::ORIGINE::IMPOSE)
2616     if (no->get_lien_triangle()->get(2)->get_origine()!=MAGIC::ORIGINE::IMPOSE)
2617     lst.ajouter(no);
2618     }
2619     int nbcas=lst.get_nb();
2620     char message[255];
2621     sprintf(message," Itération %d, nombre de noeuds de cardinalite 3 : %d",i+1,nbcas);
2622     affiche(message);
2623     if (nbcas==0) return i;
2624     for (int j=0;j<nbcas;j++)
2625     {
2626     MG_NOEUD* no=lst.get(j);
2627     TPL_MAP_ENTITE<MG_NOEUD*> lstno;
2628     lstno.ajouter(no->get_lien_triangle()->get(0)->get_noeud1());
2629     lstno.ajouter(no->get_lien_triangle()->get(0)->get_noeud2());
2630     lstno.ajouter(no->get_lien_triangle()->get(0)->get_noeud3());
2631     lstno.ajouter(no->get_lien_triangle()->get(1)->get_noeud1());
2632     lstno.ajouter(no->get_lien_triangle()->get(1)->get_noeud2());
2633     lstno.ajouter(no->get_lien_triangle()->get(1)->get_noeud3());
2634     lstno.ajouter(no->get_lien_triangle()->get(2)->get_noeud1());
2635     lstno.ajouter(no->get_lien_triangle()->get(2)->get_noeud2());
2636     lstno.ajouter(no->get_lien_triangle()->get(2)->get_noeud3());
2637     lstno.supprimer(no);
2638     MG_ELEMENT_TOPOLOGIQUE* topo=no->get_lien_triangle()->get(0)->get_lien_topologie();
2639     int origine=no->get_lien_triangle()->get(0)->get_origine();
2640     OT_VECTEUR_3D normal;
2641     for (int k=0;k<3;k++)
2642     {
2643     MG_TRIANGLE* tri=no->get_lien_triangle()->get(k);
2644     MG_NOEUD *no1=tri->get_noeud1();
2645     MG_NOEUD *no2=tri->get_noeud2();
2646     MG_NOEUD *no3=tri->get_noeud3();
2647     OT_VECTEUR_3D vec1(no1->get_coord(),no2->get_coord());
2648     OT_VECTEUR_3D vec2(no1->get_coord(),no3->get_coord());
2649     OT_VECTEUR_3D vec3=vec1&vec2;
2650     vec3.norme();
2651     normal=normal+vec3;
2652     }
2653     normal.norme();
2654     mgmai->supprimer_mg_triangleid(no->get_lien_triangle()->get(2)->get_id());
2655     mgmai->supprimer_mg_triangleid(no->get_lien_triangle()->get(1)->get_id());
2656     mgmai->supprimer_mg_triangleid(no->get_lien_triangle()->get(0)->get_id());
2657     mgmai->supprimer_mg_noeudid(no->get_id());
2658     MG_NOEUD *no1=lstno.get(0);
2659     MG_NOEUD *no2=lstno.get(1);
2660     MG_NOEUD *no3=lstno.get(2);
2661     OT_VECTEUR_3D vec1(no1->get_coord(),no2->get_coord());
2662     OT_VECTEUR_3D vec2(no1->get_coord(),no3->get_coord());
2663     OT_VECTEUR_3D vec3=vec1&vec2;
2664     vec3.norme();
2665     if (vec3*normal>0) insere_triangle(topo,no1,no2,no3,mgmai,origine);
2666     else insere_triangle(topo,no2,no1,no3,mgmai,origine);
2667     }
2668    
2669     }
2670    
2671     return cardinalite_iter;
2672    
2673     }
2674    
2675    
2676    
2677 francois 457 //---------------------------- Determine peau -------------------------------------------------------------------------
2678 francois 460 void MGOPT_POSTTRAITEMENT::determine_peau(std::vector<MG_TRIANGLE_PEAU*> * peau)
2679 francois 222 {
2680 francois 224 int num=0;
2681     while (num!=peau->size())
2682     {
2683     MG_TRIANGLE_PEAU* p=(*peau)[num];
2684     if (p->get_voisin1()->get_nouveau_numero()==0)
2685     {
2686     peau->push_back(p->get_voisin1());
2687     p->get_voisin1()->change_nouveau_numero(1);
2688     }
2689     if (p->get_voisin2()->get_nouveau_numero()==0)
2690     {
2691     peau->push_back(p->get_voisin2());
2692     p->get_voisin2()->change_nouveau_numero(1);
2693     }
2694     if (p->get_voisin3()->get_nouveau_numero()==0)
2695     {
2696     peau->push_back(p->get_voisin3());
2697     p->get_voisin3()->change_nouveau_numero(1);
2698     }
2699     num++;
2700     }
2701     }
2702    
2703 francois 457 //---------------------------- Insere triangle -------------------------------------------------------------------------
2704 francois 830 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)
2705     {
2706     //MG_TRIANGLE_PEAU* voisin1=NULL,*voisin2=NULL,*voisin3=NULL;
2707     MG_SEGMENT* mgsegment1=mg_maillage->get_mg_segment(mgnoeud1->get_id(),mgnoeud2->get_id());
2708     MG_SEGMENT* mgsegment2=mg_maillage->get_mg_segment(mgnoeud2->get_id(),mgnoeud3->get_id());
2709     MG_SEGMENT* mgsegment3=mg_maillage->get_mg_segment(mgnoeud3->get_id(),mgnoeud1->get_id());
2710     if (mgsegment1==NULL)
2711     {
2712     MG_SEGMENT* seg=maiori->get_mg_segment(n1ori->get_id(),n2ori->get_id());
2713     MG_ELEMENT_TOPOLOGIQUE* toposeg=seg->get_lien_topologie();
2714     MG_ELEMENT_TOPOLOGIQUE* toposegn=topo;
2715     std::map<unsigned long,unsigned long>::iterator it=correspondid.find(toposeg->get_id());
2716     if (it!=correspondid.end())
2717     toposegn=geo->get_mg_areteid(it->second);
2718     mgsegment1=mg_maillage->ajouter_mg_segment(toposegn,mgnoeud1,mgnoeud2,origine);
2719     }
2720     if (mgsegment2==NULL)
2721     {
2722     MG_SEGMENT* seg=maiori->get_mg_segment(n2ori->get_id(),n3ori->get_id());
2723     MG_ELEMENT_TOPOLOGIQUE* toposeg=seg->get_lien_topologie();
2724     MG_ELEMENT_TOPOLOGIQUE* toposegn=topo;
2725     std::map<unsigned long,unsigned long>::iterator it=correspondid.find(toposeg->get_id());
2726     if (it!=correspondid.end())
2727     toposegn=geo->get_mg_areteid(it->second);
2728     mgsegment2=mg_maillage->ajouter_mg_segment(toposegn,mgnoeud2,mgnoeud3,origine);
2729     }
2730     if (mgsegment3==NULL)
2731     {
2732     MG_SEGMENT* seg=maiori->get_mg_segment(n3ori->get_id(),n1ori->get_id());
2733     MG_ELEMENT_TOPOLOGIQUE* toposeg=seg->get_lien_topologie();
2734     MG_ELEMENT_TOPOLOGIQUE* toposegn=topo;
2735     std::map<unsigned long,unsigned long>::iterator it=correspondid.find(toposeg->get_id());
2736     if (it!=correspondid.end())
2737     toposegn=geo->get_mg_areteid(it->second);
2738     mgsegment3=mg_maillage->ajouter_mg_segment(toposegn,mgnoeud3,mgnoeud1,origine);
2739     }
2740     MG_TRIANGLE_PEAU* mtriangle=new MG_TRIANGLE_PEAU(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment1,mgsegment2,mgsegment3,origine);
2741     mg_maillage->ajouter_mg_triangle(mtriangle);
2742     return mtriangle;
2743     }
2744    
2745 francois 460 MG_TRIANGLE_PEAU* MGOPT_POSTTRAITEMENT::insere_triangle(MG_ELEMENT_TOPOLOGIQUE* topo,class MG_NOEUD *mgnoeud1,class MG_NOEUD *mgnoeud2,class MG_NOEUD *mgnoeud3,MG_MAILLAGE* mg_maillage,int origine)
2746 francois 224 {
2747 francois 830 //MG_TRIANGLE_PEAU* voisin1=NULL,*voisin2=NULL,*voisin3=NULL;
2748 francois 222 MG_SEGMENT* mgsegment1=mg_maillage->get_mg_segment(mgnoeud1->get_id(),mgnoeud2->get_id());
2749     MG_SEGMENT* mgsegment2=mg_maillage->get_mg_segment(mgnoeud2->get_id(),mgnoeud3->get_id());
2750     MG_SEGMENT* mgsegment3=mg_maillage->get_mg_segment(mgnoeud3->get_id(),mgnoeud1->get_id());
2751 francois 830 if (mgsegment1==NULL)
2752 francois 224 mgsegment1=mg_maillage->ajouter_mg_segment(topo,mgnoeud1,mgnoeud2,origine);
2753 francois 222 if (mgsegment2==NULL)
2754 francois 224 mgsegment2=mg_maillage->ajouter_mg_segment(topo,mgnoeud2,mgnoeud3,origine);
2755 francois 222 if (mgsegment3==NULL)
2756 francois 224 mgsegment3=mg_maillage->ajouter_mg_segment(topo,mgnoeud3,mgnoeud1,origine);
2757     MG_TRIANGLE_PEAU* mtriangle=new MG_TRIANGLE_PEAU(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment1,mgsegment2,mgsegment3,origine);
2758 francois 222 mg_maillage->ajouter_mg_triangle(mtriangle);
2759     return mtriangle;
2760     }
2761 francois 457 //---------------------------- Recherche voisin -------------------------------------------------------------------------
2762 francois 460 MG_TRIANGLE_PEAU* MGOPT_POSTTRAITEMENT::recherche_voisin(MG_NOEUD* mg_noeud1,MG_NOEUD* mg_noeud2,MG_TRIANGLE_PEAU* triref)
2763 francois 222 {
2764 francois 224 MG_TRIANGLE_PEAU* trisol=NULL;
2765     double angleref=4.*M_PI;
2766 francois 222 int nb1=mg_noeud1->get_lien_triangle()->get_nb();
2767     int nb2=mg_noeud2->get_lien_triangle()->get_nb();
2768     for (int i=0;i<nb1;i++)
2769     for (int j=0;j<nb2;j++)
2770 francois 224 if (mg_noeud1->get_lien_triangle()->get(i)==mg_noeud2->get_lien_triangle()->get(j))
2771     if ((MG_TRIANGLE_PEAU*)mg_noeud1->get_lien_triangle()->get(i)!=triref)
2772     {
2773     double angle=calcul_angle(triref,(MG_TRIANGLE_PEAU*)mg_noeud1->get_lien_triangle()->get(i));
2774     if (angle<angleref)
2775     {
2776     angleref=angle;
2777     trisol=(MG_TRIANGLE_PEAU*)mg_noeud1->get_lien_triangle()->get(i);
2778     }
2779     }
2780     return trisol;
2781 francois 222 }
2782 francois 223
2783 francois 460 int MGOPT_POSTTRAITEMENT::est_non_manifold(MG_NOEUD* no)
2784 francois 234 {
2785     static int compteur=0;
2786     compteur++;
2787     int nb_tri=no->get_lien_triangle()->get_nb();
2788     TPL_MAP_ENTITE<MG_TRIANGLE*> lst;
2789     for (int i=0;i<nb_tri;i++)
2790     lst.ajouter(no->get_lien_triangle()->get(i));
2791     MG_TRIANGLE_PEAU* premier_triangle=(MG_TRIANGLE_PEAU*)lst.get(0);
2792     lst.supprimer(premier_triangle);
2793     MG_TRIANGLE_PEAU* tricour=(MG_TRIANGLE_PEAU*)premier_triangle;
2794     int i=0;
2795     do
2796     {
2797     if (lst.existe(tricour->get_voisin1()) || ((tricour->get_voisin1()==premier_triangle)&& (i>1)))
2798     {
2799     tricour=tricour->get_voisin1();
2800     lst.supprimer(tricour);
2801     }
2802     else if (lst.existe(tricour->get_voisin2()) || ((tricour->get_voisin2()==premier_triangle)&& (i>1)))
2803     {
2804     tricour=tricour->get_voisin2();
2805     lst.supprimer(tricour);
2806     }
2807     else if (lst.existe(tricour->get_voisin3()) || ((tricour->get_voisin3()==premier_triangle)&& (i>1)))
2808     {
2809     tricour=tricour->get_voisin3();
2810     lst.supprimer(tricour);
2811     }
2812     i++;
2813     }
2814     while (tricour!=premier_triangle);
2815     if (lst.get_nb()>0)
2816     return 1;
2817     return 0;
2818     }
2819 francois 224
2820 francois 457 //---------------------------- Calcule angle -------------------------------------------------------------------------
2821 francois 460 double MGOPT_POSTTRAITEMENT::calcul_angle(MG_TRIANGLE_PEAU* ft1,MG_TRIANGLE_PEAU* ft2)
2822 francois 223 {
2823 francois 388 MG_NOEUD* noeud1=ft1->get_noeud1();
2824     MG_NOEUD* noeud2=ft1->get_noeud2();
2825     MG_NOEUD* noeud3=ft1->get_noeud3();
2826     MG_NOEUD* noeud4=ft2->get_noeud1();
2827     MG_NOEUD* noeud5=ft2->get_noeud2();
2828     MG_NOEUD* noeud6=ft2->get_noeud3();
2829     double angle=get_angle_par_noeud<MG_NOEUD*>(noeud1,noeud2,noeud3,noeud4,noeud5,noeud6);
2830     return angle;
2831 francois 223 }
2832 picher 230
2833 francois 457 //---------------------------- Ponderation gaussian -------------------------------------------------------------------------
2834 francois 460 double MGOPT_POSTTRAITEMENT::ponderation_gaussian(double s,double sigma)
2835 picher 230 {
2836     double w_s;
2837     w_s = exp(-(s*s)/(2.*sigma*sigma));
2838     return w_s;
2839     }
2840    
2841 francois 457 //---------------------------- Ponderation Laplacian -------------------------------------------------------------------------
2842 francois 460 double MGOPT_POSTTRAITEMENT::ponderation_laplacian(double s,double sigma)
2843 picher 230 {
2844     double w_s;
2845     w_s = exp(-(sqrt(2.)*fabs(s))/sigma);
2846     return w_s;
2847     }
2848    
2849 francois 457 //---------------------------- Ponderation elfallahford -------------------------------------------------------------------------
2850 francois 460 double MGOPT_POSTTRAITEMENT::ponderation_elfallahford(double s,double sigma)
2851 picher 230 {
2852     double w_s;
2853     w_s = 1./sqrt(1+pow((s/sigma),2));
2854     return w_s;
2855     }