ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/step/src/stbsplines.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
File size: 21036 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

File Contents

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