34 #pragma package(smart_init)
37 ST_B_SPLINE_SURF::ST_B_SPLINE_SURF(
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_SURF::ST_B_SPLINE_SURF(
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];
158 int mid=((low+high)/2);
159 while ((t<knots[mid-1]) || (t>=knots[mid]))
161 if (t<knots[mid-1]) high=mid;
175 double *gauche=
new double[degre];
176 double *droite=
new double[degre];
177 for (
int j=1;j<=degre;j++)
179 gauche[j-1]= t-knots[inter-j+1];
180 droite[j-1]=knots[inter+j]-t;
182 for (
int r=0;r<j;r++)
184 double temp=
grand_n[r]/(droite[r]+ gauche[j-r-1]);
185 grand_n[r]=saved+droite[r]* temp;
186 saved=gauche[j-r-1]*temp;
203 #define P(i,j) ptsctr [ (uspan - degre_u + i) * nb_ptsctr_v + (vspan - degre_v + j) ]
221 temp[l] +=
Nu[k]*
P(k,l) ;
230 for (
int i=0; i<3; i++)
231 xyz[i] = sp[i]/sp.
w();
238 #define f_deriver(i,j) (*(f_deriver+(i)*(degre+1)+j))
239 #define grand_n(i,j) (*(grand_n+(i)*(degre+1)+j))
240 #define a(i,j) (*(a+(i)*(dd+1)+j))
246 for (
int j=1;j<=degre;j++)
248 gauche[j]= t-knots[inter-j+1];
249 droite[j]=knots[inter+j]-t;
251 for (
int r=0;r<j;r++)
253 grand_n(j,r)=(droite[r+1]+ gauche[j-r]);
256 grand_n(r,j)= saved+droite[r+1]*temp;
257 saved=gauche[j-r]*temp;
261 for (
int j=0;j<=degre;j++)
266 for (
int r=0;r<=degre;r++)
271 for (
int k=1;k<=dd; k++)
287 for (
int j=j1;j<=j2;j++)
289 a(s2,j) = (
a(s1,j)-
a(s1,j-1))/
grand_n(pk+1,rk+j);
304 for (
int k=1;k<=dd;k++)
306 for (
int j=0;j<=degre;j++)
324 for (n=0;n<d-1;n++) {
325 Bin[(n+1)*d+0] = 1.0 ;
328 Bin[(n+1)*d+k] = 0.0 ;
330 Bin[(n+1)*d+k] =
Bin[n*d+k] +
Bin[n*d+k-1] ;
336 #define skl(i,j) skl[(i)*(d+1)+j]
337 #define Nu(i,j) Nu[(i)*(degre_u+1)+j]
338 #define Nv(i,j) Nv[(i)*(degre_v+1)+j]
339 #define P(i,j) ptsctr[(i)*(nb_ptsctr_v)+j]
346 for (
int l=0;l<=d-k;k++)
354 for ( k=0;k<=d-l;k++)
369 for ( k=0; k<=du;k++)
377 dd = std::min(d-k,dv);
378 for ( l=0; l<=dd;l++)
382 skl(k,l) += temp[s]*
Nv(l,s);
394 #define skl(i,j) (*(skl+(i)*(d+1)+j))
395 #define ders(i,j) (*(ders+(i)*(d+1)+j))
406 #define Bin(i,j) (*(Bin+(i)*(dbin)+j))
443 #define skl(i,j) skl[(i)*(2)+j]
445 for (
int i=0; i<3; i++)
448 for (
int i=0; i<3; i++)
449 xyzdv[i]=
skl(0,1)[i];
456 #define skl(i,j) skl[(i)*(3)+j]
465 for (
int i=0; i<3; i++)
466 xyzduu[i]=
skl(2,0)[i];
468 for (
int i=0; i<3; i++)
469 xyzduv[i] =
sens *
skl(1,1)[i];
471 for (
int i=0; i<3; i++)
472 xyzdvv[i]=
skl(0,2)[i];
474 if ((xyzdu!=NULL) && (xyzdv!=NULL ) )
476 for (
int i=0; i<3; i++)
479 for (
int i=0; i<3; i++)
480 xyzdv[i]=
skl(0,1)[i];
484 for (
int i=0; i<3; i++)
489 double LIMITE = 1E99;
490 for (kk = 0; kk<3; kk++)
491 if ( (xyzduu[kk] > LIMITE ) || (xyzduv[kk] > LIMITE ) || (xyzdvv[kk] > LIMITE ) )
508 code=
inverser2(uv,xyz,num_point,precision);
509 num_point=num_point*2;
511 while (code==0&&num_point<1500);
533 double distance_ref=1e308;
537 for (
int ii=0;ii<num_test+1;ii++)
541 for (
int jj=0;jj<num_test+1;jj++)
549 if (longueur<distance_ref)
551 distance_ref=longueur;
577 a[1]=Su*Sv+Distance*Suv;
578 a[2]=Su*Sv+Distance*Suv;
584 double denominateur_delta=(
a[0]*
a[3]-
a[2]*
a[1]);
585 if (fabs(denominateur_delta) < ( (fabs(
a[0])+fabs(
a[1])+fabs(
a[2])+fabs(
a[3]))*1e-12 ) )
587 delta_u=(b[0]*
a[3]-b[1]*
a[1])/denominateur_delta;
588 delta_v=(
a[0]*b[1]-
a[2]*b[0])/denominateur_delta;
589 if (fabs(delta_u)>
umax-
umin)
return 0;
590 if (fabs(delta_v)>
vmax-
vmin)
return 0;
591 if (Su.get_longueur2()>1E-14)
595 if (Sv.get_longueur2()>1E-14)
621 if (compteur>500)
return 0;
624 while ((fabs(delta_u)>precision)||(fabs(delta_v)>precision));
767 for (
unsigned int i=0;i<
knots_u.size();i++)
773 for (
unsigned int j=0;j<
knots_v.size();j++)
785 double x=
ptsctr[pt].x()*inv_w;
786 double y=
ptsctr[pt].y()*inv_w;
787 double z=
ptsctr[pt].z()*inv_w;