34 #pragma package(smart_init)
37 ST_B_SPLINE_SURF2::ST_B_SPLINE_SURF2(
long LigneCourante,std::string idori,
int bs_degre_u,
int bs_degre_v,std::vector<int> bs_indexptsctr,std::vector<int> bs_knots_multiplicities_u,std::vector<int> bs_knots_multiplicities_v,std::vector<double> bs_knots_u,std::vector<double> bs_knots_v):
ST_SURFACE(LigneCourante,idori),degre_u(bs_degre_u),degre_v(bs_degre_v),sens(1)
39 int r_u=bs_knots_multiplicities_u.size();
40 for (
int k=0;k<r_u;k++)
42 for (
int j=0;j<bs_knots_multiplicities_u[k];j++)
45 int r_v=bs_knots_multiplicities_v.size();
46 for (
int k=0;k<r_v;k++)
48 for (
int j=0;j<bs_knots_multiplicities_v[k];j++)
64 ST_B_SPLINE_SURF2::ST_B_SPLINE_SURF2(
int bs_degre_u,
int bs_degre_v,std::vector<double> &bs_knots_u,std::vector<double> &bs_knots_v,std::vector<double> &bs_ptsctr,std::vector<double> &bs_poids,
int sense):
ST_SURFACE(),degre_u(bs_degre_u),degre_v(bs_degre_v),sens(sense)
66 int r_u=bs_knots_u.size();
67 for (
int k=0;k<r_u;k++)
69 int r_v=bs_knots_v.size();
70 for (
int k=0;k<r_v;k++)
77 double x=bs_ptsctr[3*i];
78 double y=bs_ptsctr[3*i+1];
79 double z=bs_ptsctr[3*i+2];
137 int mid=((low+high)/2);
138 while ((t<knots[mid-1]) || (t>=knots[mid]))
140 if (t<knots[mid-1]) high=mid;
153 double *gauche=
new double[degre];
154 double *droite=
new double[degre];
155 for (
int j=1;j<=degre;j++)
157 gauche[j-1]= t-knots[inter-j+1];
158 droite[j-1]=knots[inter+j]-t;
160 for (
int r=0;r<j;r++)
162 double temp=
grand_n[r]/(droite[r]+ gauche[j-r-1]);
163 grand_n[r]=saved+droite[r]* temp;
164 saved=gauche[j-r-1]*temp;
181 #define P(i,j) ptsctr [ (uspan - degre_u + i) * nb_ptsctr_v + (vspan - degre_v + j) ]
199 temp[l] +=
Nu[k]*
P(k,l) ;
208 for (
int i=0; i<3; i++)
209 xyz[i] = sp[i]/sp.
w();
216 #define f_deriver(i,j) (*(f_deriver+(i)*(degre+1)+j))
217 #define grand_n(i,j) (*(grand_n+(i)*(degre+1)+j))
218 #define a(i,j) (*(a+(i)*(dd+1)+j))
219 double *
grand_n=
new double[(degre+1)*(degre+1)];
222 double *gauche=
new double[degre+1];
223 double *droite=
new double[degre+1];
224 for (
int j=1;j<=degre;j++)
226 gauche[j]= t-knots[inter-j+1];
227 droite[j]=knots[inter+j]-t;
229 for (
int r=0;r<j;r++)
231 grand_n(j,r)=(droite[r+1]+ gauche[j-r]);
234 grand_n(r,j)= saved+droite[r+1]*temp;
235 saved=gauche[j-r]*temp;
239 for (
int j=0;j<=degre;j++)
243 double *
a=
new double[(dd+1)*2];
244 for (
int r=0;r<=degre;r++)
249 for (
int k=1;k<=dd; k++)
265 for (
int j=j1;j<=j2;j++)
267 a(s2,j) = (
a(s1,j)-
a(s1,j-1))/
grand_n(pk+1,rk+j);
282 for (
int k=1;k<=dd;k++)
284 for (
int j=0;j<=degre;j++)
306 for (n=0;n<d-1;n++) {
307 Bin[(n+1)*d+0] = 1.0 ;
310 Bin[(n+1)*d+k] = 0.0 ;
312 Bin[(n+1)*d+k] =
Bin[n*d+k] +
Bin[n*d+k-1] ;
318 #define skl(i,j) skl[(i)*(d+1)+j]
319 #define Nu(i,j) Nu[(i)*(degre_u+1)+j]
320 #define Nv(i,j) Nv[(i)*(degre_v+1)+j]
321 #define P(i,j) ptsctr[(i)*(nb_ptsctr_v)+j]
328 for (
int l=0;l<=d-k;k++)
336 for ( k=0;k<=d-l;k++)
351 for ( k=0; k<=du;k++)
359 dd = std::min(d-k,dv);
360 for ( l=0; l<=dd;l++)
364 skl(k,l) += temp[s]*
Nv(l,s);
376 #define skl(i,j) (*(skl+(i)*(d+1)+j))
377 #define ders(i,j) (*(ders+(i)*(d+1)+j))
388 #define Bin(i,j) (*(Bin+(i)*(dbin)+j))
425 #define skl(i,j) skl[(i)*(2)+j]
427 for (
int i=0; i<3; i++)
430 for (
int i=0; i<3; i++)
431 xyzdv[i]=
skl(0,1)[i];
438 #define skl(i,j) skl[(i)*(3)+j]
447 for (
int i=0; i<3; i++)
448 xyzduu[i]=
skl(2,0)[i];
450 for (
int i=0; i<3; i++)
451 xyzduv[i] =
sens *
skl(1,1)[i];
453 for (
int i=0; i<3; i++)
454 xyzdvv[i]=
skl(0,2)[i];
456 if ((xyzdu!=NULL) && (xyzdv!=NULL ) )
458 for (
int i=0; i<3; i++)
461 for (
int i=0; i<3; i++)
462 xyzdv[i]=
skl(0,1)[i];
466 for (
int i=0; i<3; i++)
471 double LIMITE = 1E99;
472 for (kk = 0; kk<3; kk++)
473 if ( (xyzduu[kk] > LIMITE ) || (xyzduv[kk] > LIMITE ) || (xyzdvv[kk] > LIMITE ) )
490 code=
inverser2(uv,xyz,num_point,precision);
491 num_point=num_point*2;
515 double distance_ref=1e308;
519 for (
int ii=0;ii<num_test+1;ii++)
523 for (
int jj=0;jj<num_test+1;jj++)
531 if (longueur<distance_ref)
533 distance_ref=longueur;
559 a[1]=Su*Sv+Distance*Suv;
560 a[2]=Su*Sv+Distance*Suv;
566 double delta=1./(
a[0]*
a[3]-
a[2]*
a[1]);
567 delta_u=delta*(b[0]*
a[3]-b[1]*
a[1]);
568 delta_v=delta*(
a[0]*b[1]-
a[2]*b[0]);
593 if (compteur>500)
return 0;
596 while ((fabs(delta_u)>precision)||(fabs(delta_v)>precision));