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