 |
MAGiC
V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
|
Aller à la documentation de ce fichier.
34 MAILLEUR_STL::MAILLEUR_STL(
MG_MAILLAGE* maiori,
MG_GESTIONNAIRE* gt,
FCT_TAILLE* carte,
double limite,
double angle1,
double angle2,
char * nomfichierpoint):
MAILLEUR(false),maiin(maiori),gest(gt),metrique(carte),limite_discretisation(limite),angle_arete(angle1),angle_limite(angle2),pas(4),nx(25),ny(25),nz(25),qualmaxaopt(0.5),nbcoucheopt(1)
37 if (nomfichierpoint!=NULL) (
fichierpoint,nomfichierpoint);
40 MAILLEUR_STL::MAILLEUR_STL(
MAILLEUR_STL& mdd):
MAILLEUR(mdd),maiin(mdd.maiin),mai(mdd.mai),metrique(mdd.metrique),pas(mdd.pas),angle_arete(mdd.angle_arete),angle_limite(mdd.angle_limite),limite_discretisation(mdd.limite_discretisation),nx(mdd.nx),ny(mdd.ny),nz(mdd.nz),qualmaxaopt(mdd.qualmaxaopt),nbcoucheopt(mdd.nbcoucheopt)
57 affiche((
char*)
" Parametre du mailleur");
61 sprintf(mess,(
char*)
" Ratio limite angle arete = %f",
angle_arete);
63 sprintf(mess,(
char*)
" Ratio limite angle de la cavité de Delaunay = %f",
angle_limite);
65 affiche((
char*)
" Duplication du maillage original");
67 affiche((
char*)
" Vérification de la conformité du maillage");
69 affiche((
char*)
" Adaptation de la carte de taille");
71 affiche((
char*)
" Determination des arêtes");
73 affiche((
char*)
" Prepartion de la projection");
77 affiche((
char*)
" Optimisation de maillage");
81 sprintf(mess,
" Passe numero %d",i+1);
108 for (
int j=0;j<3;j++)
134 int nblistavant=listtriverifie.
get_nb();
136 if (listtriverifie.
get_nb()!=nblistavant)
137 listtriverifieseq.
ajouter(tri2);
142 if (nbcorrection!=0) sprintf(mess,
" Inversion de triangle %d",nbcorrection);
143 else sprintf(mess,
" Maillage conforme");
151 std::multimap<double,MG_TRIANGLE*> lsttriaopt;
152 LISTE_MG_TRIANGLE::iterator it;
155 double val=
OPERATEUR::qualite_triangle(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord(),tri->get_noeud3()->get_coord());
156 lsttriaopt.insert(std::pair<double,MG_TRIANGLE*>(val,tri));
157 tri->change_solution(val);
167 double crit1,crit2,crit3;
179 {critmax=crit1;nvx=x1;nvy=y1;nvz=z1;nno=tri->
get_noeud1();}
182 {critmax=crit2;nvx=x2;nvy=y2;nvz=z2;nno=tri->
get_noeud2();}
185 {critmax=crit3;nvx=x3;nvy=y3;nvz=z3;nno=tri->
get_noeud3();}
186 if (critmax>lsttriaopt.begin()->first)
199 std::multimap<double,MG_TRIANGLE*>:: iterator it=lsttriaopt.lower_bound(tri->
get_solution());
203 else if (it->second==tri) trouve=1;
205 if (trouve==1) lsttriaopt.erase(it);
211 else lsttriaopt.erase(lsttriaopt.begin());
220 sprintf(chaine,
" %d iterations effectuées",compteur_iter);
222 return(compteur_iter);
228 LISTE_MG_SEGMENT::iterator it;
229 std::vector<double> lstraf;
236 double *xyz=seg->get_noeud1()->get_coord();
237 lstraf.push_back(xyz[0]);
238 lstraf.push_back(xyz[1]);
239 lstraf.push_back(xyz[2]);
241 xyz=seg->get_noeud2()->get_coord();
242 lstraf.push_back(xyz[0]);
243 lstraf.push_back(xyz[1]);
244 lstraf.push_back(xyz[2]);
259 LISTE_MG_NOEUD::iterator it;
270 LISTE_MG_TRIANGLE::iterator itt;
278 LISTE_MG_SEGMENT::iterator it;
279 int nbsegmentarete=0;
282 int nbtri=seg->get_lien_triangle()->get_nb();
283 if ((nbtri>2) || (nbtri<1))
286 sprintf(chaine,
" Maillage STL invalide : segment à %d voisin : noeud 1 %lu noeud 2 %lu ",nbtri,seg->get_noeud1()->get_id(),seg->get_noeud2()->get_id());
299 MG_TRIANGLE *tri1=seg->get_lien_triangle()->get(0);
300 MG_TRIANGLE *tri2=seg->get_lien_triangle()->get(1);
313 sprintf(mess,(
char*)
" Nombre de segments aretes = %d",nbsegmentarete);
320 LISTE_MG_SEGMENT::iterator it;
323 int nbtri=seg->get_lien_triangle()->get_nb();
325 affiche((
char*)
" **** erreur **** un triangle n'a pas deux voisins");
326 MG_TRIANGLE *tri1=seg->get_lien_triangle()->get(0);
327 MG_TRIANGLE *tri2=seg->get_lien_triangle()->get(1);
339 affiche((
char*)
" **** erreur **** un segment n'est pas pris dans chaque sens pour deux mailles vosines");
348 affiche((
char*)
" **** erreur **** deux triangles voisins n'ont pas la normal dans le meme sens");
361 double xyz1[3],xyz2[3];
363 if (tri2!=NULL) tri2->
normal(xyz2);
368 normale=0.5*nor1+0.5*nor2;
386 if (tri2!=NULL) listuniquetri.
ajouter(tri2);
388 else listuniquetri.
ajouter(tri);
389 for (
int i=0;i<listuniquetri.
get_nb();i++)
392 for (
int cote=1;cote<4;cote++)
413 for (
int i=0;i<listuniquetri.
get_nb();i++)
416 std::map<unsigned long,std::pair<MG_SEGMENT*,int> >::iterator ptmp;
418 ptmp=lstsegment.find(seg->
get_id());
419 if (ptmp==lstsegment.end()) lstsegment[seg->
get_id()]=std::pair<MG_SEGMENT*,int>(seg,1);
420 else ptmp->second.second=ptmp->second.second+1;
422 ptmp=lstsegment.find(seg->
get_id());
423 if (ptmp==lstsegment.end()) lstsegment[seg->
get_id()]=std::pair<MG_SEGMENT*,int>(seg,1);
424 else ptmp->second.second=ptmp->second.second+1;
426 ptmp=lstsegment.find(seg->
get_id());
427 if (ptmp==lstsegment.end()) lstsegment[seg->
get_id()]=std::pair<MG_SEGMENT*,int>(seg,1);
428 else ptmp->second.second=ptmp->second.second+1;
522 if (val<critdep) critdep=val;
544 double critencours=critdep;
546 while (converge==
false)
552 double critcourant=1.;
563 if (val<critcourant) critcourant=val;
565 if (critencours>critcourant)
576 critencours=critcourant;
585 void MAILLEUR_STL::maillage_et_segadiscretiser_update(
MG_SEGMENT* segbase,
double x,
double y,
double z,
OT_VECTEUR_3D normale,
TPL_LISTE_ENTITE<MG_TRIANGLE *>& listuniquetri, std::map<
unsigned long, std::pair<MG_SEGMENT *, int> >& lstsegment,
TPL_LISTE_ENTITE<MG_TRIANGLE *>& listnouvtri,
bool contraint)
601 for (std::map<
unsigned long,std::pair<MG_SEGMENT*,int> >::iterator ptmp=lstsegment.begin();ptmp!=lstsegment.end();ptmp++)
603 if (ptmp->second.second==2)
605 if (ptmp->second.second==1)
606 if (ptmp->second.first==segbase)
609 for (std::map<
unsigned long,std::pair<MG_SEGMENT*,int> >::iterator ptmp=lstsegment.begin();ptmp!=lstsegment.end();ptmp++)
610 if (ptmp->second.second==1)
613 bool construit=
false;
614 if (segbase==NULL) construit=
true;
640 if (mgsegment1==NULL)
645 if (mgsegment2==NULL)
648 if ((no2==nobase1)|| (no2==nobase2))
653 if (mgsegment3==NULL)
656 if ((no1==nobase1)|| (no1==nobase2))
672 for (
int i=0;i<listuniquetri.
get_nb();i++)
688 LISTE_MG_NOEUD::iterator itn;
690 boiteglobale=boiteglobale+no->get_boite_3D();
694 LISTE_MG_TRIANGLE::iterator itt;
700 fgets(chaine,500,in);
701 sscanf(chaine,
"%d",&nbpointainserer);
702 for (
int i=0;i<nbpointainserer;i++)
706 fgets(chaine,500,in);
707 sscanf(chaine,
"%lf %lf %lf",&x,&y,&z);
714 if (lsttrouve.
get_nb()>0) sortie=
true;
715 if (dist>100) sortie=
true;
718 while (sortie==
false);
725 double *xyz2=tri->get_noeud2()->get_coord();
726 double *xyz3=tri->get_noeud3()->get_coord();
743 sprintf(message,
"\033[1;31m Le point %lf %lf %lf n'est pas sur le maillage de départ\033[1;33m",x,y,z);
752 std::map<unsigned long,std::pair<MG_SEGMENT*,int> > lstsegmentetoile;
753 calcul_etoile(segbase,tribase,x,y,z,normale,listtrietoile,lstsegmentetoile);
754 for (
int i=0;i<listtrietoile.
get_nb();i++)
757 for (
int i=0;i<listnvtri.
get_nb();i++)
776 std::map<unsigned long,std::pair<MG_SEGMENT*,int> > lstsegmentetoile;
778 calcul_etoile(seg,NULL,x,y,z,normale,listtrietoile,lstsegmentetoile);
787 sprintf(chaine,
" %d iterations effectuées",compteur_iter);
839 double xyz[3]={x,y,z};
890 if (tri1==tri)
return tri2;
905 std::multimap<double,MG_SEGMENT*,std::greater<double > >:: iterator it=
lstsegadiscretiser.lower_bound(l);
906 while (it->second!=seg)
virtual class BOITE_3D get_boite_3D(void)
virtual bool respecte_delaunay(double x, double y, double z, MG_TRIANGLE *tri)
virtual X get_premier(ITERATEUR &it)
virtual void supprimer_seg_a_discretiser(MG_SEGMENT *seg)
virtual MG_SEGMENT * get_segment1(void)
virtual int optimise_maillage(void)
MG_NOEUD * get_premier_noeud(LISTE_MG_NOEUD::iterator &it)
virtual void change_nxnynz(int nvx, int nvy, int nvz)
virtual void calcul_nouveau_noeud(MG_SEGMENT *seg, double &x, double &y, double &z, OT_VECTEUR_3D &normale)
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)
TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > octree
virtual void construit(void)
virtual MG_NOEUD * get_noeud2(void)
virtual void valide_maillage(void)
virtual double get_z(void)
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
virtual void verification_conformite(void)
unsigned int get_nb_mg_triangle(void)
virtual void inserer(A a)
virtual void change_nbpasseoptimisation(int nb)
virtual MG_SEGMENT * get_segment2(void)
virtual double get_angle_arete(void)
static int compare_etat_triangle(int etat, int valeur)
virtual void affiche(char *mess)
virtual void supprimer(A a)
virtual double get_x(void) const
virtual MG_SEGMENT * get_segment3(void)
virtual void change_z(double zz)
void transpose(OT_MATRICE_3D &res) const
MG_SEGMENT * get_premier_segment(LISTE_MG_SEGMENT::iterator &)
virtual void projete_point_sur_triangulation(double x, double y, double z, double &nvx, double &nvy, double &nvz)
virtual void change_ny(int val)
virtual void change_nx(int val)
virtual int maille(class MG_GROUPE_TOPOLOGIQUE *mggt=NULL)
MAILLEUR_STL(MG_MAILLAGE *maiori, MG_GESTIONNAIRE *gt, FCT_TAILLE *carte, double limite=1.2, double angle1=M_PI/7., double angle2=M_PI/9, char *nomfichierpoint=NULL)
virtual void inserer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
virtual int est_dans_la_liste(X x)
virtual void change_y(double yy)
MG_GESTIONNAIRE * gesttmp
MG_NOEUD * get_mg_noeud(unsigned int num)
virtual void maillage_et_segadiscretiser_update(MG_SEGMENT *segbase, double x, double y, double z, OT_VECTEUR_3D normale, TPL_LISTE_ENTITE< MG_TRIANGLE * > &listuniquetri, std::map< unsigned long, std::pair< MG_SEGMENT *, int > > &lstsegment, TPL_LISTE_ENTITE< MG_TRIANGLE * > &listnouvtri, bool contraint)
virtual double calcul_distance_metrique(class MG_SEGMENT *seg, int pas=32)
virtual MG_TRIANGLE * get_voisin(MG_TRIANGLE *tri, int cote)
virtual void ajouter_seg_a_discretiser(MG_SEGMENT *seg)
virtual void change_x(double xx)
MG_TRIANGLE * get_premier_triangle(LISTE_MG_TRIANGLE::iterator &it)
virtual void change_distance_metrique(double val)
virtual double get_solution(int num=0)
MG_TRIANGLE * ajouter_mg_triangle(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, int origine, unsigned long num=0)
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
virtual MG_NOEUD * get_noeud1(void)
int supprimer_mg_triangleid(unsigned long num)
virtual int bouge_point(MG_NOEUD *mg_noeud, double &crit, double &x, double &y, double &z)
virtual void change_qualmaxaoptimiser(double val)
virtual void rechercher(BOITE_3D bt, TPL_MAP_ENTITE< A > &liste_entite_trouve)
virtual double * get_xyz(void)
std::multimap< double, MG_SEGMENT *, std::greater< double > > lstsegadiscretiser
MG_SEGMENT * get_suivant_segment(LISTE_MG_SEGMENT::iterator &)
virtual void rechercher(BOITE_3D &boite, TPL_MAP_ENTITE< A > &liste_entite_trouve, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
virtual void ajouter(X x)
virtual double * get_coord(void)
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
@ TRIANGULATION_ARETEORIGINE
virtual void adapte_carte(void)
virtual MG_NOEUD * get_noeud2(void)
virtual double get_y(void) const
virtual bool fichierpointexiste(void)
virtual double get_x(void)
MG_SEGMENT * get_mg_segment(unsigned int num)
virtual void ajouter(X x)
void projetedansletriangle(MG_TRIANGLE *tri, double x, double y, double z, double &xx, double &yy, double &zz)
virtual void determine_arete(void)
virtual MG_NOEUD * get_noeud1(void)
MG_TRIANGLE * get_mg_triangle(unsigned int num)
double2 sqrt(double2 &val)
virtual bool get_distance_metrique(double *l)
static double qualite_triangle(double *noeud1, double *noeud2, double *noeud3)
virtual MG_NOEUD * get_noeud3(void)
virtual double get_z(void) const
virtual void inverse_sens(void)
static int estdansletriangle(double *xyz1, double *xyz2, double *xyz3, double x, double y, double z)
MG_TRIANGLE * get_suivant_triangle(LISTE_MG_TRIANGLE::iterator &it)
virtual double get_longueur(void) const
virtual void prepare_projection(void)
virtual void normal(double *n)
virtual void change_angle_arete(double val)
virtual void change_fichierpoint(char *nom)
virtual void calcul_etoile(MG_SEGMENT *seg, MG_TRIANGLE *tri, double &x, double &y, double &z, OT_VECTEUR_3D &normale, TPL_LISTE_ENTITE< MG_TRIANGLE * > &listuniquetri, std::map< unsigned long, std::pair< MG_SEGMENT *, int > > &lstsegment)
void change_grosseur(double f)
virtual int get_origine(void)
virtual X get_suivant(ITERATEUR &it)
double2 cos(double2 &val)
virtual void initialiser(double xmin, double ymin, double zmin, double xmax, double ymax, double zmax, int nb_pasx, int nb_pasy, int nb_pasz)
double limite_discretisation
virtual void cree_maillage(void)
virtual void initialiser(TPL_LISTE_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
MG_NOEUD * get_suivant_noeud(LISTE_MG_NOEUD::iterator &it)
virtual void change_pas(int val)
virtual void evaluer(double *param, double *resultat)=0
virtual void change_nz(int val)
virtual double get_y(void)
MG_NOEUD * ajouter_mg_noeud(MG_ELEMENT_TOPOLOGIQUE *topo, double xx, double yy, double zz, int origine, unsigned long num=0)
MG_MAILLAGE * detacher(MG_GESTIONNAIRE *gest, MG_ELEMENT_TOPOLOGIQUE *topo=NULL)