57 double delta=(u2-u1)*(v3-v1)-(v2-v1)*(u3-u1);
58 double precision=std::max(fabs(u1),fabs(v1));
59 precision=std::max(precision,fabs(u2));
60 precision=std::max(precision,fabs(v2));
61 precision=std::max(precision,fabs(u3));
62 precision=std::max(precision,fabs(v3));
63 precision=std::max(precision,fabs(u));
64 precision=std::max(precision,fabs(v));
66 double xsi=1.0/delta*((v3-v1)*(u-u1)-(u3-u1)*(v-v1));
67 double eta=1.0/delta*((u2-u1)*(v-v1)-(v2-v1)*(u-u1));
68 if (!((eta > eps) && (xsi > eps) && ((eta+xsi) < 1.0-eps)))
return(0);
86 double ui=0.5*(u1+u2);
87 double vi=0.5*(v1+v2);
90 double longueur=
sqrt((u2-u1)*(u2-u1)+(v2-v1)*(v2-v1));
91 double xyz[3],uv[2]={uii,vii};
92 double xyz1[3],uv1[2]={noeud1->
get_u(),noeud1->
get_v()};
93 double xyz2[3],uv2[2]={noeud2->
get_u(),noeud2->
get_v()};
98 xyz[0]=0.5*(xyz1[0]+xyz2[0]);
99 xyz[1]=0.5*(xyz1[1]+xyz2[1]);
100 xyz[2]=0.5*(xyz1[2]+xyz2[2]);
105 for (
int j=0;j<liste_trouvee.
get_nb();j++)
119 for (
int j=0;j<liste_trouvee.
get_nb();j++)
130 if ((*nv_segment)==NULL)
133 *nv_segment=mgsegment;
161 longueur_desiree=longueur_desiree/front->
get_ifail();
164 double umilieu=0.5*(u1+u2);
165 double vmilieu=0.5*(v1+v2);
166 double param_milieu[2]={umilieu-du,vmilieu-dv};
169 mgface->
get_EFG(param_milieu,E,F,G);
170 double deno=E*(u2-u1)*(u2-u1)+G*(v2-v1)*(v2-v1)+2*F*(u2-u1)*(v2-v1);
171 double nume=(v2-v1)*(u2-u1)*(E-G)+F*((v2-v1)*(v2-v1)-(u2-u1)*(u2-u1));
172 double teta=
atan(nume/deno);
177 int res=
metrique->
ajuste_distance_ortho_metrique(mgface,u1,v1,u2,v2,udecale,vdecale,longueur_desiree,du,dv,teta,
pas);
181 double param_noeud_cree[2]={u,v};
185 double xyz[3],uv[2]={u,v};
187 double xmin=std::min(noeud1->
get_x(),noeud2->
get_x());xmin=std::min(xmin,xyz[0]);
188 double xmax=std::max(noeud1->
get_x(),noeud2->
get_x());xmax=std::max(xmax,xyz[0]);
189 double ymin=std::min(noeud1->
get_y(),noeud2->
get_y());ymin=std::min(ymin,xyz[1]);
190 double ymax=std::max(noeud1->
get_y(),noeud2->
get_y());ymax=std::max(ymax,xyz[1]);
191 double zmin=std::min(noeud1->
get_z(),noeud2->
get_z());zmin=std::min(zmin,xyz[2]);
192 double zmax=std::max(noeud1->
get_z(),noeud2->
get_z());zmax=std::max(zmax,xyz[2]);
193 BOITE_3D boite_recherche(xmin,ymin,zmin,xmax,ymax,zmax);
194 double longueur_recherche=boite_recherche.
get_rayon()*2.;
199 int nb_entite=liste_trouvee.
get_nb();
200 double distance_reference = -1.;
201 double angle_reference=2.*M_PI;
202 unsigned long id_noeud_reference = 0;
205 for (
int i=0;i<nb_entite;i++)
221 if ((distance_noeudfront1<distance_reference) || (distance_reference<0.) || (id_noeud_reference==noeud_front1->
get_id()))
224 if (id_noeud_reference==noeud_front1->
get_id())
227 OT_VECTEUR_3D vecteur_baseu(u1d2-unoeudfront1,v1d2-vnoeudfront1,0.);
228 OT_VECTEUR_3D vecteur_front(unoeudfront2-unoeudfront1,vnoeudfront2-vnoeudfront1,0.);
230 vecteur_baseu.
norme();
231 vecteur_basev.
norme();
232 vecteur_front.
norme();
233 double cosangle=vecteur_baseu*vecteur_front;
234 double sinangle=vecteur_basev*vecteur_front;
236 if (cosangle>1.) cosangle=1.;
237 if (cosangle<-1.) cosangle=(-1.);
238 double angle=
acos(cosangle);
239 if (sinangle<(-0.0001)) angle=(-angle);
240 if (angle<0.) angle=angle+2.*M_PI;
241 if (angle<angle_reference)
243 angle_reference=angle;
250 OT_VECTEUR_3D vecteur_baseu(u1d2-unoeudfront1,v1d2-vnoeudfront1,0.);
251 OT_VECTEUR_3D vecteur_front(unoeudfront2-unoeudfront1,vnoeudfront2-vnoeudfront1,0.);
253 vecteur_baseu.
norme();
254 vecteur_basev.
norme();
255 vecteur_front.
norme();
256 double cosangle=vecteur_baseu*vecteur_front;
257 double sinangle=vecteur_basev*vecteur_front;
259 if (cosangle>1.) cosangle=1.;
260 if (cosangle<-1.) cosangle=(-1.);
261 double angle=
acos(cosangle);
262 if (sinangle<(-0.0001)) angle=(-angle);
263 if (angle<0.) angle=angle+2.*M_PI;
264 distance_reference=distance_noeudfront1;
265 angle_reference=angle;
266 id_noeud_reference=noeud_front1->
get_id();
271 if ((front_reference!=NULL) && (distance_reference<longueur_desiree*2./
sqrt(3)))
277 if (distance<1.5*longueur_desiree)
279 (*front_rencontre)=front_reference;
280 (*noeud_rencontre)=noeud;
285 noeud->
change_u(param_noeud_cree[0]);
286 noeud->
change_v(param_noeud_cree[1]);
287 (*noeud_rencontre)=noeud;
288 (*front_rencontre)=NULL;
313 std::pair<const double,M3D_TRIANGLE*> tmp(mtriangle->
get_qualite(),mtriangle);
331 if (nmat*n1n2<0)
return 0;
342 #define PSCA(a,b) (a[0]*b[0]+a[1]*b[1]+a[2]*b[2])
343 #define EGAL(x,y,eps) (float)fabs((double)(x-y))<eps
344 #define DETER(a,b,c,d) (a*d-b*c)
378 double eps2=
PSCA(ab,ab);
379 double eps=
sqrt(eps2);
383 if ( (
EGAL(ab[0],0,eps)) && (
EGAL(nm[0],0,eps)) )
384 if (
EGAL(am[0],0,eps)) equation[0]=0;
else return(0);
385 if ( (
EGAL(ab[1],0,eps)) && (
EGAL(nm[1],0,eps)) )
386 if (
EGAL(am[1],0,eps)) equation[1]=0;
else return(0);
387 if ( (
EGAL(ab[2],0,eps)) && (
EGAL(nm[2],0,eps)) )
388 if (
EGAL(am[2],0,eps)) equation[2]=0;
else return(0);
389 equation[3]=equation[0]+equation[1]+equation[2];
392 double det=
DETER(ab[0],nm[0],ab[1],nm[1]);
396 double sol1=det*
DETER(am[0],nm[0],am[1],nm[1]);
397 double sol2=det*
DETER(ab[0],am[0],ab[1],am[1]);
398 if ( (
float)fabs((
double)(sol1*ab[2]-sol2*nm[2]-am[2]))>eps2)
return(0);
407 if (ab[0]!=0) tmp=ab[1]*am[0]/ab[0];
else tmp=nm[1]*am[0]/nm[0];
408 if (!(
EGAL(tmp,am[1],eps)))
return(0);
419 if (equation[1]!=0) ne2=1;
else ne2=2;
427 double det=
DETER(ab[ne1],nm[ne1],ab[ne2],nm[ne2]);
431 double sol1=det*
DETER(am[ne1],nm[ne1],am[ne2],nm[ne2]);
432 double sol2=det*
DETER(ab[ne1],am[ne1],ab[ne2],am[ne2]);
441 if (ab[ne1]!=0) tmp=ab[ne2]*am[ne1]/ab[ne1];
else tmp=nm[ne2]*am[ne1]/nm[ne1];
442 if (!(
EGAL(tmp,am[ne2],eps)))
return(0);
450 if (equation[0]!=0) ne1=0;
else
451 if (equation[1]!=0) ne1=1;
else ne1=2;
456 double tmp=1/ab[ne1];
457 double sol1=am[ne1]*tmp;
458 double sol2=an[ne1]*tmp;
virtual int ajuste_distance_ortho_metrique(class MG_FACE *mgface, double u1, double v1, double u2, double v2, double &udecale, double &vdecale, double longueur_desiree, double du, double dv, double teta, int pas=32)
virtual double calcule_longueur_segment_metrique(class MG_FACE *mgface, class MG_SEGMENT *mgsegment, class OT_DECALAGE_PARAMETRE *decalage, int pas=32)
virtual double calcule_distance_metrique(class MG_FACE *mgface, double u1, double v1, double u2, double v2, double du, double dv, int pas=32)
virtual void change_qualite(double val)
virtual double get_qualite(void)
MG_MAILLAGE * mg_maillage
void supprime_segment(MG_SEGMENT *mgsegment)
OT_DECALAGE_PARAMETRE * decalage
int examine_solution(double sol1, double sol2, int type)
int genere_noeud(MG_FACE *mgface, MG_FRONT_2D *front, MG_FRONT_2D **front_rencontre, MG_NOEUD **noeud)
int noeud_est_dans_triangle(MG_NOEUD *noeud, MG_TRIANGLE *triangle)
int insere_segment(MG_FACE *mgface, MG_SEGMENT **nv_segment, MG_NOEUD *noeud1, MG_NOEUD *noeud2, int type_verication)
TPL_NTREE_FCT< MG_SEGMENT *, FCT_TAILLE > * ntree_de_segment
TPL_OCTREE< MG_FRONT_2D *, MG_NOEUD * > * ntree_de_front
int triangle_est_dans_bon_sens(MG_FACE *face, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3)
MG_TRIANGLE * insere_triangle(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3)
int intersection_segment_segment(MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, MG_NOEUD *noeud4)
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
virtual void evaluer(double *uv, double *xyz)
virtual void get_EFG(double *uv, double &E, double &F, double &G)
virtual void calcul_normale_unitaire(double *uv, double *normale)
MG_NOEUD * get_noeud1(void)
MG_NOEUD * get_noeud2(void)
MG_SEGMENT * get_segment(void)
MG_NOEUD * get_mg_noeudid(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_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)
int supprimer_mg_segmentid(unsigned long num)
MG_NOEUD * ajouter_mg_noeud(MG_ELEMENT_TOPOLOGIQUE *topo, double xx, double yy, double zz, int origine, unsigned long num=0)
virtual double get_v(void)
virtual double * get_coord(void)
virtual double get_z(void)
virtual double get_u(void)
virtual double get_y(void)
virtual void change_u(double uu)
virtual double get_x(void)
virtual void change_v(double vv)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud3(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
static int egal(double a, double b, double eps)
static double qualite_triangle(double *noeud1, double *noeud2, double *noeud3)
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_longueur(void) const
virtual void inserer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
virtual void supprimer(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)
#define DETER(a, b, c, d)
double2 atan(double2 &val)
double2 sqrt(double2 &val)
double2 acos(double2 &val)