47 std::map <long,TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_SEGMENT_FRONTIERE*> *,std::less<long> >::iterator it=
tabquad.begin();
54 std::map <long,TPL_LISTE_ENTITE<MG_SEGMENT_FRONTIERE*>*,std::less<long> >::iterator it=
tabseg.begin();
92 if (*lstsegfront==NULL)
97 if ((*quad)->get_nb_cellule()==0)
115 double uvajoute[3]={uv[0],uv[1],0.};
118 for (
int i=0;i<nbboucle;i++)
121 for (
int j=0;j<nbcoarete;j++)
130 double d1retenu,d2retenu;
131 double distance=1e300;
137 int nbavant=lsttrouve.
get_nb();
140 quad->
rechercher(uv[0],uv[1],rayon,lsttrouve);
143 while (lsttrouve.
get_nb()==0);
144 int nb=lsttrouve.
get_nb();
145 for (
int i=nbavant;i<nb;i++)
151 for (
int j=0;j<nbco;j++)
155 double uv1[3],uv2[3];
169 coareteretenu=coarete;
178 if (rayon>distance) sortie=1;
182 if (rayon>distance) sortie=1;
185 if (distance<1e308) sortie=1;
189 if (d1retenu<d2retenu)
198 double uv1[3]={segretenu->
get_uv1()[0],segretenu->
get_uv1()[1],0.};
199 double uv2[3]={segretenu->
get_uv2()[0],segretenu->
get_uv2()[1],0.};
210 double normal[3]={0.,0.,1.};
218 double sens=(nor&base)*dir;
219 if (sens<0.) distance=-distance;
228 double uvcom[2],uv1[2],uv2[2];
286 double angle1=
acos(v1*ubase);
287 double angle2=
acos(v2*ubase);
288 if ((v1*vbase)<0.) angle1=-angle1;
289 if ((v2*vbase)<0.) angle2=-angle2;
291 if (fabs(angle1)<fabs(angle2)) rep=1;
313 if ((t<-1e-10) || (t-1.>1e-10))
318 distance=0.5*(*d1+(*d2));
342 double delta_u,delta_v;
349 double xyzduu[3],xyzdvv[3],xyzduv[3],xyzdu[3],xyzdv[3];
360 a[1]=Su*Sv+Distance*Suv;
361 a[2]=Su*Sv+Distance*Suv;
367 double deltau,deltav;
368 double denominateur_delta=(
a[0]*
a[3]-
a[2]*
a[1]);
371 else delta_u=(b[0]*
a[3]-b[1]*
a[1])/denominateur_delta;
374 else delta_v=(
a[0]*b[1]-
a[2]*b[0])/denominateur_delta;
377 uvii[0]=uvi[0]+delta_u;
378 uvii[1]=uvi[1]+delta_v;
391 delta_u=uvii[0]-uvi[0];
392 delta_v=uvii[1]-uvi[1];
393 if (compteur>500)
return 1e300;
396 while ((fabs(delta_u)>precision)||(fabs(delta_v)>precision));
397 surface->
evaluer(uvii,xyzproj);
399 double distance=(S-Pt).get_longueur();
412 for (
int j=0;j<nbboucle;j++)
458 double uvtni[2]={uv1[0],uv1[1]};
459 umin=std::min(umin,uv1[0]);
460 umin=std::min(umin,uv2[0]);
461 umax=std::max(umax,uv1[0]);
462 umax=std::max(umax,uv2[0]);
463 vmin=std::min(vmin,uv1[1]);
464 vmin=std::min(vmin,uv2[1]);
465 vmax=std::max(vmax,uv1[1]);
466 vmax=std::max(vmax,uv2[1]);
467 int nbavant=lstsegfront->
get_nb();
468 for (
int i=0;i<pas;i++)
470 double ti=t1+i*1.0/pas*(t2-t1);
471 double tii=t1+(i+1)*1.0/pas*(t2-t1);
472 double t=0.7886751345*ti+0.2113248654*tii;
474 double M=are->
get_M(t);
478 if (fabs(M)>0.00000001) rayon=1./M;
480 ds=ds+0.5*(tii-ti)*
sqrt(dxyz[0]*dxyz[0]+dxyz[1]*dxyz[1]+dxyz[2]*dxyz[2])/2./rayon/
sqrt(2.)/
sqrt(
epsilon);
482 t=0.7886751345*tii+0.2113248654*ti;
485 if (fabs(M)>0.00000001) rayon=1./M;
487 ds=ds+0.5*(tii-ti)*
sqrt(dxyz[0]*dxyz[0]+dxyz[1]*dxyz[1]+dxyz[2]*dxyz[2])/2./rayon/
sqrt(2.)/
sqrt(
epsilon);
488 if (ds>lstsegfront->
get_nb()+1-nbavant)
508 if (premier==NULL) premier=segfr;
517 umin=std::min(umin,uvtnii[0]);
518 umax=std::max(umax,uvtnii[0]);
519 vmin=std::min(vmin,uvtnii[1]);
520 vmax=std::max(vmax,uvtnii[1]);
527 if (premier==NULL) premier=segfr;
539 while (coare!=coarepremier);
552 double diff=umax-umin;
553 umin=umin-0.125*diff;
554 umax=umax+0.125*diff;
563 double diff=vmax-vmin;
564 vmin=vmin-0.125*diff;
565 vmax=vmax+0.125*diff;
570 int nbsegfr=lstsegfront->
get_nb();
571 for (
int j=0;j<nbsegfr;j++)
597 for (
int i=0;i<pas;i++)
600 double xyz[3],dxyz[3],xyz1du[3],xyz1dv[3],xyz2du[3],xyz2dv[3],xyz1duu[3],xyz1duv[3],xyz1dvv[3],xyz2duu[3],xyz2duv[3],xyz2dvv[3];
603 double uv1[2],uv2[2];
606 double normal1[3],normal2[3];
619 double angle=sens1*sens2;
630 double E1=
sqrt(xyz1duu[0]*xyz1duu[0]+xyz1duu[1]*xyz1duu[1]+xyz1duu[2]*xyz1duu[2]);
631 double F1=
sqrt(xyz2duu[0]*xyz2duu[0]+xyz2duu[1]*xyz2duu[1]+xyz2duu[2]*xyz2duu[2]);
633 double E2=
sqrt(xyz1duv[0]*xyz1duv[0]+xyz1duv[1]*xyz1duv[1]+xyz1duv[2]*xyz1duv[2]);
634 double F2=
sqrt(xyz2duv[0]*xyz2duv[0]+xyz2duv[1]*xyz2duv[1]+xyz2duv[2]*xyz2duv[2]);
636 double E3=
sqrt(xyz1dvv[0]*xyz1dvv[0]+xyz1dvv[1]*xyz1dvv[1]+xyz1dvv[2]*xyz1dvv[2]);
637 double F3=
sqrt(xyz2dvv[0]*xyz2dvv[0]+xyz2dvv[1]*xyz2dvv[1]+xyz2dvv[2]*xyz2dvv[2]);
673 R1=(u*((E12*u)+(E22*v)))+(v*((E22*u)+(E32*v)));
707 R2=(u*((F12*u)+(F22*v)))+(v*((F22*u)+(F32*v)));
709 if (angle>-1+eps)
return 0;
virtual double get_tmax(void)
virtual double get_tmin(void)
virtual void deriver(double t, double *xyz)
virtual void evaluer(double t, double *xyz)
virtual double get_M(double t)
virtual MG_COARETE * get_mg_coarete(int num)
virtual int get_nb_mg_coarete(void)
virtual MG_FACE * get_mg_face(void)
virtual MG_COARETE * get_mg_coarete_suivante(MG_COARETE *coare)
virtual MG_COARETE * get_mg_coarete(int num)
virtual int get_nb_mg_coarete(void)
virtual MG_ARETE * get_arete(void)
virtual int get_orientation(void)
virtual MG_BOUCLE * get_boucle(void)
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
virtual void evaluer(double *uv, double *xyz)
virtual int get_orientation(void)
virtual MG_SURFACE * get_surface(void)
virtual MG_BOUCLE * get_mg_boucle(int num)
virtual void calcul_normale_unitaire(double *uv, double *normale)
virtual void deriver_seconde(double *uv, double *xyzduu, double *xyzduv, double *xyzdvv, double *xyz=NULL, double *xyzdu=NULL, double *xyzdv=NULL)
virtual int get_nb_mg_boucle(void)
double distance_pt_segment(double *uv, double *uv1, double *uv2, MG_FACE *face, int *type, double *d1, double *d2)
TPL_LISTE_ENTITE< MG_SEGMENT_FRONTIERE * > lstsegfrontadetruire
std::map< long, TPL_LISTE_ENTITE< MG_SEGMENT_FRONTIERE * > *, std::less< long > > tabseg
void cree_quadtree(MG_FACE *face, TPL_QUADTREE< MG_SEGMENT_FRONTIERE *, MG_SEGMENT_FRONTIERE * > *quad, TPL_LISTE_ENTITE< MG_SEGMENT_FRONTIERE * > *lstsegfront)
BOITE_2D get_boite_2D(MG_FACE *face)
void change_epsilon(double eps)
int calcule_distance_contour_face_xyz(double *xyz, class MG_FACE *face, double *dis, int avecverif=1)
double projete(double *xyz, MG_FACE *face, double *uvproj, double *xyzproj, double precision=1e-6)
virtual ~MG_GEOMETRIE_OUTILS()
int angle_contour(double *uv, class MG_SEGMENT_FRONTIERE *seg1, MG_SEGMENT_FRONTIERE *seg2, MG_FACE *face)
void ini_methode(MG_FACE *face, TPL_QUADTREE< MG_SEGMENT_FRONTIERE *, MG_SEGMENT_FRONTIERE * > **quad, TPL_LISTE_ENTITE< MG_SEGMENT_FRONTIERE * > **lstsegfront)
double calcule_distance_contour_face_uv(double *uv, class MG_FACE *face)
int arete_virtuelle(class MG_ARETE *are, MG_FACE **tabface=NULL)
std::map< long, TPL_QUADTREE< MG_SEGMENT_FRONTIERE *, MG_SEGMENT_FRONTIERE * > *, std::less< long > > tabquad
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
void change_suivant(MG_SEGMENT_FRONTIERE *p)
static void change_etat_initialise(void)
int memenoeud1(double *uv2)
static void change_etat_normal(void)
MG_SEGMENT_FRONTIERE * get_suivant(void)
void change_precedent(MG_SEGMENT_FRONTIERE *p)
MG_SEGMENT_FRONTIERE * get_precedent(void)
int memenoeud2(double *uv2)
virtual void inverser(double *uv, double *xyz, double precision=1e-6)=0
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > ¶m)=0
virtual void evaluer(double *uv, double *xyz)=0
virtual int est_periodique_u(void)=0
virtual double get_periode_u(void)=0
virtual int est_periodique_v(void)=0
virtual void deriver_seconde(double *uv, double *xyzduu, double *xyzduv, double *xyzdvv, double *xyz=NULL, double *xyzdu=NULL, double *xyzdv=NULL)=0
virtual double get_umax()
virtual double get_periode_v(void)=0
virtual double get_umin()
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 get_longueur(void) const
virtual double get_y(void) const
virtual double get_x(void) const
virtual double get_longueur2(void) const
virtual void supprimer(X x)
virtual void ajouter(X x)
virtual X getid(unsigned long num)
virtual void ajouter(X x)
virtual void initialiser(TPL_LISTE_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double xmax, double ymax, bool estu, bool estv, double periodeu, double periodev)
virtual void rechercher(BOITE_2D &boite, TPL_MAP_ENTITE< A > &liste_entite_trouve, TPL_CELLULE_QUADTREE< A, CONDITION > *cellule)
virtual TPL_CELLULE_QUADTREE< A, CONDITION > * get_cellule(int num)
virtual void inserer(BOITE_2D &boite, A a, TPL_CELLULE_QUADTREE< A, CONDITION > *cellule)
double2 sqrt(double2 &val)
double2 acos(double2 &val)