55 return get_angle_par_noeud<MG_NOEUD*>(noeud1,noeud2,noeud3,noeud4,noeud5,noeud6);
119 double det=
mat.get_determinant();
125 proj[0]=(1.-xsi-eta)*noeud1->
get_x()+xsi*noeud2->
get_x()+eta*noeud3->
get_x();
126 proj[1]=(1.-xsi-eta)*noeud1->
get_y()+xsi*noeud2->
get_y()+eta*noeud3->
get_y();
127 proj[2]=(1.-xsi-eta)*noeud1->
get_z()+xsi*noeud2->
get_z()+eta*noeud3->
get_z();
131 double ps=n1n4*n1nproj;
136 double angle=
acos(ps);
137 if ((xsi<0.) || (eta<0.) ) angle=angle+M_PI/2.;
138 if (psi<0.) angle=2*M_PI-angle;
149 liste_intersection.
vide();
164 int nb_liste=liste.
get_nb();
165 for (
int i=0;i<nb_liste;i++)
190 int nb_inter=liste_intersection.
get_nb();
254 double lg_tet_ideal=fabs(vec*da*ft->
get_ifail()*
sqrt(3./2.));
255 double vol_ideal=
sqrt(2.)/12.*lg_tet_ideal*lg_tet_ideal*lg_tet_ideal;
256 if (vol<0.1*vol_ideal)
258 if ((vol1>0.) && (vol1<0.1*vol_ideal))
260 if ((vol2>0.) && (vol2<0.1*vol_ideal))
262 if ((vol3>0.) && (vol3<0.1*vol_ideal))
264 if ((vol4>0.) && (vol4<0.1*vol_ideal))
311 if (triangle!=NULL)
return triangle;
328 if (segment!=NULL)
return NULL;
368 double volume=pvec*da;
369 volume=fabs(volume)/3.;
428 double xyzg[3]={0.333333333333*(xyz1[0]+xyz2[0]+xyz3[0]),0.333333333333*(xyz1[1]+xyz2[1]+xyz3[1]),0.333333333333*(xyz1[2]+xyz2[2]+xyz3[2])};
432 xyz4[0]=xyzg[0]+hauteur*normal.
get_x();
433 xyz4[1]=xyzg[1]+hauteur*normal.
get_y();
434 xyz4[2]=xyzg[2]+hauteur*normal.
get_z();
441 double l=0.333333333333333*(l1+l2+l3);
443 longueur_desiree=longueur_desiree/ft->
get_ifail();
446 OT_VECTEUR_3D hauteurajustee(xyzg[0]-xyz4[0],xyzg[1]-xyz4[1],xyzg[2]-xyz4[2]);
452 int nb_liste=liste_front.
get_nb();
455 for (
int i=0;i<nb_liste;i++)
458 for (
int j=0;j<3;j++)
466 OT_VECTEUR_3D vec(xyz_tmp[0]-xyzg[0],xyz_tmp[1]-xyzg[1],xyz_tmp[2]-xyzg[2]);
467 double eps=0.333333333333333*(vec.
diff()+n1n2.
diff()+n1n3.
diff());
469 if (vec*normalnonnorme<eps)
continue;
480 if (dismin<hauteur) liste_front_proche.
ajouter(ft2);
486 if (dis2<longueur_desiree*1.5)
489 if (noeudref!=noeud3)
495 int nb_proche=liste_front_proche.
get_nb();
496 int nb_cas=liste_cas.size();
499 for (
int i=0;i<nb_proche;i++)
503 for (
int j=0;j<nb_cas;j++)
505 MG_NOEUD* casnoeud=liste_cas[j]->mgnoeud;
516 if (noeudtmp!=noeud3) liste_noeud.
ajouter(noeudtmp);
520 if (noeudtmp!=noeud3) liste_noeud.
ajouter(noeudtmp);
524 if (noeudtmp!=noeud3) liste_noeud.
ajouter(noeudtmp);
531 liste_noeud.
ajouter(nouveau_noeud);
553 if ((eta>-eps) && (xsi>-eps) && (eta+xsi<1.0+eps))
681 int nb_liste1=liste_de_front.
get_nb();
682 for (
int i=0;i<nb_liste1;i++)
683 if (liste_de_front.
get(i)!=NULL)
685 int nb_liste2=liste_de_front2.
get_nb();
686 for (
int i=0;i<nb_liste2;i++)
694 for (
int k=0;k<4;k++)
707 for (
int i=0;i<nb_tet;i++)
768 vol=0.;tab[0]=0;tab[1]=0;tab[2]=0;tab[3]=0;
769 LISTE_MG_TETRA::iterator it;
773 double qual=
OPERATEUR::qualite_tetra(tet->get_noeud1()->get_coord(),tet->get_noeud2()->get_coord(),tet->get_noeud3()->get_coord(),tet->get_noeud4()->get_coord());
774 if (qual>=borne3) tab[3]++;
775 else if (qual>=borne2) tab[2]++;
776 else if (qual>=borne1) tab[1]++;
784 std::map<long,long,std::less<long> > lstcorrespondancenoeud;
785 int nbtet=lsttet->
get_nb();
786 for (
int i=0;i<nbtet;i++)
794 xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0]+xyz4[0])*0.25;
795 xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1]+xyz4[1])*0.25;
796 xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2]+xyz4[2])*0.25;
806 rayonrecherche=rayonrecherche*1.1;
820 int nbtrouve=liste_trouvee.
get_nb();
821 for (
int j=0;j<nbtrouve;j++)
823 if ((noeudref1!=NULL) && (noeudref2!=NULL) && (noeudref3!=NULL) && (noeudref4!=NULL) )
break;
832 for (
int k=0;k<nb;k++)
839 noeudref1=lstnoeud.
get(k);
848 for (
int k=0;k<nb;k++)
855 noeudref2=lstnoeud.
get(k);
864 for (
int k=0;k<nb;k++)
871 noeudref3=lstnoeud.
get(k);
880 for (
int k=0;k<nb;k++)
887 noeudref4=lstnoeud.
get(k);
901 lstcorrespondancenoeud.insert(tmp);
911 lstcorrespondancenoeud.insert(tmp);
921 lstcorrespondancenoeud.insert(tmp);
931 lstcorrespondancenoeud.insert(tmp);
1046 int nbtri=lsttri->
get_nb();
1047 for (
int i=0;i<nbtri;i++)
1054 xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0])/3.;
1055 xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1])/3.;
1056 xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2])/3.;
1064 rayonrecherche=rayonrecherche*1.1;
1069 int nbtrouve=liste_trouvee.
get_nb();
1070 for (
int j=0;j<nbtrouve;j++)
1077 int nb=lstnoeud.
get_nb();
1078 for (
int k=0;k<nb;k++)
1085 noeudref1=lstnoeud.
get(k);
1091 for (
int k=0;k<nb;k++)
1098 noeudref2=lstnoeud.
get(k);
1104 for (
int k=0;k<nb;k++)
1111 noeudref3=lstnoeud.
get(k);
1118 if (noeudref1==NULL)
1123 if (noeudref2==NULL)
1128 if (noeudref3==NULL)
virtual int valide_parametre(double *param)=0
virtual double calcul_volume_tetra_metrique(class MG_TETRA *tet)
virtual double calcul_distance_metrique(class MG_SEGMENT *seg, int pas=32)
virtual int ajuste_distance_metrique(double *xyz1, double *xyz2, double longueur_desiree, int pas=32)
virtual void etat_detruit(void)
virtual int get_etat(void)
virtual void etat_detruit(void)
virtual double get_volume(void)
virtual int get_frontiere(void)
virtual class MG_FRONT_3D * get_mgfront(void)
virtual int get_etat_front(void)
virtual int supprimer_voisin(class MG_TETRA *tet)
virtual class MG_TETRA * get_voisin(int num)
virtual int ajouter_voisin(class MG_TETRA *tet)
virtual void supprimer_front_en_reculant(MG_FRONT_3D *ft)
virtual int genere_noeud(MG_VOLUME *mgvol, MG_FRONT_3D *ft, TPL_MAP_ENTITE< MG_NOEUD * > &liste_noeud, std::vector< class CAS_FRONT * > &liste_cas)
virtual double evaluer_distance_noeud_triangle(double x, double y, double z, MG_TRIANGLE *tri)
virtual class MG_TETRA * cree_tetra(class MG_ELEMENT_TOPOLOGIQUE *mgvol, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, MG_NOEUD *noeud4, MG_TRIANGLE *triangle1, MG_TRIANGLE *triangle2, MG_TRIANGLE *triangle3, MG_TRIANGLE *triangle4, int origine)
int supprimer_mg_tetra(MG_TETRA *mgtetra)
double calcul_distance_metrique_segment(MG_SEGMENT *seg, int pas)
TPL_MAP_ENTITE< MG_TETRA * > lsttet_a_detruire
virtual MG_FRONT_3D * ajouter_front_courant(int numero_front, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, MG_TRIANGLE *triangle)
virtual class MG_TETRA * insere_tetra(class MG_ELEMENT_TOPOLOGIQUE *mgvol, class MG_FRONT_3D *ft, MG_NOEUD *noeud4, int type, TPL_MAP_ENTITE< class MG_TRIANGLE * > &liste_intersection)
virtual class MG_TRIANGLE * insere_triangle(class MG_ELEMENT_TOPOLOGIQUE *mgvol, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, int origine)
MG_MAILLAGE * mg_maillage
virtual int inter_tetra_triangle(MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, MG_NOEUD *noeud4, MG_NOEUD *noeud5, MG_NOEUD *noeud6, MG_NOEUD *noeud7)
virtual class MG_SEGMENT * cree_segment(class MG_ELEMENT_TOPOLOGIQUE *mgvol, MG_NOEUD *noeud1, MG_NOEUD *noeud2, int origine)
virtual void insere_contrainte_tetra(MG_VOLUME *mgvol, TPL_LISTE_ENTITE< MG_TETRA * > *lsttet)
virtual void mise_a_jour_voisin_front(MG_FRONT_3D *ft)
virtual double angle_front(MG_FRONT_3D *ft1, MG_FRONT_3D *ft2)
virtual void detruit_element_inactif(void)
virtual class MG_SEGMENT * insere_segment(class MG_ELEMENT_TOPOLOGIQUE *mgvol, MG_NOEUD *noeud1, MG_NOEUD *noeud2, int origine)
virtual double calcule_volume(MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, MG_NOEUD *noeud4)
virtual void supprimer_front_en_avancant_sans_delete(MG_FRONT_3D *ft)
virtual void analyse_maillage_obtenu(double &vol, int *tab, double borne1=0.1, double borne2=0.2, double borne3=0.5)
virtual class MG_TRIANGLE * cree_triangle(class MG_ELEMENT_TOPOLOGIQUE *mgvol, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, MG_SEGMENT *segment1, MG_SEGMENT *segment2, MG_SEGMENT *segment3, int origine)
virtual class MG_FRONT_3D * mise_a_jour_front(MG_TETRA *tet, int cote, int numfront=MAGIC::MAILLEURFRONTALETAT::ATTENTE)
TPL_MAP_ENTITE< MG_NOEUD * > lstnoeud_a_detruire
virtual void insere_contrainte_triangle(MG_VOLUME *mgvol, TPL_LISTE_ENTITE< MG_TRIANGLE * > *lsttri)
virtual void detruit_tetra(MG_TRIANGLE *tri)
TPL_NTREE_FCT< MG_FRONT_3D *, FCT_TAILLE > * ntree_de_front
virtual double calcule_longueur_caracteristique(MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3=NULL, MG_NOEUD *noeud4=NULL)
virtual int get_nouveau_numero(void)
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
virtual void change_nouveau_numero(int num)
virtual int get_dimension(void)=0
MG_NOEUD * get_noeud3(void)
MG_TRIANGLE * get_triangle(void)
MG_NOEUD * get_noeud2(void)
MG_NOEUD * get_noeud1(void)
void incremente_ifail(void)
MG_FRONT_3D * get_front_voisin(int num)
MG_TETRA * get_premier_tetra(LISTE_MG_TETRA::iterator &it)
MG_TETRA * get_suivant_tetra(LISTE_MG_TETRA::iterator &it)
int supprimer_mg_noeudid(unsigned long num)
MG_NOEUD * get_mg_noeudid(unsigned long num)
int supprimer_mg_triangleid(unsigned long num)
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)
MG_TETRA * get_mg_tetra(unsigned int num)
MG_TETRA * ajouter_mg_tetra(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, class MG_NOEUD *mgnoeud4, int origine, unsigned long num=0)
MG_TRIANGLE * get_mg_triangle(unsigned int num)
MG_SEGMENT * get_mg_segment(unsigned int 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)
LISTE_MG_TETRA lst_mg_tetra
TPL_LISTE_ENTITE< class MG_TETRA * > * get_lien_tetra(void)
virtual double * get_coord(void)
virtual double get_z(void)
virtual int get_type_entite()
virtual double get_y(void)
virtual double get_x(void)
virtual MG_NOEUD * get_noeud1(void)
virtual void change_distance_metrique(double val)
virtual bool get_distance_metrique(double *l)
virtual MG_NOEUD * get_noeud2(void)
class MG_TRIANGLE * triangle2
virtual MG_TRIANGLE * get_triangle1(void)
virtual MG_TRIANGLE * get_triangle3(void)
class MG_TRIANGLE * triangle1
class MG_TRIANGLE * triangle3
virtual MG_NOEUD * get_noeud1(void)
virtual int get_type_entite(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud4(void)
virtual MG_NOEUD * get_noeud3(void)
class MG_TRIANGLE * triangle4
virtual MG_TRIANGLE * get_triangle2(void)
virtual MG_TRIANGLE * get_triangle4(void)
class MG_SEGMENT * segment3
virtual MG_NOEUD * get_noeud3(void)
virtual double get_longueur(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
class MG_SEGMENT * segment2
virtual MG_SEGMENT * get_segment2(void)
virtual int get_type_entite(void)
virtual MG_SEGMENT * get_segment3(void)
virtual MG_SEGMENT * get_segment1(void)
class MG_SEGMENT * segment1
static int egal(double a, double b, double eps)
static double qualite_tetra(double *noeud1, double *noeud2, double *noeud3, double *noeud4)
int get_nb_reference(void)
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
virtual X get_premier(ITERATEUR &it)
virtual X get_suivant(ITERATEUR &it)
virtual void ajouter(X x)
virtual void supprimer(X x)
virtual void rechercher(BOITE_3D &boite, TPL_MAP_ENTITE< A > &liste_entite_trouve, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
#define EPS_BASE_RELATIVE
double2 sqrt(double2 &val)
double2 acos(double2 &val)