35 MG_ARETE::MG_ARETE(std::string idori,
unsigned long num,
MG_COSOMMET* mgcosom1,
MG_COSOMMET* mgcosom2,
MG_COURBE* crb,
int sens):
MG_ELEMENT_TOPOLOGIQUE(num,idori),cosommet1(mgcosom1),cosommet2(mgcosom2),courbe(crb),orientation(sens),vect(NULL)
118 double xmin=std::numeric_limits<double>::max();
119 double ymin=std::numeric_limits<double>::max();
120 double zmin=std::numeric_limits<double>::max();
121 double xmax=std::numeric_limits<double>::min();
122 double ymax=std::numeric_limits<double>::min();
123 double zmax=std::numeric_limits<double>::min();
129 double t=tmin+i*pas_t;
132 if (xyz[0]<xmin) xmin=xyz[0];
133 if (xyz[0]>xmax) xmax=xyz[0];
134 if (xyz[1]<ymin) ymin=xyz[1];
135 if (xyz[1]>ymax) ymax=xyz[1];
136 if (xyz[2]<zmin) zmin=xyz[2];
137 if (xyz[2]>zmax) zmax=xyz[2];
139 BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
215 std::vector<MG_COARETE*>::iterator i;
235 return TYPE_ELEMENT_TOPOLOGIQUE::ARETE;
261 for (
int i=0;i<nb;i++)
266 if (i!=nb-1) o <<
"," ;
272 o <<
");" << std::endl;
299 double det1=b[0]*d[1]-b[1]*d[0];
300 double det2=b[0]*d[2]-b[2]*d[0];
301 double det3=b[1]*d[2]-b[2]*d[1];
305 if (fabs(det1)>=1e-10)
308 u=(d[1]*
f[0]-d[0]*
f[1])/det1;
309 w=(b[0]*
f[1]-b[1]*
f[0])/det1;
310 double verif_x=
a[2] +u*b[2];
311 double verif_y=c[2]-w*d[2];
312 if (fabs(verif_x-verif_y)<0.000001)
321 if (!c_fait&&fabs(det2)>=1e-10)
324 u=(d[2]*
f[0]-d[0]*
f[2])/det2;
325 w=(b[0]*
f[2]-b[2]*
f[0])/det2;
326 double verif_x=
a[1]+u*b[1];
327 double verif_y=c[1]-w*d[1];
328 if (fabs(verif_x-verif_y)<0.000001)
336 if (!c_fait&&fabs(det3)>=1e-10)
339 u=(d[2]*
f[1]-d[1]*
f[2])/det3;
340 w=(b[1]*
f[2]-b[2]*
f[1])/det3;
341 double verif_x=
a[0] +u*b[0];
342 double verif_y=c[0]-w*d[0];
343 if (fabs(verif_x-verif_y)<0.000001)
351 P1_INTERSECTION=
a+U*b;
353 point_iners[0]=P1_INTERSECTION[0];
354 point_iners[1]=P1_INTERSECTION[1];
355 point_iners[2]=P1_INTERSECTION[2];
369 double angle=tcs1-tcs2;
382 double rayon=arc_lengh/fabs(angle);
384 double dif=fabs(fabs(angle)-M_PI);
385 if (fabs(fabs(angle)-M_PI)<=1e-6||fabs(angle)-M_PI<0.)
389 double request_lengh=arc_lengh/2;
402 double xyz1_inters[3];
403 double xyz2_inters[3];
406 double t_mid=
get_t(tcs1,tcs2,request_lengh);
436 indx_premier_ptctr=13;
440 if (fabs(fabs(angle)-M_PI)>1e-6&&fabs(angle)-M_PI>0.)
445 double lengh_at_mid=arc_lengh;
446 double request_lengh=lengh_at_mid/2.;
447 double tmid=
get_t(tcs1,tcs2,request_lengh);
448 double tmid1=
get_t(tcs1,tmid,request_lengh/2.);
449 double tmid2=
get_t(tmid,tcs2,request_lengh/2.);
518 indx_premier_ptctr=17;
565 indx_premier_ptctr=9;
581 std::vector<integrale> tab_integrale;
589 t=0.7886751345*ti+0.2113248654*tii;
592 double facteur=pow(pt[0],2)+pow(pt[1],2)+pow(pt[2],2);
593 longueur=longueur+0.5*(tii-ti)*
sqrt(facteur);
594 t=0.7886751345*tii+0.2113248654*ti;
596 facteur=pow(pt[0],2)+pow(pt[1],2)+pow(pt[2],2);
597 longueur=longueur+0.5*(tii-ti)*
sqrt(facteur);
601 tab_integrale.insert(tab_integrale.end(),pas);
604 while (fabs(tab_integrale.back().li)<fabs(longueur_voulue));
606 double tn_1=tab_integrale.back().ti;
607 double ln_1=tab_integrale[tab_integrale.size()-2].li;
609 double ln=tab_integrale.back().li;
612 double t_trouve=tn_1+(tn-tn_1)/(ln-ln_1)*(longueur_voulue-ln_1);
642 std::vector<double> resultat;
644 resultat.push_back(t);
645 resultat.push_back(0.);
647 while (noeudcourant!=noeudfin)
672 double s=resultat[resultat.size()-2];
674 for (
int j=0;j<pas;j++)
676 double ti=tprec+1.0*j*(t2-tprec)/pas;
677 double tii=tprec+1.0*(j+1)*(t2-tprec)/pas;
678 double tgauss1=0.7886751345*tii+0.2113248654*ti;
681 s=s+0.5*(tii-ti)*
sqrt(dxyz[0]*dxyz[0]+dxyz[1]*dxyz[1]+dxyz[2]*dxyz[2]);
682 double tgauss2=0.7886751345*ti+0.2113248654*tii;
684 s=s+0.5*(tii-ti)*
sqrt(dxyz[0]*dxyz[0]+dxyz[1]*dxyz[1]+dxyz[2]*dxyz[2]);
686 resultat.push_back(t2);
687 resultat.push_back(s);
692 noeudcourant=autrenoeud;
694 FILE *in=fopen(fichier,
"wt");
696 sprintf(mess,
"%s_%s",(
char*)sol->
get_nom().c_str(),(
char*)sol->
get_legende(numchamps).c_str());
697 fprintf(in,
"t;s;%s;\n",mess);
698 for (
int i=0;i<resultat.size();i=i+3)
699 fprintf(in,
"%lf;%lf;%lf;\n",resultat[i],resultat[i+1],resultat[i+2]);