ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/aster/src/mgopt_posttraitement.cpp
Revision: 844
Committed: Wed Oct 26 02:25:07 2016 UTC (8 years, 6 months ago) by nana
File size: 119675 byte(s)
Log Message:
Automatisation du seuil d'extraction lors de la squelettisation
Obtention du maillage de peau sans non_design

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