33 #pragma package(smart_init)
39 REMAILLEUR::REMAILLEUR(
class MG_GESTIONNAIRE* g1,
MG_GESTIONNAIRE* g2,
MG_GEOMETRIE* geo1,
MG_GEOMETRIE* geo2,
class FCT_TAILLE* fct_taille1,
FCT_TAILLE* fct_taille2,
MG_MAILLAGE* mori,
MG_MAILLAGE* mmodi,
VCT_COMPARAISON_RESULTAT& cmp):
MAILLEUR(false),gestorigine(g1),gestmodifie(g2),carteori(fct_taille1),cartemod(fct_taille2),rescmp(cmp),maiorigine(mori),maimodifie(mmodi),geoorigine(geo1),geomodifie(geo2)
61 if (etape<1)
return OK;
62 affiche((
char*)
" Destruction autour des disparitions");
65 for (
int i=0;i<nb;i++)
73 for (
int j=0;j<nblien;j++)
83 for (
int j=0;j<nblien;j++)
97 for (
int j=0;j<nblien;j++)
113 int nbseg=no->get_lien_segment()->get_nb();
114 for (
int i=0;i<nbseg;i++)
115 ereelle=ereelle+no->get_lien_segment()->get(i)->get_longueur();
116 ereelle=ereelle/nbseg;
119 if (etape<2)
return OK;
120 affiche((
char*)
" Transfert sommet");
122 for (
int i=0;i<nb;i++)
130 for (
int j=0;j<nblien;j++)
142 if (etape<3)
return OK;
143 affiche((
char*)
" MAILLAGE 0D");
146 if (etape<4)
return OK;
147 affiche((
char*)
" Destruction autour des nouveaux sommets");
150 for (
int i=0;i<nb;i++)
158 for (
int j=0;j<nblien;j++)
169 if (etape<5)
return OK;
204 affiche((
char*)
" Creation des blocs de maille 1D");
207 for (
int i=0;i<nb;i++)
213 std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> > lstseg;
227 std::pair<unsigned long,MG_SEGMENT*> tmp(n1->
get_id(),seg);
229 std::pair<unsigned long,MG_SEGMENT*> tmp2(n2->
get_id(),seg);
238 if (etape<6)
return OK;
239 affiche((
char*)
" MAILLAGE 1D");
241 for (
int i=0;i<nbare;i++)
246 std::multimap<unsigned long,BLOC_MAILLE_1D*,std::less <unsigned long> >::iterator it=
lstb1d.begin();
254 double xyz1[3],xyz2[3],xyz[3];
268 if (ps <0) sensidentique=0;
269 if (sensidentique==0)
290 double xyz1tmp[3],xyz2tmp[3];
297 double eps=(1./
sqrt(metrique[0])*1e-6);
298 double t=0.5*(t1+t2);
303 if ((t>=arete->
get_tmin()) && (t<=arete->get_tmax()))
305 int nbseg=b1d->
lst.size();
307 for (
int i=0;i<nbseg;i++)
312 double xyz1[3],xy2[3];
320 if (sensidentique==1)
334 if (etape<7)
return OK;
335 affiche((
char*)
" Destruction autour des nouvelles aretes");
357 LISTE_MG_SEGMENT::iterator itnvseg;
370 if (etape<8)
return OK;
371 affiche((
char*)
" Creation des blocs de maille 2D");
373 for (
int i=0;i<nb;i++)
379 std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> > lsttri;
397 std::pair<unsigned long,MG_TRIANGLE*> tmp(n1->
get_id(),tri);
399 std::pair<unsigned long,MG_TRIANGLE*> tmp2(n2->
get_id(),tri);
401 std::pair<unsigned long,MG_TRIANGLE*> tmp3(n3->
get_id(),tri);
411 if (etape<9)
return OK;
412 affiche((
char*)
" MAILLAGE 2D");
421 std::multimap<unsigned long,BLOC_MAILLE_2D*,std::less <unsigned long> >::iterator it=
lstb2d.begin();
430 double uv[2],uv1[2],uv2[2],uv3[2];
431 double xyz1[3],xyz2[3],xyz3[3];
470 double eps=(1./
sqrt(metrique[0])*1e-6);
492 if ((nor*normal)<0.) sensidentique=0;
493 int nbtri=b2d->
lst.size();
496 for (
int i=0;i<nbtri;i++)
502 double xyz1[3],xy2[3],xyz3[3];
510 if (sensidentique==1)
514 lsttricontraint.
ajouter(nvtri);
526 if (i!=0) sprintf(mess,
"\033[1A\033[K Face %i identificateur %lu",i,face->
get_id());
527 else sprintf(mess,
" Face %i identificateur %lu",i,face->
get_id());
530 m2d.
maille(face,NULL,&(lsttricontraint));
531 int nbtricon=lsttricontraint.
get_nb();
532 for (
int i=0;i<nbtricon;i++)
545 std::multimap<unsigned long,BLOC_MAILLE_2D*,std::less <unsigned long> >::iterator itfin2=
lstb2d.begin();
546 while (itfin2!=
lstb2d.end())
548 delete (*itfin2).second;
552 if (etape<10)
return OK;
553 affiche((
char*)
" Destruction autour des nouvelles faces");
555 LISTE_MG_TRIANGLE::iterator itnvtri;
567 if (etape<11)
return OK;
568 affiche((
char*)
" Creation des blocs de maille 3D");
570 for (
int i=0;i<nbvolume;i++)
572 std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> > lsttet;
591 std::pair<unsigned long,MG_TETRA*> tmp(n1->
get_id(),tet);
593 std::pair<unsigned long,MG_TETRA*> tmp2(n2->
get_id(),tet);
595 std::pair<unsigned long,MG_TETRA*> tmp3(n3->
get_id(),tet);
597 std::pair<unsigned long,MG_TETRA*> tmp4(n4->
get_id(),tet);
605 if (etape<12)
return OK;
606 affiche((
char*)
" MAILLEUR 3D");
608 for (
int i=0;i<nbvolume;i++)
612 std::multimap<unsigned long,BLOC_MAILLE_3D*,std::less <unsigned long> >::iterator it=
lstb3d.begin();
622 double xyz1[3],xyz2[3],xyz3[3],xyz4[3],xyz[3];
627 xyz[0]=0.25*(xyz1[0]+xyz2[0]+xyz3[0]+xyz4[0]);
628 xyz[1]=0.25*(xyz1[1]+xyz2[1]+xyz3[1]+xyz4[1]);
629 xyz[2]=0.25*(xyz1[2]+xyz2[2]+xyz3[2]+xyz4[2]);
633 int nbtet=b3d->
lst.size();
636 for (
int j=0;j<nbtet;j++)
643 double xyz1[3],xy2[3],xyz3[3],xyz4[3];
653 lsttetcontraint.
ajouter(nvtet);
666 sprintf(mess,
" Volume %i identificateur %lu",i,vol->
get_id());
669 m3d.
maille(vol,NULL,&(lsttetcontraint));
670 int nbtetcon=lsttetcontraint.
get_nb();
671 for (
int i=0;i<nbtetcon;i++)
686 std::multimap<unsigned long,BLOC_MAILLE_3D*,std::less <unsigned long> >::iterator itfin3=
lstb3d.begin();
687 while (itfin3!=
lstb3d.end())
689 delete (*itfin3).second;
692 if (etape<13)
return OK;
693 affiche((
char*)
" Sauvegarde des correspondances");
694 LISTE_MG_NOEUD::iterator itnoeud;
700 LISTE_MG_TETRA::iterator ittet;
722 LISTE_MG_NOEUD::iterator it;
725 noeud->change_nouveau_numero(
CONSERVE);
743 xyz[0]=vecnoeud2.
get_x();
744 xyz[1]=vecnoeud2.
get_y();
745 xyz[2]=vecnoeud2.
get_z();
752 xyz[0]=vecnoeud2.
get_x();
753 xyz[1]=vecnoeud2.
get_y();
754 xyz[2]=vecnoeud2.
get_z();
763 xyz[0]=vecnoeud3.
get_x();
764 xyz[1]=vecnoeud3.
get_y();
765 xyz[2]=vecnoeud3.
get_z();
766 direction=vecnoeud2-vecnoeud1;
776 OT_VECTEUR_3D vecnoeud=0.3333333333333333*(vecnoeud1+vecnoeud2+vecnoeud3);
778 xyz[0]=vecnoeud4.
get_x();
779 xyz[1]=vecnoeud4.
get_y();
780 xyz[2]=vecnoeud4.
get_z();
781 distmin=std::max((vecnoeud-vecnoeud1).get_longueur(),(vecnoeud-vecnoeud2).get_longueur());
782 distmin=std::max((vecnoeud-vecnoeud3).get_longueur(),distmin);
783 direction=(vecnoeud3-vecnoeud1)&(vecnoeud2-vecnoeud1);
796 distmin=distmin*alpha;
797 LISTE_MG_NOEUD::iterator it;
800 double *xyztmp=noeud->get_coord();
807 distance=std::max(1.5*Ea,1.5*Eb);
808 distance=std::max(distance,2.6*fabs(Ea-Eb));
813 double sinus=
sqrt(1-cosinus*cosinus);
818 double delta=sinus*sinus+4.*distance*distance/distmin/distmin*cosinus*cosinus;
819 facteur=(-sinus+
sqrt(delta))/2./distance/cosinus/cosinus*distmin*distmin;
826 if (sinus>-0.0000001)
828 double cosinus=
sqrt(1-sinus*sinus);
833 double delta=sinus*sinus+4*distance*distance/distmin/distmin*cosinus*cosinus;
834 facteur=(-sinus+
sqrt(delta))/2./distance/cosinus/cosinus*distmin*distmin;
842 noeud->change_nouveau_numero(
DETRUIT);
938 for (
int i=0;i<nbvolume;i++)
942 for (
int j=0;j<nbco;j++)
946 for (
int k=0;k<nbface;k++)
950 for (
int l=0;l<nbseg;l++)
968 std::pair<unsigned long,CORRESPONDANCENOEUD> tmp(n1->
get_id(),corr);
975 std::map<unsigned long,CORRESPONDANCENOEUD,std::less<unsigned long> >::iterator j=
lstcorrnoeud.find(n1->
get_id());
977 n2=(*j).second.noeudmod;
998 xyz2[0]=nvpt.
get_x();
999 xyz2[1]=nvpt.
get_y();
1000 xyz2[2]=nvpt.
get_z();
1006 while (lst.size()>0)
1008 std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> >::iterator it=lst.begin();
1013 std::pair<unsigned long,BLOC_MAILLE_1D*> tmp(b1d->
get_id(),b1d);
1015 b1d->
lst.push_back(seg);
1018 sprintf(mess,
" Arete %lu , Bloc %d",arete->
get_id(),(
int)
lstb1d.size());
1021 while (num!=b1d->
lst.size())
1029 b1d->
lst.push_back(seg);
1039 b1d->
lst.push_back(seg);
1046 sprintf(mess,
" Segment %d ",(
int)b1d->
lst.size());
1053 while (lst.size()>0)
1055 std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> >::iterator it=lst.begin();
1060 std::pair<unsigned long,BLOC_MAILLE_2D*> tmp(b2d->
get_id(),b2d);
1062 b2d->
lst.push_back(tri);
1065 sprintf(mess,
" Face %lu , Bloc %d",face->
get_id(),(
int)
lstb2d.size());
1068 while (num!=b2d->
lst.size())
1076 b2d->
lst.push_back(tri);
1086 b2d->
lst.push_back(tri);
1096 b2d->
lst.push_back(tri);
1103 sprintf(mess,
" Triangle %d ",(
int)b2d->
lst.size());
1110 while (lst.size()>0)
1112 std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> >::iterator it=lst.begin();
1116 std::pair<unsigned long,BLOC_MAILLE_3D*> tmp(b3d->
get_id(),b3d);
1118 b3d->
lst.push_back(tet);
1121 sprintf(mess,
" Volume %lu , Bloc %d",vol->
get_id(),(
int)
lstb3d.size());
1124 while (num!=b3d->
lst.size())
1132 b3d->
lst.push_back(tet);
1142 b3d->
lst.push_back(tet);
1152 b3d->
lst.push_back(tet);
1162 b3d->
lst.push_back(tet);
1169 sprintf(mess,
" Tetra %d ",(
int)b3d->
lst.size());
1178 unsigned long id=no->
get_id();
1179 std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> >::iterator it=lst.find(
id);
1191 unsigned long id=no->
get_id();
1192 std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> >::iterator it=lst.find(
id);
1204 unsigned long id=no->
get_id();
1205 std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> >::iterator it=lst.find(
id);
1218 std::multimap<double,double,std::less<double> > intersection;
1235 vecteur_dir=directeur;
1240 double ps1=n*directeur;
1241 if (fabs(ps1)<1e-6) i++;
1245 intersection.clear();
1258 std::pair<double,double> tmp(t,t);
1259 intersection.insert(tmp);
1266 std::multimap<double,double,std::less <double> >::iterator it=intersection.begin();
1268 double tavant=1e308;
1269 while (it!=intersection.end())
1271 if ((*it).second<0.)
1273 double t=(*it).second;
1280 if (nbinterneg%2==1)
return 1;
1296 double eps=0.333333333333*(g1.
diff()+g2.
diff()+g3.
diff());
1303 double eps2=0.333333333333*(g1.
diff()+g2.
diff()+g3b.
diff());
1304 eps2=18.*eps2*eps2*eps2*1e-6;
1327 double alpha1=n1n4*g1b;
1328 double alpha2=n1n4*g2b;
1329 double alpha3=-(n1n4*g3b);
1330 double alpha4=1-alpha1-alpha2;
1331 double eps=0.000001;
1332 if ((alpha1>-eps) && (alpha1<1.+eps))
1333 if ((alpha2>-eps) && (alpha2<1.+eps))
1334 if ((alpha4>-eps) && (alpha4<1.+eps)) {