60 std::map<MG_ELEMENT_TOPOLOGIQUE*,MG_ELEMENT_TOPOLOGIQUE*>::iterator it;
64 ele->get_topologie_sousjacente(&lst);
68 for (
int i=0;i<nb_face;i++)
72 if (lst.
existe(mgface)==0)
continue;
107 for (
int i=0;i<lsttriaffectecoin.
get_nb();i++)
120 int nbpolesursommet=liste_pole_sommet.
get_nb();
122 sprintf(message,
" face comportant %d pole dont %d pole sur un sommet",mgface->
get_nb_pole(),nbpolesursommet);
124 std::vector<double> liste_pole;
126 for (
int i=0;i<liste_pole.size();i=i+2)
128 double uv[3]={liste_pole[i],liste_pole[i+1],0.};
131 double tenseur_metrique[9];
133 double dcible=1./
sqrt(tenseur_metrique[0]);
151 for (
int j=0;j<liste_trouvee.
get_nb();j++)
154 if (liste_supprimer.
existe(ft))
continue;
176 uvpole[0]=nopo->
get_u();
177 uvpole[1]=nopo->
get_v();
183 double cs=(-1)*(n1n2*n2s);
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.);
196 for (
int i=0;i<nbtri;i++)
203 if (ierr==0) uv[(num+1)%2]=uv[(num+1)%2]-(uv[(num+1)%2]-uvpole[(num+1)%2])*0.5;
206 for (
int i=0;i<nbtri-1;i++)
208 uv[num]=(i+1)*1.0/nbtri*angle;
227 double sens=(w&uvn1n2)*uvn1pole;
229 if (sens>0) ftppcourant=ftss;
230 for (
int i=0;i<nbtri;i++)
233 insere_triangle(mgface,nopo,tabseg[i]->get_noeud1(),tabseg[i]->get_noeud2());
235 insere_triangle(mgface,nopo,tabseg[i]->get_noeud2(),tabseg[i]->get_noeud1());
277 metrique->
ajuste_distance_metrique(mgface,u1,v1,u2,v2,u,v,
sqrt(3)/3.,0,0,
pas);
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];
295 while (ierr1*ierr2*ierr3==0)
319 double sens=(w&n1n2)*n1pole;
356 metrique->
ajuste_distance_metrique(mgface,u1,v1,u2,v2,u,v,
sqrt(3)/3.,0,0,
pas);
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];
374 while (ierr1*ierr2*ierr3==0)
398 double sens=(w&n1n2)*n1pole;
436 for (
int i=0;i<nbboucle;i++)
440 for (
int j=0;j<nbare;j++)
453 no=(
MG_NOEUD*)som->get_lien_maillage()->get(i);
460 for (
int i=0;i<nbtri;i++)
469 for (
int i=0;i<nbtri;i++)
490 if (tri1!=trivoi) autretri=tri1;
509 if (normal*n1n4<0.0001) nqual1=-nqual1;
518 if (normal2*n2n3<0.0001) nqual2=-nqual2;
519 if (nqual1<1e-4)
continue;
520 if (nqual2<1e-4)
continue;
542 for (
int i=0;i<nb_boucle;i++)
546 for (
int j=0;j<nb_coarete;j++)
551 for (
int k=0;k<nb_segment;k++)
556 if (mgsegtemp==NULL)
continue;
623 BOITE_3D boite=boiteface&boitemetrique;
635 for (
int j=0;j<nb_segment;j++)
647 for (
int iboucle=0;iboucle<nb_boucle;iboucle++)
661 if (noeudtemp==NULL) numnoeud++;
else bon_noeud=1;
664 MG_NOEUD* noeud_courant=noeud_de_depart;
666 unsigned int nbcoaretetraite=0;
679 if (noeudtemp==NULL) numnoeud++;
else bon_noeud=1;
682 int passe_aretefermee=0;
696 if ((mgsegment->
get_noeud1()==noeud_courant) || (mgsegment->
get_noeud2()==noeud_courant)) mgsegment_depart1=mgsegment;
699 while (mgsegment_depart1==NULL);
702 if ((mgsegment->
get_noeud1()==noeud_courant) || (mgsegment->
get_noeud2()==noeud_courant)) mgsegment_depart2=mgsegment;
705 while (mgsegment_depart2==NULL);
715 if (vecteur1*tangeante>0.)
717 mgsegment=mgsegment_depart1;
718 noeud_suivant=noeud1_2;
722 mgsegment=mgsegment_depart2;
723 noeud_suivant=noeud2_2;
730 front_precedent=front;
731 noeud_courant=noeud_suivant;
732 segment_courant=mgsegment;
742 if (mgsegment!=segment_courant)
753 front_precedent=front;
754 noeud_courant=noeud_suivant;
755 segment_courant=mgsegment;
762 while (noeud_courant!=noeud_d_arrivee);
774 for (
int i=0;i<nbcoaretesuivante;i++)
780 if (mgsommet==mgsommet_suivant)
785 mgcoaretetmp=mgcoarete_suivante;
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);
811 double sn=-1*(vec2*nor);
813 if (sn<0) angleref=-angleref;
814 if (angleref<0) angleref=angleref+2.*M_PI;
820 OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
823 double sn=-1*(vec2*nor);
825 if (sn<0) angleref2=-angleref2;
826 if (angleref<0) angleref2=angleref2+2.*M_PI;
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);
848 double angle=
acos(cs);
849 if (sn<0) angle=-angle;
850 if (angle<0) angle=angle+2.*M_PI;
855 mgcoaretetmp=mgcoarete_suivante;
857 else if ((angle<1e-10) && (angleref<1e-10))
861 OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
864 double sn=-1*(vec2*nor);
866 if (sn<0) angle=-angle;
867 if (angle<0) angle=angle+2.*M_PI;
869 mgcoaretetmp=mgcoarete_suivante;
877 mgcoarete=mgcoaretetmp;
879 while ((noeud_courant!=noeud_de_depart) || (nbcoaretetraite!=nbcoaretetotale));
888 long Nb_iteration_max_mailleur2d = (long)
param.
get_valeur((
char*)
"Nb_iteration_max_mailleur2d");
891 if(
compteur>Nb_iteration_max_mailleur2d)
893 std::cerr <<
"*** MAILLEUR2D::progresse_front : Nb_iteration_max_mailleur2d atteint ! ***" << std::endl;
937 double pcp=(-1)*(n1n2*pn1);
938 double psp=(-1)*(n*pn1);
940 if ((pcp>=0.1786481777)&&(psp>eps)) anglep=1;
else anglep=0;
947 double pcs=(-1.)*(n1n2*n2s);
950 if ((pcs>=0.1786481777)&&(pss>eps)) angles=1;
else angles=0;
951 int type_cas_front[7];
986 int nbseg=lstseg->
get_nb();
987 for (
int i=0;i<nbseg;i++)
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]);
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();
1041 double angle1,angle2;
1042 for(
int j=0;j<nb_entite;j++)
1047 uvfront[0]=noeudfront->
get_u();
1048 uvfront[1]=noeudfront->
get_v();
1052 double *xyzfront=noeudfront->
get_coord();
1057 if (dist<1e-5*rayonrecherche)
1064 double uvfrontautre[2];
1065 uvfrontautre[0]=noeudfrontautre->
get_u();
1066 uvfrontautre[1]=noeudfrontautre->
get_v();
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);
1081 double uvfrontautre[2];
1082 uvfrontautre[0]=noeudfrontautre->
get_u();
1083 uvfrontautre[1]=noeudfrontautre->
get_v();
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;}
1100 if (dist<1e-5*rayonrecherche)
1107 double uvfrontautre[2];
1108 uvfrontautre[0]=noeudfrontautre->
get_u();
1109 uvfrontautre[1]=noeudfrontautre->
get_v();
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);
1124 double uvfrontautre[2];
1125 uvfrontautre[0]=noeudfrontautre->
get_u();
1126 uvfrontautre[1]=noeudfrontautre->
get_v();
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;}
1153 if (ref2!=NULL) noeud2=ref2->get_noeud2();
1197 int nbtri=lsttri->
get_nb();
1198 for (
int i=0;i<nbtri;i++)
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;
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]);
1263 rayonrecherche=std::max(rayonrecherche,vec3.
get_longueur())*1.1;
1266 int nb_entite=liste_trouvee.
get_nb();
1276 double angle1,angle2,angle3;
1277 for(
int j=0;j<nb_entite;j++)
1282 uvfront[0]=noeudfront->
get_u();
1283 uvfront[1]=noeudfront->
get_v();
1288 double *xyzfront=noeudfront->
get_coord();
1292 if (dist<1e-5*rayonrecherche)
1299 double uvfrontautre[2];
1300 uvfrontautre[0]=noeudfrontautre->
get_u();
1301 uvfrontautre[1]=noeudfrontautre->
get_v();
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);
1313 double sangle=vecteur_basev*vecteur_front;
1314 if (sangle<0.) angle1=2*M_PI-angle1;
1320 double uvfrontautre[2];
1321 uvfrontautre[0]=noeudfrontautre->
get_u();
1322 uvfrontautre[1]=noeudfrontautre->
get_v();
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);
1334 double sangle=vecteur_basev*vecteur_front;
1335 if (sangle<0.) angle=2*M_PI-angle;
1336 if (angle<angle1) {angle1=angle;ref1=ft;}
1344 if (dist<1e-5*rayonrecherche)
1351 double uvfrontautre[2];
1352 uvfrontautre[0]=noeudfrontautre->
get_u();
1353 uvfrontautre[1]=noeudfrontautre->
get_v();
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);
1365 double sangle=vecteur_basev*vecteur_front;
1366 if (sangle<0.) angle2=2*M_PI-angle2;
1372 double uvfrontautre[2];
1373 uvfrontautre[0]=noeudfrontautre->
get_u();
1374 uvfrontautre[1]=noeudfrontautre->
get_v();
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);
1386 double sangle=vecteur_basev*vecteur_front;
1387 if (sangle<0.) angle=2*M_PI-angle;
1388 if (angle<angle2) {angle2=angle;ref2=ft;}
1396 if (dist<1e-5*rayonrecherche)
1403 double uvfrontautre[2];
1404 uvfrontautre[0]=noeudfrontautre->
get_u();
1405 uvfrontautre[1]=noeudfrontautre->
get_v();
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);
1417 double sangle=vecteur_basev*vecteur_front;
1418 if (sangle<0.) angle3=2*M_PI-angle3;
1424 double uvfrontautre[2];
1425 uvfrontautre[0]=noeudfrontautre->
get_u();
1426 uvfrontautre[1]=noeudfrontautre->
get_v();
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);
1438 double sangle=vecteur_basev*vecteur_front;
1439 if (sangle<0.) angle=2*M_PI-angle;
1440 if (angle<angle3) {angle3=angle;ref3=ft;}
1458 if (ref2!=NULL) noeud2=ref2->get_noeud2();
1467 if (ref3!=NULL) noeud3=ref3->get_noeud2();
1479 int seg1=1,seg2=1,seg3=1;
1485 int segtotal=seg1+seg2+seg3;
1513 ref2->changer_front_suivant(ft2);
1526 ref3->changer_front_suivant(ft3);
1537 front1=ref1;front2=ref3;front3=ref2;
1538 segcre1=mgsegment1;segcre2=mgsegment2;
1542 front1=ref2;front2=ref1;front3=ref3;
1543 segcre1=mgsegment2;segcre2=mgsegment3;
1547 front1=ref3;front2=ref2;front3=ref1;
1548 segcre1=mgsegment3;segcre2=mgsegment1;
1577 front1=ref1;front2=ref3;front3=ref2;
1582 front1=ref2;front2=ref1;front3=ref3;
1587 front1=ref3;front2=ref2;front3=ref1;
1636 FRONT::iterator i=front.begin();
1637 for (
unsigned long j=0;j<num;j++) i++;
1638 return ((*i).second);
1644 return front.size();
1665 while (ft!=(*j).second) j++;
1675 while (ft!=(*j).second) j++;
1676 front_original.erase(j);
1722 no->change_solution(i);
1724 for (
int i=0;i<lstseg.
get_nb();i++)
1737 printf(
"----------------------------------\n");