ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur_auto/src/mailleur2d.cpp
Revision: 906
Committed: Mon Nov 13 22:30:18 2017 UTC (7 years, 9 months ago) by couturad
File size: 79978 byte(s)
Log Message:
Nouveau opencascade commit 1

File Contents

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