ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/step/src/stbsplines.cpp
Revision: 5
Committed: Tue Jun 12 20:26:34 2007 UTC (17 years, 11 months ago)
Original Path: magic/lib/step/step/src/stbsplines.cpp
File size: 20295 byte(s)
Log Message:

File Contents

# User Rev Content
1 5 //---------------------------------------------------------------------------
2    
3     #pragma hdrstop
4    
5     #include "gestionversion.h"
6    
7     #include "stbsplines.h"
8     #include <vector>
9     #include "st_gestionnaire.h"
10     #include "ot_systeme.h"
11     #include "constantegeo.h"
12    
13     #include <math.h>
14    
15     //---------------------------------------------------------------------------
16     #pragma package(smart_init)
17    
18    
19     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)
20     {
21     int r_u=bs_knots_multiplicities_u.size();
22     for (int k=0;k<r_u;k++)
23     {
24     for (int j=0;j<bs_knots_multiplicities_u[k];j++)
25     knots_u.insert(knots_u.end(),bs_knots_u[k]);
26     }
27     int r_v=bs_knots_multiplicities_v.size();
28     for (int k=0;k<r_v;k++)
29     {
30     for (int j=0;j<bs_knots_multiplicities_v[k];j++)
31     knots_v.insert(knots_v.end(),bs_knots_v[k]);
32     }
33     nb_point=bs_indexptsctr.size();
34     nb_ptsctr_u=knots_u.size()-degre_u-1;
35     nb_ptsctr_v=knots_v.size()-degre_v-1;
36     for (int i=0;i<nb_point;i++)
37     {
38     indexptsctr.insert(indexptsctr.end(),bs_indexptsctr[i]);
39     }
40     umin=knots_u[0];
41     umax=knots_u[knots_u.size()-1];
42     vmin=knots_v[0];
43     vmax=knots_v[knots_v.size()-1];
44     }
45    
46     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)
47     {
48     int r_u=bs_knots_u.size();
49     for (int k=0;k<r_u;k++)
50     knots_u.insert(knots_u.end(),bs_knots_u[k]);
51     int r_v=bs_knots_v.size();
52     for (int k=0;k<r_v;k++)
53     knots_v.insert(knots_v.end(),bs_knots_v[k]);
54     nb_point=bs_ptsctr.size()/3;
55     nb_ptsctr_u=knots_u.size()-degre_u-1;
56     nb_ptsctr_v=knots_v.size()-degre_v-1;
57     for (int i=0;i<nb_point;i++)
58     {
59     double x=bs_ptsctr[3*i];
60     double y=bs_ptsctr[3*i+1];
61     double z=bs_ptsctr[3*i+2];
62     double w=bs_poids[i];
63     ptsctr.push_back(OT_VECTEUR_4D(w*x,w*y,w*z,w));
64     }
65     periodique_u=1;
66     for (int i=0; i<nb_ptsctr_v; i++)
67     {
68     double *xyz1=ptsctr[i];
69     double *xyz2=ptsctr[nb_ptsctr_v*(nb_ptsctr_u-1)+i];
70     if ((!(OPERATEUR::egal (xyz1[0],xyz2[0],1E-10))) || (!(OPERATEUR::egal (xyz1[1],xyz2[1],1E-10))) || (!(OPERATEUR::egal (xyz1[2],xyz2[2],1E-10))))
71     {
72     periodique_u=0;
73     break;
74     }
75     }
76     if (periodique_u==1)
77     {
78     int i=knots_u.size();
79     periode_u=(knots_u[i-1]-knots_u[0]);
80     }
81     else periode_u=0;
82     periodique_v=1;
83     for (int j=0; j<nb_ptsctr_u; j++)
84     {
85     double *xyz3=ptsctr[j];
86     double *xyz4=ptsctr[(j*nb_ptsctr_v+nb_ptsctr_v-1)];
87     if ((!(OPERATEUR::egal (xyz3[0],xyz4[0],1E-10))) || (!(OPERATEUR::egal (xyz3[1],xyz4[1],1E-10))) || (!(OPERATEUR::egal (xyz3[2],xyz4[2],1E-10))))
88     {
89     periodique_v=0;
90     break;
91     }
92     }
93     if (periodique_v==1)
94     {
95     int j=knots_v.size();
96     periode_v=(knots_v[j-1]-knots_v[0]);
97     }
98     else periode_v=0;
99     umin=knots_u[0];
100     umax=knots_u[knots_u.size()-1];
101     vmin=knots_v[0];
102     vmax=knots_v[knots_v.size()-1];
103     }
104    
105    
106     ST_B_SPLINE_SURF::~ST_B_SPLINE_SURF()
107     {
108    
109     }
110    
111     int ST_B_SPLINE_SURF::get_intervalle(int nb_pt, int degre, double t, std::vector<double> &knots)
112     {
113     int inter;
114     if (OPERATEUR::egal(t,knots[nb_pt],1E-12)==1) inter=nb_pt-1;
115     else
116     {
117     int low=degre;
118     int high=nb_pt+1;
119     int mid=((low+high)/2);
120     while ((t<knots[mid-1]) || (t>=knots[mid]))
121     {
122     if (t<knots[mid-1]) high=mid;
123     else low=mid;
124     mid=(low+high)/2;
125     }
126     inter=mid-1;
127     }
128     return inter;
129     }
130    
131     void ST_B_SPLINE_SURF::get_valeur_fonction(int inter, double t, int degre, std::vector<double> &knots,double *grand_n)
132     {
133     double saved;
134     grand_n[0]=1.0;
135     double *gauche=new double[degre];
136     double *droite=new double[degre];
137     for (int j=1;j<=degre;j++)
138     {
139     gauche[j-1]= t-knots[inter-j+1];
140     droite[j-1]=knots[inter+j]-t;
141     saved=0.0;
142     for (int r=0;r<j;r++)
143     {
144     double temp=grand_n[r]/(droite[r]+ gauche[j-r-1]);
145     grand_n[r]=saved+droite[r]* temp;
146     saved=gauche[j-r-1]*temp;
147     }
148     grand_n[j]=saved;
149     }
150     delete [] gauche;
151     delete [] droite;
152     }
153    
154    
155     void ST_B_SPLINE_SURF::evaluer(double *uv,double *xyz)
156     {
157    
158     double u = uv[0];
159     double v = uv[1];
160    
161     if (sens==-1) u=umin+umax-u;
162    
163     #define P(i,j) ptsctr [ (uspan - degre_u + i) * nb_ptsctr_v + (vspan - degre_v + j) ]
164    
165     int uspan = get_intervalle(nb_ptsctr_u,degre_u,u, knots_u);
166    
167     int vspan = get_intervalle(nb_ptsctr_v,degre_v,v, knots_v);
168    
169     double Nu[20];
170     get_valeur_fonction(uspan,u,degre_u,knots_u,Nu);
171    
172     double Nv[20];
173     get_valeur_fonction(vspan,v,degre_v,knots_v,Nv);
174    
175     OT_VECTEUR_4D temp[20];
176    
177     int l;
178     for(l=0;l<=degre_v;l++){
179     temp[l] =0.0 ;
180     for(int k=0;k<=degre_u;k++){
181     temp[l] += Nu[k]*P(k,l) ;
182     }
183     }
184     OT_VECTEUR_4D sp(0,0,0,0) ;
185     for(l=0;l<=degre_v;l++){
186     sp += Nv[l]*temp[l];
187     }
188    
189     // transform homogeneous coordinates to 3D coordinates
190     for (int i=0; i<3; i++)
191     xyz[i] = sp[i]/sp.w();
192    
193     #undef P
194     }
195    
196     void ST_B_SPLINE_SURF::deriver_fonction(int inter,double t,int degre,int dd,std::vector<double> &knots,double *f_deriver)
197     {
198     #define f_deriver(i,j) (*(f_deriver+(i)*(degre+1)+j))
199     #define grand_n(i,j) (*(grand_n+(i)*(degre+1)+j))
200     #define a(i,j) (*(a+(i)*(dd+1)+j))
201     double *grand_n=new double[(degre+1)*(degre+1)];
202     double saved;
203     grand_n(0,0)=1.0;
204     double *gauche=new double[degre+1];
205     double *droite=new double[degre+1];
206     for (int j=1;j<=degre;j++)
207     {
208     gauche[j]= t-knots[inter-j+1];
209     droite[j]=knots[inter+j]-t;
210     saved=0.0;
211     for (int r=0;r<j;r++)
212     {
213     grand_n(j,r)=(droite[r+1]+ gauche[j-r]);
214     double temp = grand_n(r,j-1)/grand_n(j,r);
215    
216     grand_n(r,j)= saved+droite[r+1]*temp;
217     saved=gauche[j-r]*temp;
218     }
219     grand_n(j,j)=saved;
220     }
221     for (int j=0;j<=degre;j++)
222     {
223     f_deriver(0,j)= grand_n(j,degre);
224     }
225     double *a=new double[(dd+1)*2];
226     for (int r=0;r<=degre;r++)
227     {
228     int s1=0; int s2=1;
229     a(0,0)=1.0;
230     for (int k=1;k<=dd; k++)
231     {
232     double d=0.0;
233     int rk=r-k; int pk=degre-k;
234     if(r>=k)
235     {
236     a(s2,0)=a(s1,0)/grand_n(pk+1,rk);
237     d= a(s2,0)* grand_n(rk,pk);
238     }
239     int j1; int j2;
240     if(rk>=-1) j1=1;
241     else j1= -rk;
242     if(r-1<=pk) j2=k-1;
243     else j2=degre-r;
244     for (int j=j1;j<=j2;j++)
245     {
246     a(s2,j) = (a(s1,j)-a(s1,j-1))/grand_n(pk+1,rk+j);
247     d+=a(s2,j)*grand_n(rk+j,pk);
248     }
249     if(r<=pk)
250     {
251     a(s2,k) = -a(s1,k-1)/grand_n(pk+1,r);
252     d+=a(s2,k)*grand_n(r,pk);
253     }
254     f_deriver(k,r)=d;
255     int j=s1; s1=s2; s2=j;
256     }
257     }
258     int r=degre;
259     for (int k=1;k<=dd;k++)
260     {
261     for (int j=0;j<=degre;j++)
262     {
263     f_deriver(k,j)*=r;
264     }
265     r*=(degre-k);
266     }
267     delete [] a;
268     delete [] grand_n;
269     delete [] gauche;
270     delete [] droite;
271     #undef f_deriver
272     #undef grand_n
273     #undef a
274     }
275    
276     // Setup the binomial coefficients into th matrix Bin
277     // Bin(i,j) = (i j)
278     // The binomical coefficients are defined as follow
279     // (n) n!
280     // (k) = k!(n-k)! 0<=k<=n
281     // and the following relationship applies
282     // (n+1) (n) ( n )
283     // ( k ) = (k) + (k-1)
284     void ST_B_SPLINE_SURF::binomialCoef(double * Bin, int d){
285     int n,k;
286     // Setup the first line
287     Bin[0] = 1.0 ;
288     for(k=d-1;k>0;--k)
289     Bin[k] = 0.0 ;
290     // Setup the other lines
291     for(n=0;n<d-1;n++){
292     Bin[(n+1)*d+0] = 1.0 ;
293     for(k=1;k<d;k++)
294     if(n+1<k)
295     Bin[(n+1)*d+k] = 0.0 ;
296     else
297     Bin[(n+1)*d+k] = Bin[n*d+k] + Bin[n*d+k-1] ;
298     }
299     }
300    
301     void ST_B_SPLINE_SURF::deriver_bs_kieme(int nb_ptsctr_u,int degre_u,std::vector<double> &knots_u,int nb_ptsctr_v,int degre_v,std::vector<double> &knots_v,double u,double v,int d,OT_VECTEUR_4D * skl)
302     {
303     #define skl(i,j) skl[(i)*(d+1)+j]
304     #define Nu(i,j) Nu[(i)*(degre_u+1)+j]
305     #define Nv(i,j) Nv[(i)*(degre_v+1)+j]
306     #define P(i,j) ptsctr[(i)*(nb_ptsctr_v)+j]
307    
308     int i,j,k,l,s,r,dd;
309    
310     int du = std::min(d,degre_u);
311     for ( k=degre_u+1;k<=d;k++)
312     {
313     for (int l=0;l<=d-k;k++)
314     {
315     skl(k,l)=0.0;
316     }
317     }
318     int dv = std::min(d,degre_v);
319     for ( l=degre_v+1;l<=d;l++)
320     {
321     for ( k=0;k<=d-l;k++)
322     {
323     skl(k,l)=0.0;
324     }
325     }
326    
327     int inter_u = get_intervalle(nb_ptsctr_u,degre_u,u, knots_u);
328     double Nu [ 256 ];
329     deriver_fonction(inter_u,u,degre_u,du,knots_u,Nu);
330    
331     int inter_v = get_intervalle(nb_ptsctr_v,degre_v,v, knots_v);
332     double Nv [ 256 ];
333     deriver_fonction(inter_v,v,degre_v,dv,knots_v,Nv);
334    
335     OT_VECTEUR_4D temp [ 16 ];
336     for( k=0; k<=du;k++)
337     {
338     for( s=0; s<=degre_v;s++)
339     {
340     temp[s]=0.0;
341     for( r=0; r<=degre_u;r++)
342     temp[s]+=P((inter_u-degre_u+r),(inter_v-degre_v+s))*Nu(k,r);
343     }
344     dd = std::min(d-k,dv);
345     for( l=0; l<=dd;l++)
346     {
347     skl(k,l) = 0.0;
348     for( s=0; s<=degre_v;s++)
349     skl(k,l) += temp[s]*Nv(l,s);
350     }
351     }
352    
353     #undef skl
354     #undef f_deriver_u
355     #undef f_deriver_v
356     #undef P
357     }
358    
359     void ST_B_SPLINE_SURF::deriver_kieme(double *uv,int d,OT_VECTEUR_4D *skl)
360     {
361     #define skl(i,j) (*(skl+(i)*(d+1)+j))
362     #define ders(i,j) (*(ders+(i)*(d+1)+j))
363     double u = uv[0];
364     double v = uv[1];
365     int i,j,k,l;
366     OT_VECTEUR_4D pv,pv2;
367    
368     OT_VECTEUR_4D ders [256];
369    
370     double Bin[256];
371     int dbin=std::max(degre_u, degre_v);
372     binomialCoef(Bin, dbin);
373     #define Bin(i,j) (*(Bin+(i)*(dbin)+j))
374    
375     deriver_bs_kieme(nb_ptsctr_u,degre_u,knots_u,nb_ptsctr_v,degre_v,knots_v,u,v,d,ders);
376    
377     for(k=0;k<=d;++k)
378     {
379     for(l=0;l<=d-k;++l)
380     {
381     pv = ders(k,l);
382     for(j=1;j<=l;j++)
383     pv -= Bin(l,j)*ders(0,j).w()*skl(k,l-j) ;
384     for(i=1;i<=k;i++)
385     {
386     pv -= Bin(k,i)*ders(i,0).w()*skl(k-i,l) ;
387     pv2 = 0.0 ;
388     for(j=1;j<=l;j++)
389     pv2 += Bin(l,j)*ders(i,j).w()*skl(k-i,l-j) ;
390     pv -= Bin(k,i)*pv2 ;
391     }
392     skl(k,l) = pv;
393     skl(k,l) /= ders[0].w();
394     }
395     }
396     #undef skl
397     #undef ders
398     #undef Bin
399     }
400    
401    
402     void ST_B_SPLINE_SURF::deriver(double *uv,double *xyzdu, double *xyzdv)
403     {
404     OT_VECTEUR_4D skl[4];
405     double uvl[3];
406     uvl[0]=uv[0];
407     uvl[1]=uv[1];
408     if (sens==-1) uvl[0]=umin+umax-uvl[0];
409     deriver_kieme(uvl,1,skl);
410     #define skl(i,j) skl[(i)*(2)+j]
411    
412     for (int i=0; i<3; i++)
413     xyzdu[i] = sens * skl(1,0)[i];
414    
415     for (int i=0; i<3; i++)
416     xyzdv[i]=skl(0,1)[i];
417    
418     #undef skl
419     }
420    
421     void ST_B_SPLINE_SURF::deriver_seconde(double *uv,double* xyzduu,double* xyzduv,double* xyzdvv,double *xyz, double *xyzdu, double *xyzdv)
422     {
423     #define skl(i,j) skl[(i)*(3)+j]
424     OT_VECTEUR_4D skl[9];
425    
426     double uvl[3];
427     uvl[0]=uv[0];
428     uvl[1]=uv[1];
429     if (sens==-1) uvl[0]=umin+umax-uvl[0];
430     deriver_kieme(uvl,2,skl);
431    
432     for (int i=0; i<3; i++)
433     xyzduu[i]=skl(2,0)[i];
434    
435     for (int i=0; i<3; i++)
436     xyzduv[i] = sens * skl(1,1)[i];
437    
438     for (int i=0; i<3; i++)
439     xyzdvv[i]=skl(0,2)[i];
440    
441     if ((xyzdu!=NULL) && (xyzdv!=NULL ) )
442     {
443     for (int i=0; i<3; i++)
444     xyzdu[i] = sens * skl(1,0)[i];
445    
446     for (int i=0; i<3; i++)
447     xyzdv[i]=skl(0,1)[i];
448     }
449     if (xyz!=NULL)
450     {
451     for (int i=0; i<3; i++)
452     xyz[i]=skl(0,0)[i];
453     }
454    
455     unsigned kk, kkk;
456     double LIMITE = 1E99;
457     for (kk = 0; kk<3; kk++)
458     if ( (xyzduu[kk] > LIMITE ) || (xyzduv[kk] > LIMITE ) || (xyzdvv[kk] > LIMITE ) )
459     break;
460     if (kk < 3)
461     {
462     deriver_seconde(uv,xyzduu,xyzduv,xyzdvv,xyz, xyzdu, xyzdv);
463     printf("pb");
464     }
465    
466     #undef skl
467     }
468    
469     void ST_B_SPLINE_SURF::inverser(double *uv,double *xyz,double precision)
470     {
471     int code;
472     int num_point=(nb_ptsctr_u+nb_ptsctr_v)/2;
473     do
474     {
475     code=inverser2(uv,xyz,num_point,precision);
476     num_point=num_point*2;
477     }
478     while (code==0);
479     }
480    
481    
482     int ST_B_SPLINE_SURF::inverser2(double *uv,double *xyz,int num_test, double precision)
483     {
484     double uvi[2];
485     double xyz1[3];
486     double xyzdu[3];
487     double xyzdv[3];
488     double xyzduu[3];
489     double xyzduv[3];
490     double xyzdvv[3];
491     OT_VECTEUR_3D Pt(xyz[0],xyz[1],xyz[2]);
492     double a[4];
493     double delta[2];
494     double b[9];
495     double delta_u;
496     double delta_v;
497     double ui;
498     double vi;
499    
500     double distance_ref=1e308;
501     int refu;
502     int refv;
503    
504     for (int ii=0;ii<num_test+1;ii++)
505     {
506     double u=umin+ii*1./num_test*(umax-umin);
507     uvi[0]=u;
508     for(int jj=0;jj<num_test+1;jj++)
509     {
510     double v=vmin+jj*1./num_test*(vmax-vmin);
511     uvi[1]=v;
512     evaluer(uvi,xyz1);
513     OT_VECTEUR_3D S(xyz1[0],xyz1[1],xyz1[2]);
514     OT_VECTEUR_3D Distance = S-Pt;
515     double longueur=Distance.get_longueur2();
516     if (longueur<distance_ref)
517     {
518     distance_ref=longueur;
519     refu=ii;
520     refv=jj;
521     }
522     }
523     }
524    
525     double uii=umin+refu*1./num_test*(umax-umin);
526     double vii=vmin+refv*1./num_test*(vmax-vmin);
527     int compteur = 0;
528     do
529     {
530     compteur++;
531     ui=uii;
532     vi=vii;
533     uvi[0]=ui;
534     uvi[1]=vi;
535     deriver_seconde(uvi,xyzduu,xyzduv,xyzdvv,xyz1,xyzdu,xyzdv);
536     OT_VECTEUR_3D S(xyz1[0],xyz1[1],xyz1[2]);
537     OT_VECTEUR_3D Su(xyzdu[0],xyzdu[1],xyzdu[2]);
538     OT_VECTEUR_3D Sv(xyzdv[0],xyzdv[1],xyzdv[2]);
539     OT_VECTEUR_3D Suu(xyzduu[0],xyzduu[1],xyzduu[2]);
540     OT_VECTEUR_3D Suv(xyzduv[0],xyzduv[1],xyzduv[2]);
541     OT_VECTEUR_3D Svv(xyzdvv[0],xyzdvv[1],xyzdvv[2]);
542     OT_VECTEUR_3D Distance = S-Pt;
543     a[0]=Su.get_longueur2()+Distance*Suu;
544     a[1]=Su*Sv+Distance*Suv;
545     a[2]=Su*Sv+Distance*Suv;
546     a[3]=Sv.get_longueur2()+Distance*Svv;
547     b[0]=Distance*Su;b[0]=-b[0];
548     b[1]=Distance*Sv;b[1]=-b[1];
549     double delta=1./(a[0]*a[3]-a[2]*a[1]);
550     delta_u=delta*(b[0]*a[3]-b[1]*a[1]);
551     delta_v=delta*(a[0]*b[1]-a[2]*b[0]);
552     uii=ui+delta_u;
553     vii=vi+delta_v;
554     if (periodique_u==0)
555     {
556     if(uii<umin) uii=umin;
557     if(uii>umax) uii=umax;
558     }
559     if (periodique_v==0)
560     {
561     if(vii<vmin) vii=vmin;
562     if(vii>vmax) vii=vmax;
563     }
564     if (periodique_u==1)
565     {
566     if(uii<umin) uii=umax - (umin-uii);
567     if(uii>umax) uii=umin + (uii-umax);
568     }
569     if (periodique_v==1)
570     {
571     if(vii<vmin) vii=vmax - (vmin-vii);
572     if(vii>vmax) vii=vmin + (vii-vmax);
573     }
574     delta_u=uii-ui;
575     delta_v=vii-vi;
576     if (compteur>500) return 0;
577     }
578    
579     while ((fabs(delta_u)>precision)||(fabs(delta_v)>precision));
580     uv[0]=uii;
581     uv[1]=vii;
582     return 1;
583     }
584    
585     int ST_B_SPLINE_SURF::est_periodique_u(void)
586     {
587     return periodique_u;
588     }
589     int ST_B_SPLINE_SURF::est_periodique_v(void)
590     {
591     return periodique_v;
592     }
593     double ST_B_SPLINE_SURF::get_periode_u(void)
594     {
595     return periode_u;
596     }
597     double ST_B_SPLINE_SURF::get_periode_v(void)
598     {
599     return periode_v;
600     }
601     double ST_B_SPLINE_SURF::get_umin(void)
602     {
603     return umin;
604     }
605     double ST_B_SPLINE_SURF::get_umax(void)
606     {
607     return umax;
608     }
609     double ST_B_SPLINE_SURF::get_vmin(void)
610     {
611     return vmin;
612     }
613     double ST_B_SPLINE_SURF::get_vmax(void)
614     {
615     return vmax;
616     }
617    
618     int ST_B_SPLINE_SURF::get_type_geometrique(TPL_LISTE_ENTITE<double> &param)
619     {
620     for(int i=0;i<nb_ptsctr_u-(degre_u+1);i++)
621     {
622     param.ajouter(knots_u[i]);
623     }
624     for(int i=0;i<nb_ptsctr_v-(degre_v+1);i++)
625     {
626     param.ajouter(knots_v[i]);
627     }
628     double xyz[3];
629     for(int i=0;i<nb_point;i++)
630     {
631     param.ajouter(ptsctr[i].x()/ptsctr[i].w());
632     param.ajouter(ptsctr[i].y()/ptsctr[i].w());
633     param.ajouter(ptsctr[i].z()/ptsctr[i].w());
634     }
635     for(int i=0;i<nb_point;i++)
636     {
637     param.ajouter(ptsctr[i].w());
638     }
639     param.ajouter(degre_u);
640     param.ajouter(degre_v);
641     return MGCo_BSPLINES;
642     }
643    
644     void ST_B_SPLINE_SURF::initialiser(class ST_GESTIONNAIRE* gest)
645     {
646     for (int i=0;i<nb_point;i++)
647     {
648     ST_POINT* stpoint=gest->lst_point.getid(indexptsctr[i]);
649     double xyz[3];
650     stpoint->evaluer(xyz);
651     double w=1.0;
652     ptsctr.push_back(OT_VECTEUR_4D(w*xyz[0],w*xyz[1],w*xyz[2],w));
653     }
654    
655     periodique_u=1;
656     for (int i=0; i<nb_ptsctr_v; i++)
657     {
658     ST_POINT* point1_u=gest->lst_point.getid(indexptsctr[i]);
659     ST_POINT* point2_u=gest->lst_point.getid(indexptsctr[nb_ptsctr_v*(nb_ptsctr_u-1)+i]);
660     double xyz1[3];
661     double xyz2[3];
662     point1_u->evaluer(xyz1);
663     point2_u->evaluer(xyz2);
664     if ((!(OPERATEUR::egal (xyz1[0],xyz2[0],1E-10))) || (!(OPERATEUR::egal (xyz1[1],xyz2[1],1E-10))) || (!(OPERATEUR::egal (xyz1[2],xyz2[2],1E-10))))
665     {
666     periodique_u=0;
667     }
668     }
669     if (periodique_u==1)
670     {
671     int i=knots_u.size();
672     periode_u=(knots_u[i-1]-knots_u[0]);
673     }
674     else periode_u=0;
675     periodique_v=1;
676     for (int j=0; j<nb_ptsctr_u; j++)
677     {
678     ST_POINT* point1_v=gest->lst_point.getid(indexptsctr[j*nb_ptsctr_v]);
679     ST_POINT* point2_v=gest->lst_point.getid(indexptsctr[j*nb_ptsctr_v+nb_ptsctr_v-1]);
680     double xyz3[3];
681     double xyz4[3];
682     point1_v->evaluer(xyz3);
683     point2_v->evaluer(xyz4);
684     if ((!(OPERATEUR::egal (xyz3[0],xyz4[0],1E-10))) || (!(OPERATEUR::egal (xyz3[1],xyz4[1],1E-10))) || (!(OPERATEUR::egal (xyz3[2],xyz4[2],1E-10))))
685     {
686     periodique_v=0;
687     }
688     }
689     if (periodique_v==1)
690     {
691     int j=knots_v.size();
692     periode_v=(knots_v[j-1]-knots_v[0]);
693     }
694     else periode_v=0;
695     }
696    
697    
698    
699     void ST_B_SPLINE_SURF::est_util(ST_GESTIONNAIRE* gest)
700     {
701     util=true;
702     for (int i=0;i<nb_point;i++)
703     gest->lst_point.getid(indexptsctr[i])->est_util(gest);
704     }
705    
706    
707    
708     void ST_B_SPLINE_SURF::get_param_NURBS(TPL_LISTE_ENTITE<double> &param)
709     {
710    
711    
712     // The first parameter indicate the code access
713     param.ajouter(2);
714     // The follewing two parameters of the list indicate the orders of the net points
715    
716     param.ajouter(degre_u+1);
717     param.ajouter(degre_v+1);
718    
719     // The follewing two parameters indicate the number of rows and colons of the control points
720     // respectively to the two parameters directions
721    
722     param.ajouter(nb_ptsctr_u);
723     param.ajouter(nb_ptsctr_v);
724    
725     // this present the knot vector in the u-direction
726    
727     for(unsigned int i=0;i<knots_u.size();i++)
728     {
729     param.ajouter(knots_u[i]);
730     }
731    
732     //This present the knot vector in the v-direction
733    
734     for(unsigned int j=0;j<knots_u.size();j++)
735     {
736     param.ajouter(knots_v[j]);
737     }
738    
739    
740     for(unsigned int pt=0;pt<ptsctr.size();pt++)
741     {
742    
743     OT_VECTEUR_4D ctrpoint=ptsctr[pt];
744     for(int i=0;i<4;i++)
745     {
746     param.ajouter(ctrpoint[i]);
747     }
748    
749    
750    
751     }
752    
753    
754    
755    
756    
757    
758    
759    
760    
761    
762     }