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;