ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur2d_optimisation.cpp
Revision: 448
Committed: Mon Oct 28 14:35:43 2013 UTC (11 years, 6 months ago) by francois
File size: 10166 byte(s)
Log Message:
generalisation de l'optimisation 2D independante du mailleur 2D frontal

File Contents

# User Rev Content
1 francois 447 #include "mailleur2d_optimisation.h"
2     #include "m3d_triangle.h"
3     #include "mg_gestionnaire.h"
4     #include "ot_decalage_parametre.h"
5     #include <math.h>
6    
7    
8     MAILLEUR2D_OPTIMISATION::MAILLEUR2D_OPTIMISATION(MG_MAILLAGE* mgmai,int niv):MAILLEUR(),mg_maillage(mgmai),niveau_optimisation(niv)
9     {
10     }
11    
12     MAILLEUR2D_OPTIMISATION::~MAILLEUR2D_OPTIMISATION()
13     {
14     }
15    
16     void MAILLEUR2D_OPTIMISATION::change_niveau_optimisation(int num)
17     {
18     niveau_optimisation=num;
19     }
20    
21     int MAILLEUR2D_OPTIMISATION::get_niveau_optimisation(void)
22     {
23     return niveau_optimisation;
24     }
25    
26 francois 448 void MAILLEUR2D_OPTIMISATION::optimise(MG_VOLUME* mgvolume)
27     {
28     LISTE_MG_TRIANGLE::iterator ittr;
29     TPL_MAP_ENTITE<M3D_TRIANGLE*> lsttrim3d;
30     for (MG_TRIANGLE* tri=mg_maillage->get_premier_triangle(ittr);tri!=NULL;tri=mg_maillage->get_suivant_triangle(ittr))
31     {
32     M3D_TRIANGLE* nvtri=new M3D_TRIANGLE(tri->get_id(),tri->get_lien_topologie(),tri->get_noeud1(),tri->get_noeud2(),tri->get_noeud3(),tri->get_segment1(),tri->get_segment2(),tri->get_segment3(),tri->get_origine());
33     lsttrim3d.ajouter(nvtri);
34     }
35 francois 447
36 francois 448 TPL_MAP_ENTITE<M3D_TRIANGLE*>::ITERATEUR it2;
37    
38     for (M3D_TRIANGLE* tri=lsttrim3d.get_premier(it2);tri!=NULL;tri=lsttrim3d.get_suivant(it2))
39     {
40     mg_maillage->supprimer_mg_triangleid(tri->get_id());
41     mg_maillage->ajouter_mg_triangle(tri);
42     }
43    
44     int nbcoquille=mgvolume->get_nb_mg_coquille();
45     for (int i=0;i<nbcoquille;i++)
46     {
47     MG_COQUILLE* coq=mgvolume->get_mg_coquille(i);
48     int nbface=coq->get_nb_mg_coface();
49     for (int j=0;j<nbface;j++)
50     {
51     MG_FACE* face=coq->get_mg_coface(j)->get_face();
52     optimise(face);
53     }
54     }
55    
56     }
57    
58 francois 447 void MAILLEUR2D_OPTIMISATION::optimise(MG_FACE* mgface)
59     {
60     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
61     for (MG_TRIANGLE *mgtri=(MG_TRIANGLE*)mgface->get_lien_maillage()->get_premier(it);mgtri!=NULL;mgtri=(MG_TRIANGLE*)mgface->get_lien_maillage()->get_suivant(it))
62     {
63 francois 448 if (mg_maillage->get_mg_triangleid(mgtri->get_id())!=mgtri) continue;
64 francois 447 M3D_TRIANGLE* mtri=(M3D_TRIANGLE*)mgtri;
65     double qual=OPERATEUR::qualite_triangle(mtri->get_noeud1()->get_coord(),mtri->get_noeud2()->get_coord(),mtri->get_noeud3()->get_coord());
66     mtri->change_qualite(qual);
67     if (mtri->get_qualite()<0.1*niveau_optimisation)
68     {
69     std::pair<const double,M3D_TRIANGLE*> tmp(mtri->get_qualite(),mtri);
70     lst_tri_qual.insert(tmp);
71     }
72     }
73     periode_u=mgface->get_surface()->get_periode_u();
74     periode_v=mgface->get_surface()->get_periode_v();
75     decalage=new OT_DECALAGE_PARAMETRE(periode_u,periode_v);
76     for (int phase=0;phase<2;phase++)
77     {
78     ORDRE_TRIANGLE& lst=lst_tri_qual;
79     if (phase==1)
80     lst=lst_tri_qual2;
81     int ok=0;
82     do
83     {
84     ORDRE_TRIANGLE::iterator i=lst.begin();
85     if (i==lst.end())
86     {
87     ok=1;
88     continue;
89     }
90     M3D_TRIANGLE* tri=(*i).second;
91 francois 448 if (tri->get_qualite()<0.1*niveau_optimisation)
92 francois 447 {
93     MG_NOEUD* no[3];
94     no[0]=tri->get_noeud1();
95     no[1]=tri->get_noeud2();
96     no[2]=tri->get_noeud3();
97     double crit[3],u[3],v[3],x[3],y[3],z[3];
98     int ierr=bouge_point(mgface,no[0],crit[0],u[0],v[0],x[0],y[0],z[0]);
99     if (ierr==0) crit[0]=0.;
100     ierr=bouge_point(mgface,no[1],crit[1],u[1],v[1],x[1],y[1],z[1]);
101     if (ierr==0) crit[1]=0.;
102     ierr=bouge_point(mgface,no[2],crit[2],u[2],v[2],x[2],y[2],z[2]);
103     if (ierr==0) crit[2]=0.;
104     double critopt=std::max(crit[0],crit[1]);
105     critopt=std::max(critopt,crit[2]);
106     int num=-1;
107     if (critopt>tri->get_qualite())
108     {
109     if (critopt==crit[0]) num=0;
110     if (critopt==crit[1]) num=1;
111     if (critopt==crit[2]) num=2;
112     }
113     if (num!=-1)
114     {
115     no[num]->change_u(u[num]);
116     no[num]->change_v(v[num]);
117     no[num]->change_x(x[num]);
118     no[num]->change_y(y[num]);
119     no[num]->change_z(z[num]);
120     int nb_tri=no[num]->get_lien_triangle()->get_nb();
121     for (int i=0;i<nb_tri;i++)
122     {
123     M3D_TRIANGLE* mtri=(M3D_TRIANGLE*)no[num]->get_lien_triangle()->get(i);
124     double qual=OPERATEUR::qualite_triangle(mtri->get_noeud1()->get_coord(),mtri->get_noeud2()->get_coord(),mtri->get_noeud3()->get_coord());
125     mtri->change_qualite(qual);
126     }
127     }
128     }
129     else ok=1;
130     if ((tri->get_qualite()<0.1*niveau_optimisation) && (phase==0))
131     {
132     std::pair<const double,M3D_TRIANGLE*> tmp(1./tri->get_qualite(),tri);
133     lst_tri_qual2.insert(tmp);
134     }
135     lst.erase(i);
136     }
137     while (ok==0);
138     }
139     delete decalage;
140     }
141    
142    
143    
144     int MAILLEUR2D_OPTIMISATION::bouge_point(MG_FACE* mgface,MG_NOEUD* mg_noeud,double& crit,double &u,double& v,double& x,double& y, double& z)
145     {
146     if (mg_noeud->get_lien_topologie()!=mgface) return 0;
147     if (mg_noeud->get_origine()==IMPOSE) return 0;
148     double du=decalage->calcul_decalage_parametre_u(mg_noeud->get_u());
149     double dv=decalage->calcul_decalage_parametre_v(mg_noeud->get_v());
150     double u1=decalage->decalage_parametre_u(mg_noeud->get_u(),du);
151     double v1=decalage->decalage_parametre_v(mg_noeud->get_v(),dv);
152    
153     double uopt=0.;
154     double vopt=0.;
155     double qual_dep=1.;
156     int nb_tri=mg_noeud->get_lien_triangle()->get_nb();
157     for (int i=0;i<nb_tri;i++)
158     {
159     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)mg_noeud->get_lien_triangle()->get(i);
160     qual_dep=std::min(qual_dep,tri->get_qualite());
161     MG_NOEUD* no1=tri->get_noeud1();
162     MG_NOEUD* no2=tri->get_noeud2();
163     MG_NOEUD* no3=tri->get_noeud3();
164     MG_NOEUD *noeud1,*noeud2;
165     if (no1==mg_noeud)
166     {
167     noeud1=no2;
168     noeud2=no3;
169     }
170     if (no2==mg_noeud)
171     {
172     noeud1=no1;
173     noeud2=no3;
174     }
175     if (no3==mg_noeud)
176     {
177     noeud1=no1;
178     noeud2=no2;
179     }
180     double u2=noeud1->get_u()+du;
181     double v2=noeud1->get_v()+dv;
182     uopt=uopt+u2;
183     vopt=vopt+v2;
184     u2=noeud2->get_u()+du;
185     v2=noeud2->get_v()+dv;
186     uopt=uopt+u2;
187     vopt=vopt+v2;
188     }
189     uopt=uopt/2./nb_tri;
190     vopt=vopt/2./nb_tri;
191    
192     double ddeb=sqrt((u1-uopt)*(u1-uopt)+(v1-vopt)*(v1-vopt));
193     double alpha=0.5;
194     double d=alpha*ddeb;
195     double qual=qual_dep;
196     double testu[8]={1.,-1.,0.,0.,0.707106781,-0.707106781,-0.707106781,0.707106781};
197     double testv[8]={0.,0.,1.,-1.,0.707106781,0.707106781,-0.707106781,-0.707106781};
198     double uu=u1;
199     double vv=v1;
200     while (alpha>0.09)
201     {
202     double qualcoq=0.;
203     for (int nb_essai=0;nb_essai<8;nb_essai++)
204     {
205     double uv[2];
206     double xyz[3];
207     uv[0]=uu+d*testu[nb_essai]-du;
208     uv[1]=vv+d*testv[nb_essai]-dv;
209     int valide1=mgface->valide_parametre_u(uv[0]);
210     int valide2=mgface->valide_parametre_v(uv[1]);
211     if (!((valide1) && (valide2) )) break;
212     mgface->evaluer(uv,xyz);
213     double qual1=1.;
214     for (int i=0;i<nb_tri;i++)
215     {
216     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)mg_noeud->get_lien_triangle()->get(i);
217     MG_NOEUD* no1=tri->get_noeud1();
218     MG_NOEUD* no2=tri->get_noeud2();
219     MG_NOEUD* no3=tri->get_noeud3();
220     double *xyz1=no1->get_coord();
221     double *xyz2=no2->get_coord();
222     double *xyz3=no3->get_coord();
223     if (no1==mg_noeud) xyz1=xyz;
224     if (no2==mg_noeud) xyz2=xyz;
225     if (no3==mg_noeud) xyz3=xyz;
226     double qualtmp=OPERATEUR::qualite_triangle(xyz1,xyz2,xyz3);
227     OT_VECTEUR_3D n1n3(xyz1,xyz3);
228     OT_VECTEUR_3D n1n2(xyz1,xyz2);
229     double xyznormal[3];
230     mgface->calcul_normale_unitaire(uv,xyznormal);
231     OT_VECTEUR_3D normalface(xyznormal);
232     OT_VECTEUR_3D normal=normalface&n1n3;
233     normal.norme();
234     n1n2.norme();
235     if (normal*n1n2<0.0001) qualtmp=0.;
236     if (qualtmp<qual1) qual1=qualtmp;
237     }
238     if (qual1>qualcoq)
239     {
240     qualcoq=qual1;
241     crit=qualcoq;
242     u=uv[0]+du;
243     v=uv[1]+dv;
244     }
245     }
246    
247     if (qualcoq<qual+0.0001) alpha=alpha-0.1;
248     else
249     {
250     qual=qualcoq;
251     uu=u;
252     vv=v;
253     }
254     d=ddeb*alpha;
255    
256     }
257     if (qual>qual_dep)
258     {
259     u=decalage->decalage_parametre_u(u,-du);
260     v=decalage->decalage_parametre_v(v,-dv);
261     double uv[2];
262     uv[0]=u;
263     uv[1]=v;
264     double xyz[3];
265     mgface->evaluer(uv,xyz);
266     x=xyz[0];
267     y=xyz[1];
268     z=xyz[2];
269     return 1;
270     }
271     return 0;
272     }