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 |
|
|
} |