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)) {
std::vector< MG_SEGMENT * > lst
unsigned long get_id(void)
std::vector< MG_TRIANGLE * > lst
unsigned long get_id(void)
unsigned long get_id(void)
std::vector< MG_TETRA * > lst
virtual void evaluer(double *param, double *resultat)=0
virtual BOITE_3D get_boite_3D(void)=0
fonction_affiche * affiche2
virtual void active_affichage(fonction_affiche *fonc)
virtual void affiche(char *mess)
int maille(MG_GROUPE_TOPOLOGIQUE *mggt=NULL)
virtual int maille(MG_GROUPE_TOPOLOGIQUE *mggt=NULL)
virtual double get_tmin(void)
virtual void deriver(double t, double *xyz)
virtual void evaluer(double t, double *xyz)
virtual class MG_COURBE * get_courbe(void)
virtual void inverser(double &t, double *xyz, double precision=1e-6)
virtual MG_FACE * get_face(void)
virtual MG_COFACE * get_mg_coface(int num)
virtual int get_nb_mg_coface(void)
virtual int est_periodique(void)=0
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > ¶m)=0
virtual double get_periode(void)=0
virtual int get_nouveau_numero(void)
virtual void change_nouveau_numero(int num)
virtual int get_origine(void)
virtual TPL_SET< MG_ELEMENT_MAILLAGE * > * get_lien_maillage(void)
virtual int get_dimension(void)=0
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
virtual void evaluer(double *uv, double *xyz)
virtual MG_SURFACE * get_surface(void)
virtual void calcul_normale_unitaire(double *uv, double *normale)
double calcule_distance_contour_face_uv(double *uv, class MG_FACE *face)
unsigned int get_nb_mg_arete(void)
unsigned int get_nb_mg_face(void)
MG_ARETE * get_mg_arete(unsigned int num)
MG_FACE * get_mg_face(unsigned int num)
MG_FACE * get_mg_faceid(unsigned long num)
MG_VOLUME * get_mg_volume(unsigned int num)
MG_SOMMET * get_mg_sommetid(unsigned long num)
unsigned int get_nb_mg_volume(void)
MG_VOLUME * get_mg_volumeid(unsigned long num)
MG_GEOMETRIE * get_mg_geometrie(void)
MG_TETRA * get_premier_tetra(LISTE_MG_TETRA::iterator &it)
MG_TRIANGLE * get_mg_triangleid(unsigned long num)
MG_TETRA * get_suivant_tetra(LISTE_MG_TETRA::iterator &it)
MG_SEGMENT * get_premier_segment(LISTE_MG_SEGMENT::iterator &)
MG_TRIANGLE * get_premier_triangle(LISTE_MG_TRIANGLE::iterator &it)
MG_NOEUD * get_mg_noeudid(unsigned long num)
MG_TRIANGLE * get_suivant_triangle(LISTE_MG_TRIANGLE::iterator &it)
MG_NOEUD * get_premier_noeud(LISTE_MG_NOEUD::iterator &it)
MG_TETRA * get_mg_tetraid(unsigned long num)
MG_SEGMENT * get_suivant_segment(LISTE_MG_SEGMENT::iterator &)
MG_NOEUD * get_suivant_noeud(LISTE_MG_NOEUD::iterator &it)
MG_SEGMENT * get_mg_segmentid(unsigned long num)
MG_SEGMENT * ajouter_mg_segment(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, int origine, double longue=0.0, unsigned long num=0)
MG_NOEUD * ajouter_mg_noeud(MG_ELEMENT_TOPOLOGIQUE *topo, double xx, double yy, double zz, int origine, unsigned long num=0)
virtual double * get_coord(void)
virtual double get_z(void)
virtual double get_y(void)
virtual double get_x(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > ¶m)=0
virtual int est_periodique_u(void)=0
virtual double get_periode_u(void)=0
virtual int est_periodique_v(void)=0
virtual double get_periode_v(void)=0
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud4(void)
virtual MG_NOEUD * get_noeud3(void)
virtual MG_NOEUD * get_noeud3(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_COQUILLE * get_mg_coquille(int num)
virtual int get_nb_mg_coquille(void)
static int egal(double a, double b, double eps)
double decalage_parametre_v(double par, double dpar)
double calcul_decalage_parametre_v(double par)
double calcul_decalage_parametre_u(double par)
double decalage_parametre_u(double par, double dpar)
virtual double get_z(void) const
virtual double diff(void)
virtual double get_longueur(void) const
virtual double get_y(void) const
virtual double get_x(void) const
MG_TRIANGLE * trouve_triangle(std::multimap< unsigned long, MG_TRIANGLE *, std::less< unsigned long > > &lst, MG_NOEUD *no)
void cree_liste_frontiere(MG_MAILLAGE *mai)
REMAILLEUR(class MG_GESTIONNAIRE *gentier, MG_GESTIONNAIRE *gbloc, class MG_GEOMETRIE *geo1, MG_GEOMETRIE *geo2, class FCT_TAILLE *fct_taille1, class FCT_TAILLE *fct_taille2, MG_MAILLAGE *mori, MG_MAILLAGE *mmodi, VCT_COMPARAISON_RESULTAT &cmp)
MG_NOEUD * get_liste_correspondance(MG_NOEUD *n1)
void initialise_octree(void)
std::multimap< unsigned long, class BLOC_MAILLE_1D *, std::less< unsigned long > > lstb1d
class FCT_TAILLE * carteori
VCT_COMPARAISON_RESULTAT & rescmp
TPL_OCTREE_FCT< MG_NOEUD *, FCT_TAILLE > * octree
class MG_MAILLAGE * maimodifie
void transfert_coord(double *xyz, double *xyz2)
MG_NOEUD * transfert_noeud(MG_NOEUD *no, MG_ELEMENT_TOPOLOGIQUE *ele)
void cree_bloc_maille(std::multimap< unsigned long, MG_SEGMENT *, std::less< unsigned long > > &lst, MG_ARETE *arete)
MG_TETRA * trouve_tetra(std::multimap< unsigned long, MG_TETRA *, std::less< unsigned long > > &lst, MG_NOEUD *no)
void ajouter_liste_correspondance_noeud(MG_NOEUD *n1, MG_NOEUD *n2)
int point_appartient_volume(double *xyz, int numvol)
TPL_LISTE_ENTITE< MG_TRIANGLE * > * lsttrifront
class MG_GEOMETRIE * geoorigine
MG_SEGMENT * trouve_segment(std::multimap< unsigned long, MG_SEGMENT *, std::less< unsigned long > > &lst, MG_NOEUD *no)
std::multimap< unsigned long, class BLOC_MAILLE_3D *, std::less< unsigned long > > lstb3d
class FCT_TAILLE * cartemod
std::map< unsigned long, CORRESPONDANCENOEUD > lstcorrnoeud
void detruit_noeud(MG_ELEMENT_MAILLAGE *elebase, double distance, int type=0)
int inter_droite_triangle(double *xyz, double *dir, MG_TRIANGLE *tri, double *t)
class MG_GEOMETRIE * geomodifie
class MG_MAILLAGE * maiorigine
std::multimap< unsigned long, class BLOC_MAILLE_2D *, std::less< unsigned long > > lstb2d
virtual void supprimer(X x)
virtual void ajouter(X x)
virtual X get_premier(ITERATEUR &it)
virtual X get_suivant(ITERATEUR &it)
virtual void ajouter(X x)
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
virtual void initialiser(B &fonction, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
virtual void inserer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
virtual void rechercher(BOITE_3D &boite, TPL_MAP_ENTITE< A > &liste_entite_trouve, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
X get_premier(ITERATEUR &it)
X get_suivant(ITERATEUR &it)
OT_VECTEUR_3D change_coord_mod_ori(OT_VECTEUR_3D vec)
MG_ELEMENT_TOPOLOGIQUE * get_liste_topologie(int type, int num)
int get_nb_liste_topologie(int type)
void ajouter_correspondance(unsigned long idorigine, unsigned long idmodifie)
unsigned long get_liste_correspondance_modifie(unsigned long id)
OT_VECTEUR_3D change_coord_ori_mod(OT_VECTEUR_3D vec)
double2 sqrt(double2 &val)