1 |
//####//------------------------------------------------------------
|
2 |
//####//------------------------------------------------------------
|
3 |
//####// MAGiC
|
4 |
//####// Jean Christophe Cuilliere et Vincent FRANCOIS
|
5 |
//####// Departement de Genie Mecanique - UQTR
|
6 |
//####//------------------------------------------------------------
|
7 |
//####// MAGIC est un projet de recherche de l equipe ERICCA
|
8 |
//####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
|
9 |
//####// http://www.uqtr.ca/ericca
|
10 |
//####// http://www.uqtr.ca/
|
11 |
//####//------------------------------------------------------------
|
12 |
//####//------------------------------------------------------------
|
13 |
//####//
|
14 |
//####// mailleur2d.cpp
|
15 |
//####//
|
16 |
//####//------------------------------------------------------------
|
17 |
//####//------------------------------------------------------------
|
18 |
//####// COPYRIGHT 2000-2024
|
19 |
//####// jeu 13 jun 2024 11:58:55 EDT
|
20 |
//####//------------------------------------------------------------
|
21 |
//####//------------------------------------------------------------
|
22 |
|
23 |
|
24 |
#include "gestionversion.h"
|
25 |
#include "mailleur2d.h"
|
26 |
#include "m3d_triangle.h"
|
27 |
#include "ot_mathematique.h"
|
28 |
#include "mg_gestionnaire.h"
|
29 |
#include <fstream>
|
30 |
#include <math.h>
|
31 |
#include "mailleur2d_optimisation.h"
|
32 |
#include "mg_export.h"
|
33 |
|
34 |
|
35 |
|
36 |
MAILLEUR2D::MAILLEUR2D(MG_MAILLAGE* mgmai,MG_GEOMETRIE *mggeo,FCT_TAILLE* fct_taille,MG_FACE* mgface):MAILLEUR(false),mg_maillage(mgmai),mg_geometrie(mggeo),mg_face(mgface),metrique(fct_taille),niveau_optimisation(2)
|
37 |
{
|
38 |
}
|
39 |
|
40 |
|
41 |
|
42 |
MAILLEUR2D::~MAILLEUR2D()
|
43 |
{
|
44 |
}
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
int MAILLEUR2D::maille(MG_GROUPE_TOPOLOGIQUE* mggt)
|
50 |
{
|
51 |
if (mg_face!=NULL)
|
52 |
{
|
53 |
if(maille(mg_face)==FAIL) return FAIL;
|
54 |
}
|
55 |
else
|
56 |
{
|
57 |
TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
|
58 |
if (mggt!=NULL)
|
59 |
{
|
60 |
std::map<MG_ELEMENT_TOPOLOGIQUE*,MG_ELEMENT_TOPOLOGIQUE*>::iterator it;
|
61 |
for(MG_ELEMENT_TOPOLOGIQUE* ele=mggt->get_premier(it);ele!=NULL;ele=mggt->get_suivant(it))
|
62 |
{
|
63 |
lst.ajouter(ele);
|
64 |
ele->get_topologie_sousjacente(&lst);
|
65 |
}
|
66 |
}
|
67 |
int nb_face=mg_geometrie->get_nb_mg_face();
|
68 |
for (int i=0;i<nb_face;i++)
|
69 |
{
|
70 |
MG_FACE* mgface=mg_geometrie->get_mg_face(i);
|
71 |
if (mggt!=NULL)
|
72 |
if (lst.existe(mgface)==0) continue;
|
73 |
if(maille(mgface)==FAIL) return FAIL;
|
74 |
}
|
75 |
}
|
76 |
return OK;
|
77 |
}
|
78 |
|
79 |
|
80 |
int MAILLEUR2D::maille(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_SEGMENT*> *lstseg,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
|
81 |
{
|
82 |
periode_u=mgface->get_surface()->get_periode_u();
|
83 |
periode_v=mgface->get_surface()->get_periode_v();
|
84 |
decalage=new OT_DECALAGE_PARAMETRE(periode_u,periode_v);
|
85 |
initialise_frontiere(mgface);
|
86 |
cree_ntree(mgface);
|
87 |
TPL_MAP_ENTITE<MG_SOMMET*> liste_pole_sommet;
|
88 |
initialise_front(mgface,liste_pole_sommet);
|
89 |
if (lstseg!=NULL) insere_contrainte_segment(mgface,lstseg);
|
90 |
if (lsttri!=NULL) insere_contrainte_triangle(mgface,lsttri);
|
91 |
if (mgface->get_nb_pole()>0) traite_pole(mgface,liste_pole_sommet);
|
92 |
if(progresse_front(mgface)==FAIL)
|
93 |
{
|
94 |
delete ntree_de_segment;
|
95 |
delete ntree_de_front;
|
96 |
delete decalage;
|
97 |
return FAIL;
|
98 |
}
|
99 |
int verif=param.get_valeur("Verification_coin_face_mailleur2D");
|
100 |
TPL_LISTE_ENTITE<MG_TRIANGLE*> lsttriaffectecoin;
|
101 |
if (verif==1)
|
102 |
verifie_coin_sommet(mgface,&lsttriaffectecoin);
|
103 |
MAILLEUR2D_OPTIMISATION opt(mg_maillage,niveau_optimisation);
|
104 |
if (affichageactif==1) opt.active_affichage(affiche2);
|
105 |
opt.optimise(mgface);
|
106 |
if (verif==1)
|
107 |
for (int i=0;i<lsttriaffectecoin.get_nb();i++)
|
108 |
lsttriaffectecoin.get(i)->change_origine(MAGIC::ORIGINE::MAILLEUR_AUTO);
|
109 |
delete ntree_de_segment;
|
110 |
delete ntree_de_front;
|
111 |
delete decalage;
|
112 |
segment_frontiere.vide();
|
113 |
noeud_frontiere.vide();
|
114 |
return OK;
|
115 |
}
|
116 |
|
117 |
|
118 |
void MAILLEUR2D::traite_pole(MG_FACE* mgface,TPL_MAP_ENTITE<MG_SOMMET*> &liste_pole_sommet)
|
119 |
{
|
120 |
int nbpolesursommet=liste_pole_sommet.get_nb();
|
121 |
char message[255];
|
122 |
sprintf(message," face comportant %d pole dont %d pole sur un sommet",mgface->get_nb_pole(),nbpolesursommet);
|
123 |
affiche(message);
|
124 |
std::vector<double> liste_pole;
|
125 |
mgface->get_liste_pole_uv(&liste_pole,mg_geometrie->get_valeur_precision());
|
126 |
for (int i=0;i<liste_pole.size();i=i+2)
|
127 |
{
|
128 |
double uv[3]={liste_pole[i],liste_pole[i+1],0.};
|
129 |
double xyz[3];
|
130 |
mgface->evaluer(uv,xyz);
|
131 |
double tenseur_metrique[9];
|
132 |
metrique->evaluer(xyz,tenseur_metrique);
|
133 |
double dcible=1./sqrt(tenseur_metrique[0]);
|
134 |
MG_SOMMET* som=NULL;
|
135 |
TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it;
|
136 |
for (MG_SOMMET* s=liste_pole_sommet.get_premier(it);s!=NULL;s=liste_pole_sommet.get_suivant(it))
|
137 |
{
|
138 |
double xyztmp[3];
|
139 |
s->get_point()->evaluer(xyztmp);
|
140 |
OT_VECTEUR_3D vec(xyz,xyztmp);
|
141 |
if (vec.get_longueur()<1e-10*dcible) som=s;
|
142 |
|
143 |
}
|
144 |
if (som!=NULL)
|
145 |
{
|
146 |
double xyz[3];
|
147 |
som->get_point()->evaluer(xyz);
|
148 |
TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
|
149 |
TPL_MAP_ENTITE<MG_FRONT_2D*> liste_supprimer;
|
150 |
ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],0.,liste_trouvee);
|
151 |
for (int j=0;j<liste_trouvee.get_nb();j++)
|
152 |
{
|
153 |
MG_FRONT_2D *ft=liste_trouvee.get(j);
|
154 |
if (liste_supprimer.existe(ft)) continue;
|
155 |
if (ft->get_noeud2()->get_lien_topologie()==som)
|
156 |
{
|
157 |
MG_FRONT_2D *fts=ft->get_front_suivant();
|
158 |
double pu=mgface->get_surface()->get_periode_u();
|
159 |
double pv=mgface->get_surface()->get_periode_v();
|
160 |
int num=0;
|
161 |
if (pv>0) num=1;
|
162 |
MG_NOEUD* no1=ft->get_noeud1();
|
163 |
MG_NOEUD* nopo=ft->get_noeud2();
|
164 |
MG_NOEUD* no2=fts->get_noeud2();
|
165 |
MG_FRONT_2D* ftpp=ft->get_front_precedent();
|
166 |
MG_FRONT_2D* ftss=fts->get_front_suivant();
|
167 |
OT_VECTEUR_3D n1n2(ft->get_noeud1()->get_coord(),ft->get_noeud2()->get_coord());
|
168 |
OT_VECTEUR_3D n2s(fts->get_noeud1()->get_coord(),fts->get_noeud2()->get_coord());
|
169 |
n1n2.norme();
|
170 |
n2s.norme();
|
171 |
double coo[3];
|
172 |
double uv[3];
|
173 |
double uvpole[3];
|
174 |
uv[0]=ft->get_noeud2()->get_u();
|
175 |
uv[1]=ft->get_noeud2()->get_v();
|
176 |
uvpole[0]=nopo->get_u();
|
177 |
uvpole[1]=nopo->get_v();
|
178 |
uvpole[2]=0.;
|
179 |
mgface->calcul_normale_unitaire(uv,coo);
|
180 |
OT_VECTEUR_3D nplan(coo);
|
181 |
OT_VECTEUR_3D n=nplan&n1n2;
|
182 |
n.norme();
|
183 |
double cs=(-1)*(n1n2*n2s);
|
184 |
if (cs>1.) cs=1.;
|
185 |
if (cs<-1.) cs=-1.;
|
186 |
double sn=(-1)*(n*n2s);
|
187 |
double angle=acos(cs);
|
188 |
if (sn<0) angle=-angle;
|
189 |
if (angle<1e-6) angle=angle+2*M_PI;
|
190 |
int nbtri=(int)(angle*1.01/M_PI*3.);
|
191 |
liste_supprimer.ajouter(ft);
|
192 |
liste_supprimer.ajouter(fts);
|
193 |
supprimer_front(ft);
|
194 |
supprimer_front(fts);
|
195 |
MG_SEGMENT** tabseg=new MG_SEGMENT*[nbtri];
|
196 |
for (int i=0;i<nbtri;i++)
|
197 |
tabseg[i]=NULL;
|
198 |
uv[0]=no1->get_u();
|
199 |
uv[1]=no2->get_v();
|
200 |
int ierr=1;
|
201 |
do
|
202 |
{
|
203 |
if (ierr==0) uv[(num+1)%2]=uv[(num+1)%2]-(uv[(num+1)%2]-uvpole[(num+1)%2])*0.5;
|
204 |
ierr=1;
|
205 |
MG_NOEUD* noc=no1;
|
206 |
for (int i=0;i<nbtri-1;i++)
|
207 |
{
|
208 |
uv[num]=(i+1)*1.0/nbtri*angle;
|
209 |
double xyzn[3];
|
210 |
mgface->evaluer(uv,xyzn);
|
211 |
MG_NOEUD* nn=mg_maillage->ajouter_mg_noeud(mgface,xyzn[0],xyzn[1],xyzn[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
|
212 |
nn->change_u(uv[0]);
|
213 |
nn->change_v(uv[1]);
|
214 |
ierr=ierr*insere_segment(mgface,&(tabseg[i]),noc,nn,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
215 |
noc=nn;
|
216 |
}
|
217 |
ierr=ierr*insere_segment(mgface,&(tabseg[nbtri-1]),noc,no2,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
218 |
}
|
219 |
while (ierr==0);
|
220 |
OT_VECTEUR_3D w(0.,0.,1.);
|
221 |
double uvn1[3]={tabseg[0]->get_noeud1()->get_u(),tabseg[0]->get_noeud1()->get_v(),0.};
|
222 |
double uvn2[3]={tabseg[0]->get_noeud2()->get_u(),tabseg[0]->get_noeud2()->get_v(),0.};
|
223 |
OT_VECTEUR_3D uvn1n2(uvn1,uvn2);
|
224 |
uvn1n2.norme();
|
225 |
OT_VECTEUR_3D uvn1pole(uvn1,uvpole);
|
226 |
uvn1pole.norme();
|
227 |
double sens=(w&uvn1n2)*uvn1pole;
|
228 |
MG_FRONT_2D* ftppcourant=ftpp;
|
229 |
if (sens>0) ftppcourant=ftss;
|
230 |
for (int i=0;i<nbtri;i++)
|
231 |
{
|
232 |
if (sens<0)
|
233 |
insere_triangle(mgface,nopo,tabseg[i]->get_noeud1(),tabseg[i]->get_noeud2());
|
234 |
else
|
235 |
insere_triangle(mgface,nopo,tabseg[i]->get_noeud2(),tabseg[i]->get_noeud1());
|
236 |
if (sens<0)
|
237 |
{
|
238 |
MG_FRONT_2D *ft=ajouter_front(front_courant,tabseg[i]->get_noeud1(),tabseg[i]->get_noeud2(),tabseg[i]);
|
239 |
ft->changer_front_precedent(ftppcourant);
|
240 |
ftppcourant->changer_front_suivant(ft);
|
241 |
ftppcourant=ft;
|
242 |
}
|
243 |
else
|
244 |
{
|
245 |
MG_FRONT_2D *ft=ajouter_front(front_courant,tabseg[i]->get_noeud2(),tabseg[i]->get_noeud1(),tabseg[i]);
|
246 |
ft->changer_front_suivant(ftppcourant);
|
247 |
ftppcourant->changer_front_precedent(ft);
|
248 |
ftppcourant=ft;
|
249 |
}
|
250 |
}
|
251 |
if (sens<0)
|
252 |
{
|
253 |
ftppcourant->changer_front_suivant(ftss);
|
254 |
ftss->changer_front_precedent(ftppcourant);
|
255 |
}
|
256 |
else
|
257 |
{
|
258 |
ftppcourant->changer_front_precedent(ftpp);
|
259 |
ftpp->changer_front_suivant(ftppcourant);
|
260 |
}
|
261 |
delete [] tabseg;
|
262 |
}
|
263 |
}
|
264 |
}
|
265 |
else
|
266 |
{
|
267 |
double pu=mgface->get_surface()->get_periode_u();
|
268 |
double pv=mgface->get_surface()->get_periode_v();
|
269 |
if (pu>0.)
|
270 |
{
|
271 |
double u1=pu/2.;
|
272 |
double v1=uv[1];
|
273 |
double u2=pu/2.;
|
274 |
double v2=uv[1]+0.001*(vmax-vmin);
|
275 |
if (v2>vmax) v2=uv[1]-0.001*(vmax-vmin);
|
276 |
double u,v;
|
277 |
metrique->ajuste_distance_metrique(mgface,u1,v1,u2,v2,u,v,sqrt(3)/3.,0,0,pas);
|
278 |
double un1=0.;
|
279 |
double un2=pu/3;
|
280 |
double un3=2*pu/3;
|
281 |
double uvn1[3]={un1,v,0.};
|
282 |
double uvn2[3]={un2,v,0.};
|
283 |
double uvn3[3]={un3,v,0.};
|
284 |
double xyzn1[3],xyzn2[3],xyzn3[3];
|
285 |
mgface->evaluer(uvn1,xyzn1);
|
286 |
mgface->evaluer(uvn2,xyzn2);
|
287 |
mgface->evaluer(uvn3,xyzn3);
|
288 |
MG_NOEUD* nn1=mg_maillage->ajouter_mg_noeud(mgface,xyzn1[0],xyzn1[1],xyzn1[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
|
289 |
MG_NOEUD* nn2=mg_maillage->ajouter_mg_noeud(mgface,xyzn2[0],xyzn2[1],xyzn2[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
|
290 |
MG_NOEUD* nn3=mg_maillage->ajouter_mg_noeud(mgface,xyzn3[0],xyzn3[1],xyzn3[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
|
291 |
MG_SEGMENT *seg1=NULL,*seg2=NULL,*seg3=NULL;
|
292 |
int ierr1=insere_segment(mgface,&seg1,nn1,nn2,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
293 |
int ierr2=insere_segment(mgface,&seg2,nn2,nn3,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
294 |
int ierr3=insere_segment(mgface,&seg3,nn3,nn1,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
295 |
while (ierr1*ierr2*ierr3==0)
|
296 |
{
|
297 |
v=v-(v-uv[1])*0.5;
|
298 |
uvn1[1]=v;
|
299 |
uvn2[1]=v;
|
300 |
uvn3[1]=v;
|
301 |
mgface->evaluer(uvn1,xyzn1);
|
302 |
mgface->evaluer(uvn2,xyzn2);
|
303 |
mgface->evaluer(uvn3,xyzn3);
|
304 |
if (seg1!=NULL) ntree_de_segment->supprimer(seg1);
|
305 |
if (seg2!=NULL) ntree_de_segment->supprimer(seg2);
|
306 |
if (seg3!=NULL) ntree_de_segment->supprimer(seg3);
|
307 |
nn1->change_coord(xyzn1);
|
308 |
nn2->change_coord(xyzn2);
|
309 |
nn3->change_coord(xyzn3);
|
310 |
ierr1=insere_segment(mgface,&seg1,nn1,nn2,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
311 |
ierr2=insere_segment(mgface,&seg2,nn2,nn3,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
312 |
ierr3=insere_segment(mgface,&seg3,nn3,nn1,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
313 |
}
|
314 |
OT_VECTEUR_3D w(0.,0.,1.);
|
315 |
OT_VECTEUR_3D n1n2(uvn1,uvn2);
|
316 |
n1n2.norme();
|
317 |
OT_VECTEUR_3D n1pole(uvn1,uv);
|
318 |
n1pole.norme();
|
319 |
double sens=(w&n1n2)*n1pole;
|
320 |
if (sens<0)
|
321 |
{
|
322 |
insere_triangle(mgface,nn1,nn2,nn3);
|
323 |
MG_FRONT_2D *ft1=ajouter_front(front_courant,nn1,nn2,seg1);
|
324 |
MG_FRONT_2D *ft2=ajouter_front(front_courant,nn2,nn3,seg2);
|
325 |
MG_FRONT_2D *ft3=ajouter_front(front_courant,nn3,nn1,seg3);
|
326 |
ft1->changer_front_suivant(ft2);
|
327 |
ft1->changer_front_precedent(ft3);
|
328 |
ft2->changer_front_suivant(ft3);
|
329 |
ft2->changer_front_precedent(ft1);
|
330 |
ft3->changer_front_suivant(ft1);
|
331 |
ft3->changer_front_precedent(ft2);
|
332 |
}
|
333 |
else
|
334 |
{
|
335 |
insere_triangle(mgface,nn2,nn1,nn3);
|
336 |
MG_FRONT_2D *ft1=ajouter_front(front_courant,nn2,nn1,seg1);
|
337 |
MG_FRONT_2D *ft2=ajouter_front(front_courant,nn3,nn2,seg2);
|
338 |
MG_FRONT_2D *ft3=ajouter_front(front_courant,nn1,nn3,seg3);
|
339 |
ft1->changer_front_suivant(ft3);
|
340 |
ft1->changer_front_precedent(ft2);
|
341 |
ft2->changer_front_suivant(ft1);
|
342 |
ft2->changer_front_precedent(ft3);
|
343 |
ft3->changer_front_suivant(ft2);
|
344 |
ft3->changer_front_precedent(ft1);
|
345 |
}
|
346 |
|
347 |
}
|
348 |
else if (pv>0.)
|
349 |
{
|
350 |
double u1=uv[0];
|
351 |
double v1=pv/2.;
|
352 |
double u2=uv[0]+0.001*(umax-umin);;
|
353 |
double v2=pv/2;
|
354 |
if (u2>umax) u2=uv[0]-0.001*(umax-umin);
|
355 |
double u,v;
|
356 |
metrique->ajuste_distance_metrique(mgface,u1,v1,u2,v2,u,v,sqrt(3)/3.,0,0,pas);
|
357 |
double vn1=0.;
|
358 |
double vn2=pu/3;
|
359 |
double vn3=2*pu/3;
|
360 |
double uvn1[3]={u,vn1,0.};
|
361 |
double uvn2[3]={u,vn2,0.};
|
362 |
double uvn3[3]={u,vn3,0.};
|
363 |
double xyzn1[3],xyzn2[3],xyzn3[3];
|
364 |
mgface->evaluer(uvn1,xyzn1);
|
365 |
mgface->evaluer(uvn2,xyzn2);
|
366 |
mgface->evaluer(uvn3,xyzn3);
|
367 |
MG_NOEUD* nn1=mg_maillage->ajouter_mg_noeud(mgface,xyzn1[0],xyzn1[1],xyzn1[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
|
368 |
MG_NOEUD* nn2=mg_maillage->ajouter_mg_noeud(mgface,xyzn2[0],xyzn2[1],xyzn2[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
|
369 |
MG_NOEUD* nn3=mg_maillage->ajouter_mg_noeud(mgface,xyzn3[0],xyzn3[1],xyzn3[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
|
370 |
MG_SEGMENT *seg1=NULL,*seg2=NULL,*seg3=NULL;
|
371 |
int ierr1=insere_segment(mgface,&seg1,nn1,nn2,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
372 |
int ierr2=insere_segment(mgface,&seg2,nn2,nn3,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
373 |
int ierr3=insere_segment(mgface,&seg3,nn3,nn1,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
374 |
while (ierr1*ierr2*ierr3==0)
|
375 |
{
|
376 |
u=u-(u-uv[0])*0.5;
|
377 |
uvn1[0]=u;
|
378 |
uvn2[0]=u;
|
379 |
uvn3[0]=u;
|
380 |
mgface->evaluer(uvn1,xyzn1);
|
381 |
mgface->evaluer(uvn2,xyzn2);
|
382 |
mgface->evaluer(uvn3,xyzn3);
|
383 |
if (seg1!=NULL) ntree_de_segment->supprimer(seg1);
|
384 |
if (seg2!=NULL) ntree_de_segment->supprimer(seg2);
|
385 |
if (seg3!=NULL) ntree_de_segment->supprimer(seg3);
|
386 |
nn1->change_coord(xyzn1);
|
387 |
nn2->change_coord(xyzn2);
|
388 |
nn3->change_coord(xyzn3);
|
389 |
ierr1=insere_segment(mgface,&seg1,nn1,nn2,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
390 |
ierr2=insere_segment(mgface,&seg2,nn2,nn3,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
391 |
ierr3=insere_segment(mgface,&seg3,nn3,nn1,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
|
392 |
}
|
393 |
OT_VECTEUR_3D w(0.,0.,1.);
|
394 |
OT_VECTEUR_3D n1n2(uvn1,uvn2);
|
395 |
n1n2.norme();
|
396 |
OT_VECTEUR_3D n1pole(uvn1,uv);
|
397 |
n1pole.norme();
|
398 |
double sens=(w&n1n2)*n1pole;
|
399 |
if (sens<0)
|
400 |
{
|
401 |
MG_FRONT_2D *ft1=ajouter_front(front_courant,nn1,nn2,seg1);
|
402 |
MG_FRONT_2D *ft2=ajouter_front(front_courant,nn2,nn3,seg2);
|
403 |
MG_FRONT_2D *ft3=ajouter_front(front_courant,nn3,nn1,seg3);
|
404 |
ft1->changer_front_suivant(ft2);
|
405 |
ft1->changer_front_precedent(ft3);
|
406 |
ft2->changer_front_suivant(ft3);
|
407 |
ft2->changer_front_precedent(ft1);
|
408 |
ft3->changer_front_suivant(ft1);
|
409 |
ft3->changer_front_precedent(ft2);
|
410 |
}
|
411 |
else
|
412 |
{
|
413 |
MG_FRONT_2D *ft1=ajouter_front(front_courant,nn2,nn1,seg1);
|
414 |
MG_FRONT_2D *ft2=ajouter_front(front_courant,nn3,nn2,seg2);
|
415 |
MG_FRONT_2D *ft3=ajouter_front(front_courant,nn1,nn3,seg3);
|
416 |
ft1->changer_front_suivant(ft3);
|
417 |
ft1->changer_front_precedent(ft2);
|
418 |
ft2->changer_front_suivant(ft1);
|
419 |
ft2->changer_front_precedent(ft3);
|
420 |
ft3->changer_front_suivant(ft2);
|
421 |
ft3->changer_front_precedent(ft1);
|
422 |
}
|
423 |
|
424 |
}
|
425 |
}
|
426 |
}
|
427 |
}
|
428 |
|
429 |
|
430 |
|
431 |
|
432 |
void MAILLEUR2D::verifie_coin_sommet(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lstaffectecoin)
|
433 |
{
|
434 |
TPL_MAP_ENTITE<MG_SOMMET*> lstsom;
|
435 |
int nbboucle=mgface->get_nb_mg_boucle();
|
436 |
for (int i=0;i<nbboucle;i++)
|
437 |
{
|
438 |
MG_BOUCLE *bou=mgface->get_mg_boucle(i);
|
439 |
int nbare=bou->get_nb_mg_coarete();
|
440 |
for (int j=0;j<nbare;j++)
|
441 |
{
|
442 |
lstsom.ajouter(bou->get_mg_coarete(j)->get_arete()->get_cosommet1()->get_sommet());
|
443 |
lstsom.ajouter(bou->get_mg_coarete(j)->get_arete()->get_cosommet2()->get_sommet());
|
444 |
}
|
445 |
}
|
446 |
TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it;
|
447 |
for (MG_SOMMET* som=lstsom.get_premier(it);som!=NULL;som=lstsom.get_suivant(it))
|
448 |
{
|
449 |
MG_NOEUD* no;
|
450 |
int i=0;
|
451 |
do
|
452 |
{
|
453 |
no=(MG_NOEUD*)som->get_lien_maillage()->get(i);
|
454 |
i++;
|
455 |
}
|
456 |
while (mg_maillage->get_mg_noeudid(no->get_id())!=no);
|
457 |
int nbtri=no->get_lien_triangle()->get_nb();
|
458 |
int nbtrivoisin=0;
|
459 |
MG_TRIANGLE* trivoi;
|
460 |
for (int i=0;i<nbtri;i++)
|
461 |
{
|
462 |
MG_TRIANGLE* tri=no->get_lien_triangle()->get(i);
|
463 |
if (mg_maillage->get_mg_triangleid(tri->get_id())!=tri) continue;
|
464 |
if (tri->get_lien_topologie()==mgface)
|
465 |
nbtrivoisin++;
|
466 |
trivoi=tri;
|
467 |
}
|
468 |
if (nbtrivoisin>1)
|
469 |
for (int i=0;i<nbtri;i++)
|
470 |
{
|
471 |
MG_TRIANGLE* tri=no->get_lien_triangle()->get(i);
|
472 |
if (mg_maillage->get_mg_triangleid(tri->get_id())!=tri) continue;
|
473 |
if (tri->get_lien_topologie()==mgface)
|
474 |
tri->change_origine(MAGIC::ORIGINE::IMPOSE);
|
475 |
lstaffectecoin->ajouter(tri);
|
476 |
}
|
477 |
if ((nbtrivoisin==1) && (trivoi->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO))
|
478 |
{
|
479 |
MG_NOEUD *no1,*no2;
|
480 |
if (no==trivoi->get_noeud1()) {no1=trivoi->get_noeud2();no2=trivoi->get_noeud3();}
|
481 |
if (no==trivoi->get_noeud2()) {no1=trivoi->get_noeud3();no2=trivoi->get_noeud1();}
|
482 |
if (no==trivoi->get_noeud3()) {no1=trivoi->get_noeud1();no2=trivoi->get_noeud2();}
|
483 |
MG_TRIANGLE* autretri=NULL;
|
484 |
for (int i=0;i<no1->get_lien_triangle()->get_nb();i++)
|
485 |
for (int j=0;j<no2->get_lien_triangle()->get_nb();j++)
|
486 |
{
|
487 |
MG_TRIANGLE* tri1=no1->get_lien_triangle()->get(i);
|
488 |
MG_TRIANGLE* tri2=no2->get_lien_triangle()->get(j);
|
489 |
if (tri1==tri2)
|
490 |
if (tri1!=trivoi) autretri=tri1;
|
491 |
}
|
492 |
if (autretri!=NULL)
|
493 |
{
|
494 |
MG_NOEUD* autrenoeud;
|
495 |
if ((autretri->get_noeud1()!=no1) && (autretri->get_noeud1()!=no2)) autrenoeud=autretri->get_noeud1();
|
496 |
if ((autretri->get_noeud2()!=no1) && (autretri->get_noeud2()!=no2)) autrenoeud=autretri->get_noeud2();
|
497 |
if ((autretri->get_noeud3()!=no1) && (autretri->get_noeud3()!=no2)) autrenoeud=autretri->get_noeud3();
|
498 |
double nqual1=OPERATEUR::qualite_triangle(no1->get_coord(),autrenoeud->get_coord(),no->get_coord());
|
499 |
double nqual2=OPERATEUR::qualite_triangle(no2->get_coord(),no->get_coord(),autrenoeud->get_coord());
|
500 |
OT_VECTEUR_3D n1n3(no1->get_coord(),no->get_coord());
|
501 |
OT_VECTEUR_3D n1n4(no1->get_coord(),autrenoeud->get_coord());
|
502 |
double xyznormal[3];
|
503 |
double uv[2]={no1->get_u(),no1->get_v()};
|
504 |
mgface->calcul_normale_unitaire(uv,xyznormal);
|
505 |
OT_VECTEUR_3D normalface(xyznormal);
|
506 |
OT_VECTEUR_3D normal=normalface&n1n3;
|
507 |
normal.norme();
|
508 |
n1n4.norme();
|
509 |
if (normal*n1n4<0.0001) nqual1=-nqual1;
|
510 |
OT_VECTEUR_3D n2n4(no2->get_coord(),autrenoeud->get_coord());
|
511 |
OT_VECTEUR_3D n2n3(no2->get_coord(),no->get_coord());
|
512 |
double uv2[2]={no2->get_u(),no2->get_v()};
|
513 |
mgface->calcul_normale_unitaire(uv2,xyznormal);
|
514 |
OT_VECTEUR_3D normalface2(xyznormal);
|
515 |
OT_VECTEUR_3D normal2=normalface&n2n4;
|
516 |
normal2.norme();
|
517 |
n2n3.norme();
|
518 |
if (normal2*n2n3<0.0001) nqual2=-nqual2;
|
519 |
if (nqual1<1e-4) continue;
|
520 |
if (nqual2<1e-4) continue;
|
521 |
MG_TRIANGLE* tri1=insere_triangle(mgface,no1,autrenoeud,no);
|
522 |
MG_TRIANGLE* tri2=insere_triangle(mgface,no2,no,autrenoeud);
|
523 |
tri1->change_origine(MAGIC::ORIGINE::IMPOSE);
|
524 |
tri2->change_origine(MAGIC::ORIGINE::IMPOSE);
|
525 |
lstaffectecoin->ajouter(tri1);
|
526 |
lstaffectecoin->ajouter(tri2);
|
527 |
mg_maillage->supprimer_mg_triangleid(trivoi->get_id());
|
528 |
mg_maillage->supprimer_mg_triangleid(autretri->get_id());
|
529 |
}
|
530 |
}
|
531 |
|
532 |
}
|
533 |
|
534 |
}
|
535 |
|
536 |
|
537 |
void MAILLEUR2D::initialise_frontiere(MG_FACE* mgface)
|
538 |
{
|
539 |
umin=1e308;vmin=1e308;
|
540 |
umax=-1e308;vmax=-1e308;
|
541 |
int nb_boucle=mgface->get_nb_mg_boucle();
|
542 |
for (int i=0;i<nb_boucle;i++)
|
543 |
{
|
544 |
MG_BOUCLE* mgboucle=mgface->get_mg_boucle(i);
|
545 |
int nb_coarete=mgboucle->get_nb_mg_coarete();
|
546 |
for (int j=0;j<nb_coarete;j++)
|
547 |
{
|
548 |
MG_COARETE* coarete=mgboucle->get_mg_coarete(j);
|
549 |
MG_ARETE* mgarete=coarete->get_arete();
|
550 |
int nb_segment=mgarete->get_lien_maillage()->get_nb();
|
551 |
for (int k=0;k<nb_segment;k++)
|
552 |
{
|
553 |
refresh();
|
554 |
MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get(k);
|
555 |
MG_SEGMENT* mgsegtemp=mg_maillage->get_mg_segmentid(mgsegment->get_id());
|
556 |
if (mgsegtemp==NULL) continue;
|
557 |
MG_NOEUD* mgnoeud=mgsegment->get_noeud1();
|
558 |
segment_frontiere.ajouter(mgsegment);
|
559 |
if (!noeud_frontiere.est_dans_la_liste(mgnoeud))
|
560 |
{
|
561 |
double uv[2];
|
562 |
double *coo=mgnoeud->get_coord();
|
563 |
mgface->inverser(uv,coo,1e-4);
|
564 |
if (mgface->get_surface()->est_periodique_u()==1)
|
565 |
{
|
566 |
double eps=1e-10*mgface->get_surface()->get_periode_u();
|
567 |
if (uv[0]<-eps) uv[0]=uv[0]+mgface->get_surface()->get_periode_u();
|
568 |
if (uv[0]>=mgface->get_surface()->get_periode_u()-eps) uv[0]=uv[0]-mgface->get_surface()->get_periode_u();
|
569 |
}
|
570 |
if (mgface->get_surface()->est_periodique_v()==1)
|
571 |
{
|
572 |
double eps=1e-10*mgface->get_surface()->get_periode_v();
|
573 |
if (uv[1]<-eps) uv[1]=uv[1]+mgface->get_surface()->get_periode_v();
|
574 |
if (uv[1]>=mgface->get_surface()->get_periode_v()-eps) uv[1]=uv[1]-mgface->get_surface()->get_periode_v();
|
575 |
}
|
576 |
if (uv[0]<umin) umin=uv[0];
|
577 |
if (uv[1]<vmin) vmin=uv[1];
|
578 |
if (uv[0]>umax) umax=uv[0];
|
579 |
if (uv[1]>vmax) vmax=uv[1];
|
580 |
mgnoeud->change_u(uv[0]);
|
581 |
mgnoeud->change_v(uv[1]);
|
582 |
noeud_frontiere.ajouter(mgnoeud);
|
583 |
}
|
584 |
mgnoeud=mgsegment->get_noeud2();
|
585 |
if (!noeud_frontiere.est_dans_la_liste(mgnoeud))
|
586 |
{
|
587 |
double uv[2];
|
588 |
double *coo=mgnoeud->get_coord();
|
589 |
mgface->inverser(uv,coo,1e-4);
|
590 |
if (mgface->get_surface()->est_periodique_u()==1)
|
591 |
{
|
592 |
double eps=1e-10*mgface->get_surface()->get_periode_u();
|
593 |
if (uv[0]<-eps) uv[0]=uv[0]+mgface->get_surface()->get_periode_u();
|
594 |
if (uv[0]>=mgface->get_surface()->get_periode_u()-eps) uv[0]=uv[0]-mgface->get_surface()->get_periode_u();
|
595 |
}
|
596 |
if (mgface->get_surface()->est_periodique_v()==1)
|
597 |
{
|
598 |
double eps=1e-10*mgface->get_surface()->get_periode_v();
|
599 |
if (uv[1]<-eps) uv[1]=uv[1]+mgface->get_surface()->get_periode_v();
|
600 |
if (uv[1]>=mgface->get_surface()->get_periode_v()-eps) uv[1]=uv[1]-mgface->get_surface()->get_periode_v();
|
601 |
}
|
602 |
if (uv[0]<umin) umin=uv[0];
|
603 |
if (uv[1]<vmin) vmin=uv[1];
|
604 |
if (uv[0]>umax) umax=uv[0];
|
605 |
if (uv[1]>vmax) vmax=uv[1];
|
606 |
mgnoeud->change_u(uv[0]);
|
607 |
mgnoeud->change_v(uv[1]);
|
608 |
noeud_frontiere.ajouter(mgnoeud);
|
609 |
}
|
610 |
}
|
611 |
|
612 |
}
|
613 |
}
|
614 |
|
615 |
}
|
616 |
|
617 |
void MAILLEUR2D::cree_ntree(MG_FACE* mgface)
|
618 |
{
|
619 |
int nb_noeud=noeud_frontiere.get_nb();
|
620 |
BOITE_3D boiteface=mgface->get_boite_3D();
|
621 |
boiteface.change_grosseur(1.1);
|
622 |
BOITE_3D boitemetrique=metrique->get_boite_3D();
|
623 |
BOITE_3D boite=boiteface&boitemetrique;
|
624 |
double xmin=boite.get_xmin();
|
625 |
double ymin=boite.get_ymin();
|
626 |
double zmin=boite.get_zmin();
|
627 |
double xmax=boite.get_xmax();
|
628 |
double ymax=boite.get_ymax();
|
629 |
double zmax=boite.get_zmax();
|
630 |
ntree_de_segment=new TPL_NTREE_FCT<MG_SEGMENT*,FCT_TAILLE>;
|
631 |
ntree_de_front=new TPL_OCTREE<MG_FRONT_2D*,MG_NOEUD*>;
|
632 |
ntree_de_segment->initialiser(*metrique,xmin,ymin,zmin,xmax,ymax,zmax);
|
633 |
ntree_de_front->initialiser(ntree_de_segment);
|
634 |
int nb_segment=segment_frontiere.get_nb();
|
635 |
for (int j=0;j<nb_segment;j++)
|
636 |
{
|
637 |
MG_SEGMENT* seg=segment_frontiere.get(j);
|
638 |
ntree_de_segment->inserer(segment_frontiere.get(j));
|
639 |
}
|
640 |
}
|
641 |
|
642 |
|
643 |
void MAILLEUR2D::initialise_front(MG_FACE* mgface,TPL_MAP_ENTITE<MG_SOMMET*> &liste_pole)
|
644 |
{
|
645 |
MG_FRONT_2D::initialise_compteur_id();
|
646 |
int nb_boucle=mgface->get_nb_mg_boucle();
|
647 |
for (int iboucle=0;iboucle<nb_boucle;iboucle++)
|
648 |
{
|
649 |
unsigned int nb_front_avant_cette_boucle=get_nb_front(front_courant);
|
650 |
MG_BOUCLE* mgboucle=mgface->get_mg_boucle(iboucle);
|
651 |
unsigned int nbcoaretetotale=mgboucle->get_nb_mg_coarete();
|
652 |
MG_COARETE* mgcoarete=mgboucle->get_mg_coarete(0);
|
653 |
MG_NOEUD* noeud_de_depart;
|
654 |
int bon_noeud=0;
|
655 |
int numnoeud=0;
|
656 |
while (bon_noeud==0)
|
657 |
{
|
658 |
if (mgcoarete->get_orientation()==MEME_SENS) noeud_de_depart=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet1()->get_sommet()->get_lien_maillage()->get(numnoeud);
|
659 |
else noeud_de_depart=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet2()->get_sommet()->get_lien_maillage()->get(numnoeud);
|
660 |
MG_NOEUD* noeudtemp=mg_maillage->get_mg_noeudid(noeud_de_depart->get_id());
|
661 |
if (noeudtemp==NULL) numnoeud++; else bon_noeud=1;
|
662 |
}
|
663 |
MG_FRONT_2D* premier_front;
|
664 |
MG_NOEUD* noeud_courant=noeud_de_depart;
|
665 |
MG_FRONT_2D* front_precedent=NULL;
|
666 |
unsigned int nbcoaretetraite=0;
|
667 |
do
|
668 |
{
|
669 |
MG_SEGMENT* segment_courant=NULL;
|
670 |
nbcoaretetraite++;
|
671 |
MG_NOEUD* noeud_d_arrivee;
|
672 |
int bon_noeud=0;
|
673 |
int numnoeud=0;
|
674 |
while (bon_noeud==0)
|
675 |
{
|
676 |
if (mgcoarete->get_orientation()==MEME_SENS) noeud_d_arrivee=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet2()->get_sommet()->get_lien_maillage()->get(numnoeud);
|
677 |
else noeud_d_arrivee=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet1()->get_sommet()->get_lien_maillage()->get(numnoeud);
|
678 |
MG_NOEUD* noeudtemp=mg_maillage->get_mg_noeudid(noeud_d_arrivee->get_id());
|
679 |
if (noeudtemp==NULL) numnoeud++; else bon_noeud=1;
|
680 |
}
|
681 |
MG_ARETE* mgarete=mgcoarete->get_arete();
|
682 |
int passe_aretefermee=0;
|
683 |
do
|
684 |
{
|
685 |
int trouve=0;
|
686 |
int i;
|
687 |
if ((mgcoarete->get_arete()->get_cosommet1()->get_sommet()==mgcoarete->get_arete()->get_cosommet2()->get_sommet())&&(passe_aretefermee==0))
|
688 |
{
|
689 |
passe_aretefermee=1;
|
690 |
MG_SEGMENT* mgsegment_depart1=NULL;
|
691 |
MG_SEGMENT* mgsegment_depart2=NULL;
|
692 |
TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
|
693 |
MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_premier(it);
|
694 |
do
|
695 |
{
|
696 |
if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant)) mgsegment_depart1=mgsegment;
|
697 |
mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
|
698 |
}
|
699 |
while (mgsegment_depart1==NULL);
|
700 |
do
|
701 |
{
|
702 |
if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant)) mgsegment_depart2=mgsegment;
|
703 |
mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
|
704 |
}
|
705 |
while (mgsegment_depart2==NULL);
|
706 |
MG_NOEUD* noeud1_2;
|
707 |
MG_NOEUD* noeud2_2;
|
708 |
if (mgsegment_depart1->get_noeud1()==noeud_courant) noeud1_2=mgsegment_depart1->get_noeud2(); else noeud1_2=mgsegment_depart1->get_noeud1();
|
709 |
if (mgsegment_depart2->get_noeud1()==noeud_courant) noeud2_2=mgsegment_depart2->get_noeud2(); else noeud2_2=mgsegment_depart2->get_noeud1();
|
710 |
OT_VECTEUR_3D vecteur1(noeud1_2->get_x()-noeud_courant->get_x(),noeud1_2->get_y()-noeud_courant->get_y(),noeud1_2->get_z()-noeud_courant->get_z());
|
711 |
double coo[3];
|
712 |
mgarete->deriver(mgarete->get_tmin(),coo);
|
713 |
OT_VECTEUR_3D tangeante(coo[0]*mgcoarete->get_orientation(),coo[1]*mgcoarete->get_orientation(),coo[2]*mgcoarete->get_orientation());
|
714 |
MG_NOEUD* noeud_suivant;
|
715 |
if (vecteur1*tangeante>0.)
|
716 |
{
|
717 |
mgsegment=mgsegment_depart1;
|
718 |
noeud_suivant=noeud1_2;
|
719 |
}
|
720 |
else
|
721 |
{
|
722 |
mgsegment=mgsegment_depart2;
|
723 |
noeud_suivant=noeud2_2;
|
724 |
}
|
725 |
MG_FRONT_2D* front=ajouter_front(front_courant,noeud_courant,noeud_suivant,mgsegment);
|
726 |
ntree_de_segment->inserer(mgsegment);
|
727 |
if (get_nb_front(front_courant)==nb_front_avant_cette_boucle+1) premier_front=front;
|
728 |
front->changer_front_precedent(front_precedent);
|
729 |
if (front_precedent!=NULL) front_precedent->changer_front_suivant(front);
|
730 |
front_precedent=front;
|
731 |
noeud_courant=noeud_suivant;
|
732 |
segment_courant=mgsegment;
|
733 |
}
|
734 |
else
|
735 |
{
|
736 |
trouve=0;
|
737 |
TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
|
738 |
MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_premier(it);
|
739 |
do
|
740 |
{
|
741 |
if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant))
|
742 |
if (mgsegment!=segment_courant)
|
743 |
{
|
744 |
trouve=1;
|
745 |
MG_NOEUD* noeud_suivant;
|
746 |
if (mgsegment->get_noeud1()==noeud_courant) noeud_suivant=mgsegment->get_noeud2();
|
747 |
else if (mgsegment->get_noeud2()==noeud_courant) noeud_suivant=mgsegment->get_noeud1();
|
748 |
MG_FRONT_2D* front=ajouter_front(front_courant,noeud_courant,noeud_suivant,mgsegment);
|
749 |
ntree_de_segment->inserer(mgsegment);
|
750 |
if (get_nb_front(front_courant)==nb_front_avant_cette_boucle+1) premier_front=front;
|
751 |
else front_precedent->changer_front_suivant(front);
|
752 |
front->changer_front_precedent(front_precedent);
|
753 |
front_precedent=front;
|
754 |
noeud_courant=noeud_suivant;
|
755 |
segment_courant=mgsegment;
|
756 |
}
|
757 |
mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
|
758 |
}
|
759 |
while (trouve==0);
|
760 |
}
|
761 |
}
|
762 |
while (noeud_courant!=noeud_d_arrivee);
|
763 |
int trouve=0;
|
764 |
MG_SOMMET* mgsommet;
|
765 |
if (mgcoarete->get_orientation()==MEME_SENS) mgsommet=mgcoarete->get_arete()->get_cosommet2()->get_sommet();
|
766 |
else mgsommet=mgcoarete->get_arete()->get_cosommet1()->get_sommet();
|
767 |
if (mgsommet->est_pole()) liste_pole.ajouter(mgsommet);
|
768 |
double xyz[3];
|
769 |
mgsommet->get_point()->evaluer(xyz);
|
770 |
int nbcoaretesuivante=mgboucle->get_nb_mg_coarete();
|
771 |
MG_COARETE* mgcoaretetmp=NULL;
|
772 |
double angleref=0.;
|
773 |
double angleref2=0.;
|
774 |
for (int i=0;i<nbcoaretesuivante;i++)
|
775 |
{
|
776 |
MG_COARETE* mgcoarete_suivante=mgboucle->get_mg_coarete(i);
|
777 |
MG_SOMMET* mgsommet_suivant;
|
778 |
if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet1()->get_sommet();
|
779 |
else mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet2()->get_sommet();
|
780 |
if (mgsommet==mgsommet_suivant)
|
781 |
{
|
782 |
if (trouve==0)
|
783 |
{
|
784 |
trouve=1;
|
785 |
mgcoaretetmp=mgcoarete_suivante;
|
786 |
}
|
787 |
else
|
788 |
{
|
789 |
//angleref
|
790 |
double uv[2];
|
791 |
mgface->inverser(uv,xyz);
|
792 |
double normal[3];
|
793 |
mgface->calcul_normale_unitaire(uv,normal);
|
794 |
double dir1[3];
|
795 |
double dir2[3];
|
796 |
MG_COSOMMET* mgcosommet;
|
797 |
if (mgcoarete->get_orientation()==MEME_SENS) mgcosommet=mgcoarete->get_arete()->get_cosommet2();
|
798 |
else mgcosommet=mgcoarete->get_arete()->get_cosommet1();
|
799 |
mgcoarete->get_arete()->deriver(mgcosommet->get_t(),dir1);
|
800 |
if (mgcoaretetmp->get_orientation()==MEME_SENS) mgcosommet=mgcoaretetmp->get_arete()->get_cosommet1();
|
801 |
else mgcosommet=mgcoaretetmp->get_arete()->get_cosommet2();
|
802 |
mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t(),dir2);
|
803 |
int sens1=mgcoarete->get_orientation();
|
804 |
int sens2=mgcoaretetmp->get_orientation();
|
805 |
OT_VECTEUR_3D vec1(-dir1[0]*sens1,-dir1[1]*sens1,-dir1[2]*sens1);
|
806 |
OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
|
807 |
vec1.norme();
|
808 |
vec2.norme();
|
809 |
OT_VECTEUR_3D nor=normal&vec1;
|
810 |
double cs=vec1*vec2;
|
811 |
double sn=-1*(vec2*nor);
|
812 |
angleref=acos(cs);
|
813 |
if (sn<0) angleref=-angleref;
|
814 |
if (angleref<0) angleref=angleref+2.*M_PI;
|
815 |
if (mgcoarete->get_arete()==mgcoaretetmp->get_arete()) angleref=2*M_PI;
|
816 |
if (angleref<1e-10)
|
817 |
{
|
818 |
double dt=1e-3*(mgcoaretetmp->get_arete()->get_tmax()-mgcoaretetmp->get_arete()->get_tmax());
|
819 |
mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
|
820 |
OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
|
821 |
vec2.norme();
|
822 |
double cs=vec1*vec2;
|
823 |
double sn=-1*(vec2*nor);
|
824 |
angleref=acos(cs);
|
825 |
if (sn<0) angleref2=-angleref2;
|
826 |
if (angleref<0) angleref2=angleref2+2.*M_PI;
|
827 |
}
|
828 |
//angle
|
829 |
if (mgcoarete->get_orientation()==MEME_SENS) mgcosommet=mgcoarete->get_arete()->get_cosommet2();
|
830 |
else mgcosommet=mgcoarete->get_arete()->get_cosommet1();
|
831 |
mgcoarete->get_arete()->deriver(mgcosommet->get_t(),dir1);
|
832 |
if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet1();
|
833 |
else mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet2();
|
834 |
mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t(),dir2);
|
835 |
sens1=mgcoarete->get_orientation();
|
836 |
sens2=mgcoarete_suivante->get_orientation();
|
837 |
vec1.change_x(-dir1[0]*sens1);
|
838 |
vec1.change_y(-dir1[1]*sens1);
|
839 |
vec1.change_z(-dir1[2]*sens1);
|
840 |
vec2.change_x(dir2[0]*sens2);
|
841 |
vec2.change_y(dir2[1]*sens2);
|
842 |
vec2.change_z(dir2[2]*sens2);
|
843 |
vec1.norme();
|
844 |
vec2.norme();
|
845 |
nor=normal&vec1;
|
846 |
cs=vec1*vec2;
|
847 |
sn=-1*(vec2*nor);
|
848 |
double angle=acos(cs);
|
849 |
if (sn<0) angle=-angle;
|
850 |
if (angle<0) angle=angle+2.*M_PI;
|
851 |
if (mgcoarete->get_arete()==mgcoarete_suivante->get_arete()) angle=2*M_PI;
|
852 |
if (angle<angleref)
|
853 |
{
|
854 |
angleref=angle;
|
855 |
mgcoaretetmp=mgcoarete_suivante;
|
856 |
}
|
857 |
else if ((angle<1e-10) && (angleref<1e-10))
|
858 |
{
|
859 |
double dt=1e-3*(mgcoarete_suivante->get_arete()->get_tmax()-mgcoarete_suivante->get_arete()->get_tmax());
|
860 |
mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
|
861 |
OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
|
862 |
vec2.norme();
|
863 |
double cs=vec1*vec2;
|
864 |
double sn=-1*(vec2*nor);
|
865 |
angle=acos(cs);
|
866 |
if (sn<0) angle=-angle;
|
867 |
if (angle<0) angle=angle+2.*M_PI;
|
868 |
if (angle<angleref2)
|
869 |
mgcoaretetmp=mgcoarete_suivante;
|
870 |
|
871 |
}
|
872 |
|
873 |
}
|
874 |
}
|
875 |
|
876 |
}
|
877 |
mgcoarete=mgcoaretetmp;
|
878 |
}
|
879 |
while ((noeud_courant!=noeud_de_depart) || (nbcoaretetraite!=nbcoaretetotale));
|
880 |
front_precedent->changer_front_suivant(premier_front);
|
881 |
premier_front->changer_front_precedent(front_precedent);
|
882 |
}
|
883 |
}
|
884 |
|
885 |
int MAILLEUR2D::progresse_front(MG_FACE* mgface)
|
886 |
{
|
887 |
int compteur=0;
|
888 |
long Nb_iteration_max_mailleur2d = (long)param.get_valeur((char*)"Nb_iteration_max_mailleur2d");
|
889 |
while (get_nb_front(front_courant)!=0)
|
890 |
{
|
891 |
if(compteur>Nb_iteration_max_mailleur2d)
|
892 |
{
|
893 |
std::cerr << "*** MAILLEUR2D::progresse_front : Nb_iteration_max_mailleur2d atteint ! ***" << std::endl;
|
894 |
mg_maillage->get_gestionnaire()->enregistrer("void.magic");
|
895 |
return FAIL;
|
896 |
}
|
897 |
compteur++;
|
898 |
/*if (mg_maillage->get_nb_mg_triangle()+558>=1160)
|
899 |
{int i=0;
|
900 |
LISTE_MG_NOEUD::iterator it;for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(it);noeud;noeud=mg_maillage->get_suivant_noeud(it))
|
901 |
{
|
902 |
noeud->change_nouveau_numero(i+1);
|
903 |
std::cout << i+1 << " " << noeud->get_u() << " " << noeud->get_v() << std::endl; ;
|
904 |
i++;
|
905 |
}
|
906 |
mg_maillage->get_gestionnaire()->enregistrer("toto.magic");
|
907 |
}*/
|
908 |
|
909 |
if ((mgface->get_id()==3854) && (compteur%100==0) && (compteur>0))
|
910 |
{
|
911 |
mg_maillage->get_gestionnaire()->enregistrer("toto.magic");
|
912 |
}
|
913 |
refresh();
|
914 |
MG_FRONT_2D* ft=get_front(front_courant,0);
|
915 |
MG_FRONT_2D* ftp=ft->get_front_precedent();
|
916 |
MG_FRONT_2D* fts=ft->get_front_suivant();
|
917 |
double eps=0.0001*ft->get_segment()->get_longueur();
|
918 |
MG_NOEUD* nop=ftp->get_noeud1();
|
919 |
MG_NOEUD* no1=ft->get_noeud1();
|
920 |
MG_NOEUD* no2=ft->get_noeud2();
|
921 |
MG_NOEUD* nos=fts->get_noeud2();
|
922 |
/* angle precedent et angle suivant */
|
923 |
OT_VECTEUR_3D n1n2(no1->get_coord(),no2->get_coord());
|
924 |
OT_VECTEUR_3D n2s(no2->get_coord(),nos->get_coord());
|
925 |
OT_VECTEUR_3D pn1(nop->get_coord(),no1->get_coord());
|
926 |
n1n2.norme();
|
927 |
n2s.norme();
|
928 |
pn1.norme();
|
929 |
double coo[3];
|
930 |
double uv[2];
|
931 |
uv[0]=no1->get_u();
|
932 |
uv[1]=no1->get_v();
|
933 |
mgface->calcul_normale_unitaire(uv,coo);
|
934 |
OT_VECTEUR_3D nplan(coo);
|
935 |
OT_VECTEUR_3D n=nplan&n1n2;
|
936 |
n.norme();
|
937 |
double pcp=(-1)*(n1n2*pn1);
|
938 |
double psp=(-1)*(n*pn1);
|
939 |
int anglep;
|
940 |
if ((pcp>=0.1786481777)&&(psp>eps)) anglep=1; else anglep=0;
|
941 |
uv[0]=no2->get_u();
|
942 |
uv[1]=no2->get_v();
|
943 |
mgface->calcul_normale_unitaire(uv,coo);
|
944 |
OT_VECTEUR_3D nplan2(coo);
|
945 |
n=nplan2&n1n2;
|
946 |
n.norme();
|
947 |
double pcs=(-1.)*(n1n2*n2s);
|
948 |
double pss=n*n2s;
|
949 |
int angles;
|
950 |
if ((pcs>=0.1786481777)&&(pss>eps)) angles=1; else angles=0;
|
951 |
int type_cas_front[7];
|
952 |
if ( (ftp==fts->get_front_suivant()) && (no1!=nos) && (no2!=nop) ) type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_3]=1; else type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_3]=0;
|
953 |
if (ftp->get_front_precedent()==fts->get_front_suivant()) type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_4]=1; else type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_4]=0;
|
954 |
if ( (anglep==1) && (angles==1) ) type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE]=1; else type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE]=0;
|
955 |
if ( anglep==1 ) type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_P]=1; else type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_P]=0;
|
956 |
if ( angles==1 ) type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_S]=1; else type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_S]=0;
|
957 |
type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_GENERAL]=1;
|
958 |
int solution=MAGIC::MAILLEURFRONTALETAT::PASTROUVE;
|
959 |
if (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_3]) solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_3,mgface,ftp,ft,fts);
|
960 |
if ((solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE) && (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_4])) solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_4,mgface,ftp,ft,fts);
|
961 |
if ((solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE) && (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE])) solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE,mgface,ftp,ft,fts);
|
962 |
if ((solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE) && (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_P])) solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_P,mgface,ftp,ft,fts);
|
963 |
if ((solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE) && (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_S])) solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_S,mgface,ftp,ft,fts);
|
964 |
if ((solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE) && (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_GENERAL]))
|
965 |
{
|
966 |
solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_GENERAL,mgface,ftp,ft,fts);
|
967 |
if ((solution!=MAGIC::MAILLEURFRONTALETAT::PASTROUVE)&&(solution!=MAGIC::MAILLEURFRONTALETAT::TROUVE))
|
968 |
{if (!type_cas_front[solution]) solution=traite_front(solution,mgface,ftp,ft,fts); else solution=MAGIC::MAILLEURFRONTALETAT::PASTROUVE;}
|
969 |
if (solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE)
|
970 |
{
|
971 |
echange_de_front(front_courant,front_attente,ft);
|
972 |
ft->incremente_ifail();
|
973 |
solution=MAGIC::MAILLEURFRONTALETAT::TROUVE;
|
974 |
}
|
975 |
}
|
976 |
if (get_nb_front(front_courant)==0) front_courant.swap(front_attente);
|
977 |
}
|
978 |
return OK;
|
979 |
}
|
980 |
|
981 |
|
982 |
|
983 |
|
984 |
void MAILLEUR2D::insere_contrainte_segment(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_SEGMENT*> *lstseg)
|
985 |
{
|
986 |
int nbseg=lstseg->get_nb();
|
987 |
for (int i=0;i<nbseg;i++)
|
988 |
{
|
989 |
MG_SEGMENT* segori=lstseg->get(i);
|
990 |
MG_NOEUD* noeudori1=segori->get_noeud1();
|
991 |
MG_NOEUD* noeudori2=segori->get_noeud2();
|
992 |
double uv1[2];
|
993 |
double uv2[2];
|
994 |
double *coo=noeudori1->get_coord();
|
995 |
mgface->inverser(uv1,coo,1e-10);
|
996 |
if (mgface->get_surface()->est_periodique_u()==1)
|
997 |
{
|
998 |
if (uv1[0]<0.0) uv1[0]=uv1[0]+mgface->get_surface()->get_periode_u();
|
999 |
if (uv1[0]>=mgface->get_surface()->get_periode_u()) uv1[0]=uv1[0]-mgface->get_surface()->get_periode_u();
|
1000 |
}
|
1001 |
if (mgface->get_surface()->est_periodique_v()==1)
|
1002 |
{
|
1003 |
if (uv1[1]<0.0) uv1[1]=uv1[1]+mgface->get_surface()->get_periode_v();
|
1004 |
if (uv1[1]>=mgface->get_surface()->get_periode_v()) uv1[1]=uv1[1]-mgface->get_surface()->get_periode_v();
|
1005 |
}
|
1006 |
coo=noeudori2->get_coord();
|
1007 |
mgface->inverser(uv2,coo,1e-10);
|
1008 |
if (mgface->get_surface()->est_periodique_u()==1)
|
1009 |
{
|
1010 |
if (uv2[0]<0.0) uv2[0]=uv2[0]+mgface->get_surface()->get_periode_u();
|
1011 |
if (uv2[0]>=mgface->get_surface()->get_periode_u()) uv2[0]=uv2[0]-mgface->get_surface()->get_periode_u();
|
1012 |
}
|
1013 |
if (mgface->get_surface()->est_periodique_v()==1)
|
1014 |
{
|
1015 |
if (uv2[1]<0.0) uv2[1]=uv2[1]+mgface->get_surface()->get_periode_v();
|
1016 |
if (uv2[1]>=mgface->get_surface()->get_periode_v()) uv2[1]=uv2[1]-mgface->get_surface()->get_periode_v();
|
1017 |
}
|
1018 |
|
1019 |
TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
|
1020 |
double *xyz1=noeudori1->get_coord();
|
1021 |
double *xyz2=noeudori2->get_coord();
|
1022 |
double xyz[3];
|
1023 |
xyz[0]=0.5*(xyz1[0]+xyz2[0]);
|
1024 |
xyz[1]=0.5*(xyz1[1]+xyz2[1]);
|
1025 |
xyz[2]=0.5*(xyz1[2]+xyz2[2]);
|
1026 |
OT_VECTEUR_3D vec(xyz1,xyz);
|
1027 |
//double rayonrecherche=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*1.1;
|
1028 |
double rayonrecherche=vec.get_longueur()*1.1;
|
1029 |
ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
|
1030 |
|
1031 |
double u=0.5*(uv1[0]+uv2[0]);
|
1032 |
double v=0.5*(uv1[1]+uv2[1]);
|
1033 |
int nb_entite=liste_trouvee.get_nb();
|
1034 |
double du=decalage->calcul_decalage_parametre_u(u);
|
1035 |
double dv=decalage->calcul_decalage_parametre_v(v);
|
1036 |
double u1=decalage->decalage_parametre_u(uv1[0],du);
|
1037 |
double v1=decalage->decalage_parametre_v(uv1[1],dv);
|
1038 |
double u2=decalage->decalage_parametre_u(uv2[0],du);
|
1039 |
double v2=decalage->decalage_parametre_v(uv2[1],dv);
|
1040 |
MG_FRONT_2D *ref1=NULL,*ref2=NULL;
|
1041 |
double angle1,angle2;
|
1042 |
for(int j=0;j<nb_entite;j++)
|
1043 |
{
|
1044 |
MG_FRONT_2D *ft=liste_trouvee.get(j);
|
1045 |
MG_NOEUD* noeudfront=ft->get_noeud2();
|
1046 |
double uvfront[2];
|
1047 |
uvfront[0]=noeudfront->get_u();
|
1048 |
uvfront[1]=noeudfront->get_v();
|
1049 |
double ufront=decalage->decalage_parametre_u(uvfront[0],du);
|
1050 |
double vfront=decalage->decalage_parametre_v(uvfront[1],dv);
|
1051 |
//noeud 1 du segment a inserer
|
1052 |
double *xyzfront=noeudfront->get_coord();
|
1053 |
//mgface->evaluer(uvfront,xyzfront);
|
1054 |
OT_VECTEUR_3D vec(xyz1,xyzfront);
|
1055 |
double dist=vec.get_longueur();
|
1056 |
//double dist=sqrt((ufront-u1)*(ufront-u1)+(vfront-v1)*(vfront-v1));
|
1057 |
if (dist<1e-5*rayonrecherche)
|
1058 |
{
|
1059 |
if (ref1==NULL)
|
1060 |
{
|
1061 |
ref1=ft;
|
1062 |
OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
|
1063 |
MG_NOEUD* noeudfrontautre=ft->get_noeud1();
|
1064 |
double uvfrontautre[2];
|
1065 |
uvfrontautre[0]=noeudfrontautre->get_u();
|
1066 |
uvfrontautre[1]=noeudfrontautre->get_v();
|
1067 |
double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
|
1068 |
double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
|
1069 |
OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
|
1070 |
vecteur_baseu.norme();
|
1071 |
vecteur_front.norme();
|
1072 |
double cosangle=vecteur_baseu*vecteur_front;
|
1073 |
if (cosangle>1.) cosangle=1.;
|
1074 |
if (cosangle<-1.) cosangle=(-1.);
|
1075 |
angle1=acos(cosangle);
|
1076 |
}
|
1077 |
else
|
1078 |
{
|
1079 |
OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
|
1080 |
MG_NOEUD* noeudfrontautre=ft->get_noeud1();
|
1081 |
double uvfrontautre[2];
|
1082 |
uvfrontautre[0]=noeudfrontautre->get_u();
|
1083 |
uvfrontautre[1]=noeudfrontautre->get_v();
|
1084 |
double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
|
1085 |
double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
|
1086 |
OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
|
1087 |
vecteur_baseu.norme();
|
1088 |
vecteur_front.norme();
|
1089 |
double cosangle=vecteur_baseu*vecteur_front;
|
1090 |
if (cosangle>1.) cosangle=1.;
|
1091 |
if (cosangle<-1.) cosangle=(-1.);
|
1092 |
double angle=acos(cosangle);
|
1093 |
if (angle<angle1) {angle1=angle;ref1=ft;}
|
1094 |
}
|
1095 |
}
|
1096 |
//noeud 2 du segment a inserer
|
1097 |
OT_VECTEUR_3D vec2(xyz2,xyzfront);
|
1098 |
dist=vec2.get_longueur();
|
1099 |
//dist=sqrt((ufront-u2)*(ufront-u2)+(vfront-v2)*(vfront-v2));
|
1100 |
if (dist<1e-5*rayonrecherche)
|
1101 |
{
|
1102 |
if (ref2==NULL)
|
1103 |
{
|
1104 |
ref2=ft;
|
1105 |
OT_VECTEUR_3D vecteur_baseu(u1-u2,v1-v2,0.);
|
1106 |
MG_NOEUD* noeudfrontautre=ft->get_noeud1();
|
1107 |
double uvfrontautre[2];
|
1108 |
uvfrontautre[0]=noeudfrontautre->get_u();
|
1109 |
uvfrontautre[1]=noeudfrontautre->get_v();
|
1110 |
double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
|
1111 |
double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
|
1112 |
OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
|
1113 |
vecteur_baseu.norme();
|
1114 |
vecteur_front.norme();
|
1115 |
double cosangle=vecteur_baseu*vecteur_front;
|
1116 |
if (cosangle>1.) cosangle=1.;
|
1117 |
if (cosangle<-1.) cosangle=(-1.);
|
1118 |
angle2=acos(cosangle);
|
1119 |
}
|
1120 |
else
|
1121 |
{
|
1122 |
OT_VECTEUR_3D vecteur_baseu(u1-u2,v1-v2,0.);
|
1123 |
MG_NOEUD* noeudfrontautre=ft->get_noeud1();
|
1124 |
double uvfrontautre[2];
|
1125 |
uvfrontautre[0]=noeudfrontautre->get_u();
|
1126 |
uvfrontautre[1]=noeudfrontautre->get_v();
|
1127 |
double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
|
1128 |
double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
|
1129 |
OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
|
1130 |
vecteur_baseu.norme();
|
1131 |
vecteur_front.norme();
|
1132 |
double cosangle=vecteur_baseu*vecteur_front;
|
1133 |
if (cosangle>1.) cosangle=1.;
|
1134 |
if (cosangle<-1.) cosangle=(-1.);
|
1135 |
double angle=acos(cosangle);
|
1136 |
if (angle<angle2) {angle1=angle;ref2=ft;}
|
1137 |
}
|
1138 |
}
|
1139 |
|
1140 |
}
|
1141 |
// creation du segemnt
|
1142 |
MG_NOEUD* noeud1;
|
1143 |
MG_NOEUD* noeud2;
|
1144 |
if (ref1!=NULL) noeud1=ref1->get_noeud2();
|
1145 |
else
|
1146 |
{
|
1147 |
double *coord=noeudori1->get_coord();
|
1148 |
noeud1=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
|
1149 |
noeud1->change_u(uv1[0]);
|
1150 |
noeud1->change_v(uv1[1]);
|
1151 |
noeud1->change_nouveau_numero(noeudori1->get_nouveau_numero());
|
1152 |
}
|
1153 |
if (ref2!=NULL) noeud2=ref2->get_noeud2();
|
1154 |
else
|
1155 |
{
|
1156 |
double *coord=noeudori2->get_coord();
|
1157 |
noeud2=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
|
1158 |
noeud2->change_u(uv2[0]);
|
1159 |
noeud2->change_v(uv2[1]);
|
1160 |
noeud2->change_nouveau_numero(noeudori2->get_nouveau_numero());
|
1161 |
}
|
1162 |
MG_SEGMENT* mgsegment=mg_maillage->ajouter_mg_segment(mgface,noeud1,noeud2,MAGIC::ORIGINE::IMPOSE);
|
1163 |
MG_FRONT_2D *nv_ft=ajouter_front(front_courant,noeud1,noeud2,mgsegment);
|
1164 |
MG_FRONT_2D *nv_ft2=ajouter_front(front_courant,noeud2,noeud1,mgsegment);
|
1165 |
if (ref1==NULL)
|
1166 |
{
|
1167 |
nv_ft->changer_front_precedent(nv_ft2);
|
1168 |
nv_ft2->changer_front_suivant(nv_ft);
|
1169 |
}
|
1170 |
else
|
1171 |
{
|
1172 |
MG_FRONT_2D *tmp=ref1->get_front_suivant();
|
1173 |
ref1->changer_front_suivant(nv_ft);
|
1174 |
nv_ft->changer_front_precedent(ref1);
|
1175 |
nv_ft2->changer_front_suivant(tmp);
|
1176 |
tmp->changer_front_precedent(nv_ft2);
|
1177 |
}
|
1178 |
if (ref2==NULL)
|
1179 |
{
|
1180 |
nv_ft->changer_front_suivant(nv_ft2);
|
1181 |
nv_ft2->changer_front_precedent(nv_ft);
|
1182 |
}
|
1183 |
else
|
1184 |
{
|
1185 |
MG_FRONT_2D *tmp=ref2->get_front_suivant();
|
1186 |
ref2->changer_front_suivant(nv_ft2);
|
1187 |
nv_ft2->changer_front_precedent(ref2);
|
1188 |
nv_ft->changer_front_suivant(tmp);
|
1189 |
tmp->changer_front_precedent(nv_ft);
|
1190 |
}
|
1191 |
|
1192 |
}
|
1193 |
}
|
1194 |
|
1195 |
void MAILLEUR2D::insere_contrainte_triangle(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
|
1196 |
{
|
1197 |
int nbtri=lsttri->get_nb();
|
1198 |
for (int i=0;i<nbtri;i++)
|
1199 |
{
|
1200 |
MG_TRIANGLE* triori=lsttri->get(i);
|
1201 |
MG_NOEUD* noeudori1=triori->get_noeud1();
|
1202 |
MG_NOEUD* noeudori2=triori->get_noeud2();
|
1203 |
MG_NOEUD* noeudori3=triori->get_noeud3();
|
1204 |
double uv1[2];
|
1205 |
double uv2[2];
|
1206 |
double uv3[2];
|
1207 |
double *coo=noeudori1->get_coord();
|
1208 |
mgface->inverser(uv1,coo,1e-10);
|
1209 |
if (mgface->get_surface()->est_periodique_u()==1)
|
1210 |
{
|
1211 |
if (uv1[0]<0.0) uv1[0]=uv1[0]+mgface->get_surface()->get_periode_u();
|
1212 |
if (uv1[0]>=mgface->get_surface()->get_periode_u()) uv1[0]=uv1[0]-mgface->get_surface()->get_periode_u();
|
1213 |
}
|
1214 |
if (mgface->get_surface()->est_periodique_v()==1)
|
1215 |
{
|
1216 |
if (uv1[1]<0.0) uv1[1]=uv1[1]+mgface->get_surface()->get_periode_v();
|
1217 |
if (uv1[1]>=mgface->get_surface()->get_periode_v()) uv1[1]=uv1[1]-mgface->get_surface()->get_periode_v();
|
1218 |
}
|
1219 |
coo=noeudori2->get_coord();
|
1220 |
mgface->inverser(uv2,coo,1e-10);
|
1221 |
if (mgface->get_surface()->est_periodique_u()==1)
|
1222 |
{
|
1223 |
if (uv2[0]<0.0) uv2[0]=uv2[0]+mgface->get_surface()->get_periode_u();
|
1224 |
if (uv2[0]>=mgface->get_surface()->get_periode_u()) uv2[0]=uv2[0]-mgface->get_surface()->get_periode_u();
|
1225 |
}
|
1226 |
if (mgface->get_surface()->est_periodique_v()==1)
|
1227 |
{
|
1228 |
if (uv2[1]<0.0) uv2[1]=uv2[1]+mgface->get_surface()->get_periode_v();
|
1229 |
if (uv2[1]>=mgface->get_surface()->get_periode_v()) uv2[1]=uv2[1]-mgface->get_surface()->get_periode_v();
|
1230 |
}
|
1231 |
coo=noeudori3->get_coord();
|
1232 |
mgface->inverser(uv3,coo,1e-10);
|
1233 |
if (mgface->get_surface()->est_periodique_u()==1)
|
1234 |
{
|
1235 |
if (uv3[0]<0.0) uv3[0]=uv3[0]+mgface->get_surface()->get_periode_u();
|
1236 |
if (uv3[0]>=mgface->get_surface()->get_periode_u()) uv3[0]=uv3[0]-mgface->get_surface()->get_periode_u();
|
1237 |
}
|
1238 |
if (mgface->get_surface()->est_periodique_v()==1)
|
1239 |
{
|
1240 |
if (uv3[1]<0.0) uv3[1]=uv3[1]+mgface->get_surface()->get_periode_v();
|
1241 |
if (uv3[1]>=mgface->get_surface()->get_periode_v()) uv3[1]=uv3[1]-mgface->get_surface()->get_periode_v();
|
1242 |
}
|
1243 |
TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
|
1244 |
double u=0.3333333333333333*(uv1[0]+uv2[0]+uv3[0]);
|
1245 |
double v=0.3333333333333333*(uv1[1]+uv2[1]+uv3[1]);
|
1246 |
double rayonrecherche1=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*2.;
|
1247 |
double rayonrecherche2=sqrt((u-uv2[0])*(u-uv2[0])+(v-uv2[1])*(v-uv2[1]))*2.;
|
1248 |
double rayonrecherche3=sqrt((u-uv3[0])*(u-uv3[0])+(v-uv3[1])*(v-uv3[1]))*2.;
|
1249 |
double rayonrecherche=rayonrecherche1;
|
1250 |
if (rayonrecherche2>rayonrecherche) rayonrecherche=rayonrecherche2;
|
1251 |
if (rayonrecherche3>rayonrecherche) rayonrecherche=rayonrecherche3;
|
1252 |
double *xyz1=noeudori1->get_coord();
|
1253 |
double *xyz2=noeudori2->get_coord();
|
1254 |
double *xyz3=noeudori3->get_coord();
|
1255 |
double xyz[3];
|
1256 |
xyz[0]=0.333333333333333333333*(xyz1[0]+xyz2[0]+xyz3[0]);
|
1257 |
xyz[1]=0.333333333333333333333*(xyz1[1]+xyz2[1]+xyz3[1]);
|
1258 |
xyz[2]=0.333333333333333333333*(xyz1[2]+xyz2[2]+xyz3[2]);
|
1259 |
OT_VECTEUR_3D vec1(xyz1,xyz);
|
1260 |
OT_VECTEUR_3D vec2(xyz2,xyz);
|
1261 |
OT_VECTEUR_3D vec3(xyz3,xyz);
|
1262 |
rayonrecherche=std::max(vec1.get_longueur(),vec2.get_longueur());
|
1263 |
rayonrecherche=std::max(rayonrecherche,vec3.get_longueur())*1.1;
|
1264 |
//double rayonrecherche=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*1.1;
|
1265 |
ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
|
1266 |
int nb_entite=liste_trouvee.get_nb();
|
1267 |
double du=decalage->calcul_decalage_parametre_u(u);
|
1268 |
double dv=decalage->calcul_decalage_parametre_v(v);
|
1269 |
double u1=decalage->decalage_parametre_u(uv1[0],du);
|
1270 |
double v1=decalage->decalage_parametre_v(uv1[1],dv);
|
1271 |
double u2=decalage->decalage_parametre_u(uv2[0],du);
|
1272 |
double v2=decalage->decalage_parametre_v(uv2[1],dv);
|
1273 |
double u3=decalage->decalage_parametre_u(uv3[0],du);
|
1274 |
double v3=decalage->decalage_parametre_v(uv3[1],dv);
|
1275 |
MG_FRONT_2D *ref1=NULL,*ref2=NULL,*ref3=NULL;
|
1276 |
double angle1,angle2,angle3;
|
1277 |
for(int j=0;j<nb_entite;j++)
|
1278 |
{
|
1279 |
MG_FRONT_2D *ft=liste_trouvee.get(j);
|
1280 |
MG_NOEUD* noeudfront=ft->get_noeud2();
|
1281 |
double uvfront[2];
|
1282 |
uvfront[0]=noeudfront->get_u();
|
1283 |
uvfront[1]=noeudfront->get_v();
|
1284 |
double ufront=decalage->decalage_parametre_u(uvfront[0],du);
|
1285 |
double vfront=decalage->decalage_parametre_v(uvfront[1],dv);
|
1286 |
//noeud 1 du triangle a inserer
|
1287 |
//double dist=sqrt((ufront-u1)*(ufront-u1)+(vfront-v1)*(vfront-v1));
|
1288 |
double *xyzfront=noeudfront->get_coord();
|
1289 |
//mgface->evaluer(uvfront,xyzfront);
|
1290 |
OT_VECTEUR_3D vec(xyz1,xyzfront);
|
1291 |
double dist=vec.get_longueur();
|
1292 |
if (dist<1e-5*rayonrecherche)
|
1293 |
{
|
1294 |
if (ref1==NULL)
|
1295 |
{
|
1296 |
ref1=ft;
|
1297 |
OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
|
1298 |
MG_NOEUD* noeudfrontautre=ft->get_noeud1();
|
1299 |
double uvfrontautre[2];
|
1300 |
uvfrontautre[0]=noeudfrontautre->get_u();
|
1301 |
uvfrontautre[1]=noeudfrontautre->get_v();
|
1302 |
double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
|
1303 |
double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
|
1304 |
OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
|
1305 |
vecteur_baseu.norme();
|
1306 |
vecteur_front.norme();
|
1307 |
double cosangle=vecteur_baseu*vecteur_front;
|
1308 |
if (cosangle>1.) cosangle=1.;
|
1309 |
if (cosangle<-1.) cosangle=(-1.);
|
1310 |
angle1=acos(cosangle);
|
1311 |
OT_VECTEUR_3D w(0.,0.,1.);
|
1312 |
OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
|
1313 |
double sangle=vecteur_basev*vecteur_front;
|
1314 |
if (sangle<0.) angle1=2*M_PI-angle1;
|
1315 |
}
|
1316 |
else
|
1317 |
{
|
1318 |
OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
|
1319 |
MG_NOEUD* noeudfrontautre=ft->get_noeud1();
|
1320 |
double uvfrontautre[2];
|
1321 |
uvfrontautre[0]=noeudfrontautre->get_u();
|
1322 |
uvfrontautre[1]=noeudfrontautre->get_v();
|
1323 |
double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
|
1324 |
double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
|
1325 |
OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
|
1326 |
vecteur_baseu.norme();
|
1327 |
vecteur_front.norme();
|
1328 |
double cosangle=vecteur_baseu*vecteur_front;
|
1329 |
if (cosangle>1.) cosangle=1.;
|
1330 |
if (cosangle<-1.) cosangle=(-1.);
|
1331 |
double angle=acos(cosangle);
|
1332 |
OT_VECTEUR_3D w(0.,0.,1.);
|
1333 |
OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
|
1334 |
double sangle=vecteur_basev*vecteur_front;
|
1335 |
if (sangle<0.) angle=2*M_PI-angle;
|
1336 |
if (angle<angle1) {angle1=angle;ref1=ft;}
|
1337 |
}
|
1338 |
}
|
1339 |
//noeud 2 du triangle a inserer
|
1340 |
//mgface->evaluer(uvfront,xyzfront);
|
1341 |
OT_VECTEUR_3D vec2(xyz2,xyzfront);
|
1342 |
dist=vec2.get_longueur();
|
1343 |
//dist=sqrt((ufront-u2)*(ufront-u2)+(vfront-v2)*(vfront-v2));
|
1344 |
if (dist<1e-5*rayonrecherche)
|
1345 |
{
|
1346 |
if (ref2==NULL)
|
1347 |
{
|
1348 |
ref2=ft;
|
1349 |
OT_VECTEUR_3D vecteur_baseu(u3-u2,v3-v2,0.);
|
1350 |
MG_NOEUD* noeudfrontautre=ft->get_noeud1();
|
1351 |
double uvfrontautre[2];
|
1352 |
uvfrontautre[0]=noeudfrontautre->get_u();
|
1353 |
uvfrontautre[1]=noeudfrontautre->get_v();
|
1354 |
double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
|
1355 |
double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
|
1356 |
OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
|
1357 |
vecteur_baseu.norme();
|
1358 |
vecteur_front.norme();
|
1359 |
double cosangle=vecteur_baseu*vecteur_front;
|
1360 |
if (cosangle>1.) cosangle=1.;
|
1361 |
if (cosangle<-1.) cosangle=(-1.);
|
1362 |
angle2=acos(cosangle);
|
1363 |
OT_VECTEUR_3D w(0.,0.,1.);
|
1364 |
OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
|
1365 |
double sangle=vecteur_basev*vecteur_front;
|
1366 |
if (sangle<0.) angle2=2*M_PI-angle2;
|
1367 |
}
|
1368 |
else
|
1369 |
{
|
1370 |
OT_VECTEUR_3D vecteur_baseu(u3-u2,v3-v2,0.);
|
1371 |
MG_NOEUD* noeudfrontautre=ft->get_noeud1();
|
1372 |
double uvfrontautre[2];
|
1373 |
uvfrontautre[0]=noeudfrontautre->get_u();
|
1374 |
uvfrontautre[1]=noeudfrontautre->get_v();
|
1375 |
double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
|
1376 |
double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
|
1377 |
OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
|
1378 |
vecteur_baseu.norme();
|
1379 |
vecteur_front.norme();
|
1380 |
double cosangle=vecteur_baseu*vecteur_front;
|
1381 |
if (cosangle>1.) cosangle=1.;
|
1382 |
if (cosangle<-1.) cosangle=(-1.);
|
1383 |
double angle=acos(cosangle);
|
1384 |
OT_VECTEUR_3D w(0.,0.,1.);
|
1385 |
OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
|
1386 |
double sangle=vecteur_basev*vecteur_front;
|
1387 |
if (sangle<0.) angle=2*M_PI-angle;
|
1388 |
if (angle<angle2) {angle2=angle;ref2=ft;}
|
1389 |
}
|
1390 |
}
|
1391 |
//noeud 3 du triangle a inserer
|
1392 |
//dist=sqrt((ufront-u3)*(ufront-u3)+(vfront-v3)*(vfront-v3));
|
1393 |
//mgface->evaluer(uvfront,xyzfront);
|
1394 |
OT_VECTEUR_3D vec3(xyz3,xyzfront);
|
1395 |
dist=vec3.get_longueur();
|
1396 |
if (dist<1e-5*rayonrecherche)
|
1397 |
{
|
1398 |
if (ref3==NULL)
|
1399 |
{
|
1400 |
ref3=ft;
|
1401 |
OT_VECTEUR_3D vecteur_baseu(u1-u3,v1-v3,0.);
|
1402 |
MG_NOEUD* noeudfrontautre=ft->get_noeud1();
|
1403 |
double uvfrontautre[2];
|
1404 |
uvfrontautre[0]=noeudfrontautre->get_u();
|
1405 |
uvfrontautre[1]=noeudfrontautre->get_v();
|
1406 |
double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
|
1407 |
double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
|
1408 |
OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
|
1409 |
vecteur_baseu.norme();
|
1410 |
vecteur_front.norme();
|
1411 |
double cosangle=vecteur_baseu*vecteur_front;
|
1412 |
if (cosangle>1.) cosangle=1.;
|
1413 |
if (cosangle<-1.) cosangle=(-1.);
|
1414 |
angle3=acos(cosangle);
|
1415 |
OT_VECTEUR_3D w(0.,0.,1.);
|
1416 |
OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
|
1417 |
double sangle=vecteur_basev*vecteur_front;
|
1418 |
if (sangle<0.) angle3=2*M_PI-angle3;
|
1419 |
}
|
1420 |
else
|
1421 |
{
|
1422 |
OT_VECTEUR_3D vecteur_baseu(u1-u3,v1-v3,0.);
|
1423 |
MG_NOEUD* noeudfrontautre=ft->get_noeud1();
|
1424 |
double uvfrontautre[2];
|
1425 |
uvfrontautre[0]=noeudfrontautre->get_u();
|
1426 |
uvfrontautre[1]=noeudfrontautre->get_v();
|
1427 |
double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
|
1428 |
double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
|
1429 |
OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
|
1430 |
vecteur_baseu.norme();
|
1431 |
vecteur_front.norme();
|
1432 |
double cosangle=vecteur_baseu*vecteur_front;
|
1433 |
if (cosangle>1.) cosangle=1.;
|
1434 |
if (cosangle<-1.) cosangle=(-1.);
|
1435 |
double angle=acos(cosangle);
|
1436 |
OT_VECTEUR_3D w(0.,0.,1.);
|
1437 |
OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
|
1438 |
double sangle=vecteur_basev*vecteur_front;
|
1439 |
if (sangle<0.) angle=2*M_PI-angle;
|
1440 |
if (angle<angle3) {angle3=angle;ref3=ft;}
|
1441 |
|
1442 |
}
|
1443 |
}
|
1444 |
}
|
1445 |
// creation du triangle
|
1446 |
MG_NOEUD* noeud1;
|
1447 |
MG_NOEUD* noeud2;
|
1448 |
MG_NOEUD* noeud3;
|
1449 |
if (ref1!=NULL) noeud1=ref1->get_noeud2();
|
1450 |
else
|
1451 |
{
|
1452 |
double *coord=noeudori1->get_coord();
|
1453 |
noeud1=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
|
1454 |
noeud1->change_u(uv1[0]);
|
1455 |
noeud1->change_v(uv1[1]);
|
1456 |
noeud1->change_nouveau_numero(noeudori1->get_nouveau_numero());
|
1457 |
}
|
1458 |
if (ref2!=NULL) noeud2=ref2->get_noeud2();
|
1459 |
else
|
1460 |
{
|
1461 |
double *coord=noeudori2->get_coord();
|
1462 |
noeud2=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
|
1463 |
noeud2->change_u(uv2[0]);
|
1464 |
noeud2->change_v(uv2[1]);
|
1465 |
noeud2->change_nouveau_numero(noeudori2->get_nouveau_numero());
|
1466 |
}
|
1467 |
if (ref3!=NULL) noeud3=ref3->get_noeud2();
|
1468 |
else
|
1469 |
{
|
1470 |
double *coord=noeudori3->get_coord();
|
1471 |
noeud3=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
|
1472 |
noeud3->change_u(uv3[0]);
|
1473 |
noeud3->change_v(uv3[1]);
|
1474 |
noeud3->change_nouveau_numero(noeudori3->get_nouveau_numero());
|
1475 |
}
|
1476 |
MG_SEGMENT* mgsegment1=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
|
1477 |
MG_SEGMENT* mgsegment2=mg_maillage->get_mg_segment(noeud2->get_id(),noeud3->get_id());
|
1478 |
MG_SEGMENT* mgsegment3=mg_maillage->get_mg_segment(noeud3->get_id(),noeud1->get_id());
|
1479 |
int seg1=1,seg2=1,seg3=1;
|
1480 |
if (mgsegment1==NULL) mgsegment1=mg_maillage->ajouter_mg_segment(mgface,noeud1,noeud2,MAGIC::ORIGINE::IMPOSE); else seg1=0;
|
1481 |
if (mgsegment2==NULL) mgsegment2=mg_maillage->ajouter_mg_segment(mgface,noeud2,noeud3,MAGIC::ORIGINE::IMPOSE); else seg2=0;
|
1482 |
if (mgsegment3==NULL) mgsegment3=mg_maillage->ajouter_mg_segment(mgface,noeud3,noeud1,MAGIC::ORIGINE::IMPOSE); else seg3=0;
|
1483 |
M3D_TRIANGLE* mtriangle=new M3D_TRIANGLE(mgface,noeud1,noeud2,noeud3,mgsegment1,mgsegment2,mgsegment3,MAGIC::ORIGINE::IMPOSE);
|
1484 |
mg_maillage->ajouter_mg_triangle(mtriangle);
|
1485 |
int segtotal=seg1+seg2+seg3;
|
1486 |
if (segtotal==3)
|
1487 |
{
|
1488 |
MG_FRONT_2D* ft1=ajouter_front(front_courant,noeud1,noeud2,mgsegment1);
|
1489 |
MG_FRONT_2D* ft2=ajouter_front(front_courant,noeud2,noeud3,mgsegment2);
|
1490 |
MG_FRONT_2D* ft3=ajouter_front(front_courant,noeud3,noeud1,mgsegment3);
|
1491 |
if (ref1==NULL)
|
1492 |
{
|
1493 |
ft1->changer_front_precedent(ft3);
|
1494 |
ft3->changer_front_suivant(ft1);
|
1495 |
}
|
1496 |
else
|
1497 |
{
|
1498 |
MG_FRONT_2D* tmp=ref1->get_front_suivant();
|
1499 |
ft1->changer_front_precedent(ref1);
|
1500 |
ref1->changer_front_suivant(ft1);
|
1501 |
ft3->changer_front_suivant(tmp);
|
1502 |
tmp->changer_front_precedent(ft3);
|
1503 |
}
|
1504 |
if (ref2==NULL)
|
1505 |
{
|
1506 |
ft1->changer_front_suivant(ft2);
|
1507 |
ft2->changer_front_precedent(ft1);
|
1508 |
}
|
1509 |
else
|
1510 |
{
|
1511 |
MG_FRONT_2D* tmp=ref2->get_front_suivant();
|
1512 |
ft2->changer_front_precedent(ref2);
|
1513 |
ref2->changer_front_suivant(ft2);
|
1514 |
ft1->changer_front_suivant(tmp);
|
1515 |
tmp->changer_front_precedent(ft1);
|
1516 |
}
|
1517 |
if (ref3==NULL)
|
1518 |
{
|
1519 |
ft2->changer_front_suivant(ft3);
|
1520 |
ft3->changer_front_precedent(ft2);
|
1521 |
}
|
1522 |
else
|
1523 |
{
|
1524 |
MG_FRONT_2D* tmp=ref3->get_front_suivant();
|
1525 |
ft3->changer_front_precedent(ref3);
|
1526 |
ref3->changer_front_suivant(ft3);
|
1527 |
ft2->changer_front_suivant(tmp);
|
1528 |
tmp->changer_front_precedent(ft2);
|
1529 |
}
|
1530 |
}
|
1531 |
if (segtotal==2)
|
1532 |
{
|
1533 |
MG_FRONT_2D *front1,*front2,*front3;
|
1534 |
MG_SEGMENT *segcre1,*segcre2;
|
1535 |
if (seg3==0)
|
1536 |
{
|
1537 |
front1=ref1;front2=ref3;front3=ref2;
|
1538 |
segcre1=mgsegment1;segcre2=mgsegment2;
|
1539 |
}
|
1540 |
if (seg1==0)
|
1541 |
{
|
1542 |
front1=ref2;front2=ref1;front3=ref3;
|
1543 |
segcre1=mgsegment2;segcre2=mgsegment3;
|
1544 |
}
|
1545 |
if (seg2==0)
|
1546 |
{
|
1547 |
front1=ref3;front2=ref2;front3=ref1;
|
1548 |
segcre1=mgsegment3;segcre2=mgsegment1;
|
1549 |
}
|
1550 |
MG_FRONT_2D* ft1=ajouter_front(front_courant,segcre1->get_noeud1(),segcre1->get_noeud2(),segcre1);
|
1551 |
MG_FRONT_2D* ft2=ajouter_front(front_courant,segcre2->get_noeud1(),segcre2->get_noeud2(),segcre2);
|
1552 |
front1->changer_front_suivant(ft1);
|
1553 |
ft1->changer_front_precedent(front1);
|
1554 |
if (front3==NULL)
|
1555 |
{
|
1556 |
ft1->changer_front_suivant(ft2);
|
1557 |
ft2->changer_front_precedent(ft1);
|
1558 |
}
|
1559 |
else
|
1560 |
{
|
1561 |
MG_FRONT_2D* tmp=front3->get_front_suivant();
|
1562 |
ft1->changer_front_suivant(tmp);
|
1563 |
tmp->changer_front_precedent(ft1);
|
1564 |
ft2->changer_front_precedent(front3);
|
1565 |
front3->changer_front_suivant(ft2);
|
1566 |
}
|
1567 |
ft2->changer_front_suivant(front2->get_front_suivant());
|
1568 |
front2->get_front_suivant()->changer_front_precedent(ft2);
|
1569 |
supprimer_front(front2);
|
1570 |
}
|
1571 |
if (segtotal==1)
|
1572 |
{
|
1573 |
MG_FRONT_2D *front1,*front2,*front3;
|
1574 |
MG_SEGMENT *segcre1;
|
1575 |
if (seg1==1)
|
1576 |
{
|
1577 |
front1=ref1;front2=ref3;front3=ref2;
|
1578 |
segcre1=mgsegment1;
|
1579 |
}
|
1580 |
if (seg2==1)
|
1581 |
{
|
1582 |
front1=ref2;front2=ref1;front3=ref3;
|
1583 |
segcre1=mgsegment2;
|
1584 |
}
|
1585 |
if (seg3==1)
|
1586 |
{
|
1587 |
front1=ref3;front2=ref2;front3=ref1;
|
1588 |
segcre1=mgsegment3;
|
1589 |
}
|
1590 |
MG_FRONT_2D* ft1=ajouter_front(front_courant,segcre1->get_noeud1(),segcre1->get_noeud2(),segcre1);
|
1591 |
front1->changer_front_suivant(ft1);
|
1592 |
ft1->changer_front_precedent(front1);
|
1593 |
ft1->changer_front_suivant(front3->get_front_suivant());
|
1594 |
front3->get_front_suivant()->changer_front_precedent(ft1);
|
1595 |
supprimer_front(front2);
|
1596 |
supprimer_front(front3);
|
1597 |
}
|
1598 |
if (segtotal==0)
|
1599 |
{
|
1600 |
supprimer_front(ref1);
|
1601 |
supprimer_front(ref2);
|
1602 |
supprimer_front(ref3);
|
1603 |
}
|
1604 |
|
1605 |
|
1606 |
}
|
1607 |
}
|
1608 |
|
1609 |
void MAILLEUR2D::change_niveau_optimisation(int num)
|
1610 |
{
|
1611 |
niveau_optimisation=num;
|
1612 |
}
|
1613 |
|
1614 |
int MAILLEUR2D::get_niveau_optimisation(void)
|
1615 |
{
|
1616 |
return niveau_optimisation;
|
1617 |
}
|
1618 |
|
1619 |
|
1620 |
MG_FRONT_2D* MAILLEUR2D::ajouter_front(FRONT& front,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_SEGMENT* segment)
|
1621 |
{
|
1622 |
MG_FRONT_2D* ft=new MG_FRONT_2D(noeud1,noeud2,segment);
|
1623 |
ajouter_front(front,ft);
|
1624 |
ntree_de_front->inserer(ft);
|
1625 |
return ft;
|
1626 |
}
|
1627 |
|
1628 |
void MAILLEUR2D::ajouter_front(FRONT& front,MG_FRONT_2D *ft)
|
1629 |
{
|
1630 |
std::pair<const double,MG_FRONT_2D*> tmp(ft->get_segment()->get_longueur(),ft);
|
1631 |
front.insert(tmp);
|
1632 |
}
|
1633 |
|
1634 |
MG_FRONT_2D* MAILLEUR2D::get_front(FRONT& front,unsigned int num)
|
1635 |
{
|
1636 |
FRONT::iterator i=front.begin();
|
1637 |
for (unsigned long j=0;j<num;j++) i++;
|
1638 |
return ((*i).second);
|
1639 |
}
|
1640 |
|
1641 |
|
1642 |
unsigned int MAILLEUR2D::get_nb_front(FRONT& front)
|
1643 |
{
|
1644 |
return front.size();
|
1645 |
}
|
1646 |
|
1647 |
|
1648 |
void MAILLEUR2D::supprimer_front(MG_FRONT_2D* ft)
|
1649 |
{
|
1650 |
ntree_de_front->supprimer(ft);
|
1651 |
|
1652 |
FRONT::iterator j=front_courant.lower_bound(ft->get_segment()->get_longueur());
|
1653 |
int ok=0;
|
1654 |
if (j==front_courant.end()) ok=2;
|
1655 |
while (ok==0)
|
1656 |
{
|
1657 |
MG_FRONT_2D* fttmp=(*j).second;
|
1658 |
if (ft==fttmp) {ok=1;front_courant.erase(j);}
|
1659 |
if (fttmp->get_segment()->get_longueur()>ft->get_segment()->get_longueur()) ok=2;
|
1660 |
if (ok==0) j++;
|
1661 |
}
|
1662 |
if (ok!=1)
|
1663 |
{
|
1664 |
j=front_attente.lower_bound(ft->get_segment()->get_longueur());
|
1665 |
while (ft!=(*j).second) j++;
|
1666 |
front_attente.erase(j);
|
1667 |
}
|
1668 |
|
1669 |
delete ft;
|
1670 |
}
|
1671 |
|
1672 |
void MAILLEUR2D::echange_de_front(FRONT& front_original,FRONT& front_destination,MG_FRONT_2D* ft)
|
1673 |
{
|
1674 |
FRONT::iterator j=front_original.lower_bound(ft->get_segment()->get_longueur());
|
1675 |
while (ft!=(*j).second) j++;
|
1676 |
front_original.erase(j);
|
1677 |
ajouter_front(front_destination,ft);
|
1678 |
}
|
1679 |
|
1680 |
void MAILLEUR2D::enregistre_front(char *nom,int dimension)
|
1681 |
{
|
1682 |
TPL_MAP_ENTITE<MG_NOEUD*> lstno;
|
1683 |
TPL_LISTE_ENTITE<MG_FRONT_2D*> lstseg;
|
1684 |
for (FRONT::iterator j=front_courant.begin();j!=front_courant.end();j++)
|
1685 |
{
|
1686 |
MG_FRONT_2D* ft=j->second;
|
1687 |
lstno.ajouter(ft->get_noeud1());
|
1688 |
lstno.ajouter(ft->get_noeud2());
|
1689 |
lstseg.ajouter(ft);
|
1690 |
}
|
1691 |
for (FRONT::iterator j=front_attente.begin();j!=front_attente.end();j++)
|
1692 |
{
|
1693 |
MG_FRONT_2D* ft=j->second;
|
1694 |
lstno.ajouter(ft->get_noeud1());
|
1695 |
lstno.ajouter(ft->get_noeud2());
|
1696 |
lstseg.ajouter(ft);
|
1697 |
}
|
1698 |
MG_GESTIONNAIRE gestfront;
|
1699 |
MG_MAILLAGE* maift=new MG_MAILLAGE(NULL);
|
1700 |
gestfront.ajouter_mg_maillage(maift);
|
1701 |
TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itn;
|
1702 |
int i=0;
|
1703 |
for (MG_NOEUD* no=lstno.get_premier(itn);no!=NULL;no=lstno.get_suivant(itn))
|
1704 |
{
|
1705 |
double x,y,z;
|
1706 |
i++;
|
1707 |
if (dimension==3)
|
1708 |
{
|
1709 |
x=no->get_x();
|
1710 |
y=no->get_y();
|
1711 |
z=no->get_z();
|
1712 |
}
|
1713 |
if (dimension==2)
|
1714 |
{
|
1715 |
x=no->get_u();
|
1716 |
y=no->get_v();
|
1717 |
z=0.;
|
1718 |
}
|
1719 |
MG_NOEUD* nno=new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::TRIANGULATION);
|
1720 |
maift->ajouter_mg_noeud(nno);
|
1721 |
no->change_nouveau_numero(nno->get_id());
|
1722 |
no->change_solution(i);
|
1723 |
}
|
1724 |
for (int i=0;i<lstseg.get_nb();i++)
|
1725 |
{
|
1726 |
MG_FRONT_2D* seg=lstseg.get(i);
|
1727 |
MG_NOEUD* no1=seg->get_noeud1();
|
1728 |
MG_NOEUD* no2=seg->get_noeud2();
|
1729 |
MG_NOEUD* nno1=maift->get_mg_noeudid(no1->get_nouveau_numero());
|
1730 |
MG_NOEUD* nno2=maift->get_mg_noeudid(no2->get_nouveau_numero());
|
1731 |
MG_SEGMENT* nseg=new MG_SEGMENT(NULL,nno1,nno2,MAGIC::ORIGINE::TRIANGULATION);
|
1732 |
maift->ajouter_mg_segment(nseg);
|
1733 |
MG_NOEUD* nop=seg->get_front_precedent()->get_noeud1();
|
1734 |
MG_NOEUD* nos=seg->get_front_suivant()->get_noeud2();
|
1735 |
printf("%d : %d %d %d %d \n",i+1,(int)nop->get_solution(),(int)no1->get_solution(),(int)no2->get_solution(),(int)nos->get_solution());
|
1736 |
}
|
1737 |
printf("----------------------------------\n");
|
1738 |
gestfront.enregistrer(nom);
|
1739 |
MG_EXPORT exp;
|
1740 |
exp.gmsh_avec_correspondance(maift,nom);
|
1741 |
}
|