 |
MAGiC
V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
|
Aller à la documentation de ce fichier.
35 ST_B_SPLINE::ST_B_SPLINE(
long LigneCourante,std::string idori,
int bs_degre,std::vector<int> bs_indexptsctr,std::vector<int> bs_knots_multiplicities,std::vector<double> bs_knots):
ST_COURBE(LigneCourante,idori),degre(bs_degre)
37 int nb=bs_knots_multiplicities.size();
38 for (
int i=0;i<nb;i++)
40 for (
int j=0;j<bs_knots_multiplicities[i];j++)
54 int nb=vec_knots.size();
55 for (
int i=0;i<nb;i++)
60 double w=vec_poids[i];
61 double x=vec_point[3*i];
62 double y=vec_point[3*i+1];
63 double z=vec_point[3*i+2];
106 int mid=((low+high)/2);
109 if (t<
knots[mid-1]) high=mid;
125 for (n=0;n<d-1;n++) {
126 Bin[(n+1)*d+0] = 1.0 ;
129 Bin[(n+1)*d+k] = 0.0 ;
131 Bin[(n+1)*d+k] =
Bin[n*d+k] +
Bin[n*d+k-1] ;
141 for (
int j=1;j<=
degre;j++)
143 gauche[j-1]= t-
knots[inter-j+1];
144 droite[j-1]=
knots[inter+j]-t;
146 for (
int r=0;r<j;r++)
148 double temp=
grand_n[r]/(droite[r]+ gauche[j-r-1]);
149 grand_n[r]=saved+droite[r]* temp;
150 saved=gauche[j-r-1]*temp;
171 for (
int j=0; j<=
degre; j++)
177 for (
int i=0; i<3; i++)
178 xyz[i] = sp[i]/sp.
w();
208 #define f_deriver(i,j) (*(f_deriver+(i)*(degre+1)+j))
209 #define grand_n(i,j) (*(grand_n+(i)*(degre+1)+j))
210 #define a(i,j) (*(a+(i)*(dd+1)+j))
214 double *gauche=
new double[
degre+1];
215 double *droite=
new double[
degre+1];
216 for (
int j=1;j<=
degre;j++)
218 gauche[j]= t-
knots[inter-j+1];
219 droite[j]=
knots[inter+j]-t;
221 for (
int r=0;r<j;r++)
223 grand_n(j,r)=(droite[r+1]+ gauche[j-r]);
226 grand_n(r,j)= saved+droite[r+1]*temp;
227 saved=gauche[j-r]*temp;
231 for (
int j=0;j<=
degre;j++)
236 for (
int r=0;r<=
degre;r++)
241 for (
int k=1;k<=dd; k++)
257 for (
int j=j1;j<=j2;j++)
259 a(s2,j) = (
a(s1,j)-
a(s1,j-1))/
grand_n(pk+1,rk+j);
274 for (
int k=1;k<=dd;k++)
276 for (
int j=0;j<=
degre;j++)
293 int du = std::min(d,
degre);
298 #define derF(i,j) (*(derF+(i)*(degre+1)+j))
299 for (
int k=du;k>=0;--k)
302 for (
int j=
degre;j>=0;--j)
304 CK[k] +=
derF(k,j)*ptsctr_x[inter-
degre+j];
322 #define Bin(i,j) (*(Bin+(i)*(dbin)+j))
329 ders[k]/=dersW[0].
w();
332 for (
int i=0; i<=d; i++)
396 code=
inverser2(t,xyz,num_point,precision);
397 num_point=num_point*2;
399 while (code==0 && num_point < 100000);
412 double distance_ref=1e308;
415 for (
int i=0;i<num_test+1;i++)
417 double t=tmin+i*1./num_test*(tmax-tmin);
422 if (longueur<distance_ref)
424 distance_ref=longueur;
429 double tii=tmin+ref*1./num_test*(tmax-tmin);
438 OT_VECTEUR_3D Ct_deriver_seconde(ddxyz1[0],ddxyz1[1],ddxyz1[2]);
440 tii=ti-Ct_deriver*Distance/(Ct_deriver_seconde*Distance+Ct_deriver.
get_longueur2());
452 if (compteur>500)
return 0;
454 while (eps>precision);
473 return sqrt(dxyz[0]*dxyz[0]+dxyz[1]*dxyz[1]+dxyz[2]*dxyz[2]);
544 for (
int i=0;i<nbptsctr;i++)
582 for (
unsigned int i=0;i<
knots.size();i++)
588 for (
unsigned int pt=0;pt<
ptsctr.size();pt++)
592 double x=
ptsctr[pt].x()*inv_w;
593 double y=
ptsctr[pt].y()*inv_w;
594 double z=
ptsctr[pt].z()*inv_w;
600 indx_premier_ptctr=5+
knots.size();
virtual void deriver_bs_kieme(int nb_point, int degre, std::vector< double > &knots, std::vector< OT_VECTEUR_4D > &ptsctr_x, double t, int d, OT_VECTEUR_4D *CK)
virtual double get_tmax()
virtual void inverser(double &t, double *xyz, double precision=1e-6)
ST_B_SPLINE(long LigneCourante, std::string idori, int bs_degre, std::vector< int > bs_indexptsctr, std::vector< int > bs_knots_multiplicities, std::vector< double > bs_knots)
virtual void deriver_kieme(double t, int d, double *CK_x, double *CK_y, double *CK_z)
virtual void deriver_fonction(int inter, double t, int degre, int dd, std::vector< double > &knots, double *f_deriver)
virtual double get_longueur2(void) const
virtual int est_periodique(void)
virtual void evaluer(double *xyz)
virtual void est_util(class ST_GESTIONNAIRE *gest)
virtual void evaluer(double t, double *xyz)
virtual void initialiser(class ST_GESTIONNAIRE *gest)
virtual void est_util(class ST_GESTIONNAIRE *gest)
std::vector< double > knots
TPL_MAP_ENTITE< class ST_POINT * > lst_point
virtual void get_valeur_fonction(int inter, double t, int degre, std::vector< double > &knots, double *grand_n)
virtual int inverser2(double &t, double *xyz, int num_test, double precision=1e-6)
static int egal(double a, double b, double eps)
virtual void ajouter(X x)
virtual X getid(unsigned long num)
A integrer_gauss_2(C t1, C t2, int nb_pas=32)
virtual void get_param_NURBS(int &indx_premier_ptctr, TPL_LISTE_ENTITE< double > ¶m)
virtual void deriver(double t, double *xyz)
double2 sqrt(double2 &val)
std::vector< int > indexptsctr
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > ¶m)
double equation_longueur(ST_B_SPLINE &bsp, double t)
virtual void binomialCoef(double *Bin, int degre)
virtual void deriver_seconde(double t, double *ddxyz, double *dxyz=NULL, double *xyz=NULL)
virtual double get_tmin()
virtual int get_intervalle(int nbptsctr, int degre, double t, std::vector< double > &knots)
virtual double get_longueur(double t1, double t2, double precis=1e6)
virtual double get_periode(void)
std::vector< OT_VECTEUR_4D > ptsctr