9 A = B = C = E = F = G = I = J = K = 0;
18 this->A = P3.i-3*P2.i+3*P1.i-P0.i;
19 this->B = 3*P2.i-6*P1.i+3*P0.i;
20 this->C = 3*P1.i-3*P0.i;
23 this->E = P3.j-3*P2.j+3*P1.j-P0.j;
24 this->F = 3*P2.j-6*P1.j+3*P0.j;
25 this->G = 3*P1.j-3*P0.j;
28 this->I = P3.k-3*P2.k+3*P1.k-P0.k;
29 this->J = 3*P2.k-6*P1.k+3*P0.k;
30 this->K = 3*P1.k-3*P0.k;
36 QVector res( (A*t*t*t+B*t*t+C*t+D), (E*t*t*t+F*t*t+G*t+H), (I*t*t*t+J*t*t+K*t+L) );
47 double * VECCholeskyTriDiagResol(
double *B,
int nb )
58 LDiag =
new double[nb];
59 LssDiag =
new double[(nb-1)];
61 LDiag[Debut] = 1.4142135;
62 LssDiag[Debut] = 1.0/1.4142135;
63 for (K = Debut+1; K <= Fin-1; K++) {
64 LDiag[K] =
sqrt( 4-LssDiag[K-1]*LssDiag[K-1] );
65 LssDiag[K] = 1.0/LDiag[K];
67 LDiag[Fin] =
sqrt( 2-LssDiag[Fin-1]*LssDiag[Fin-1] );
70 Y[Debut] = B[Debut]/LDiag[Debut];
71 for (I = Debut+1; I <= Fin; I++)
72 Y[I] = (B[I]-Y[I-1]*LssDiag[I-1])/LDiag[I];
73 Result =
new double[nb];
74 assert( LDiag[Fin] != 0 );
75 Result[Fin] = Y[Fin]/LDiag[Fin];
76 for (I = Fin-1; I >= Debut; I--) {
77 assert( LDiag[I] != 0 );
78 Result[I] = (Y[I]-Result[I+1]*LssDiag[I])/LDiag[I];
94 double ** MATInterpolationHermite(
double *ordonnees,
int nb )
104 if ( ordonnees != 0 && (nb > 0) ) {
108 bb[0] = 3*(ordonnees[1]-ordonnees[0]);
109 bb[n] = 3*(ordonnees[n]-ordonnees[n-1]);
110 for (i = 1; i <= n-1; i++)
111 bb[i] = 3*(ordonnees[i+1]-ordonnees[i-1]);
112 deriv = VECCholeskyTriDiagResol( bb, nb );
115 for (i = 0; i <= n-1; i++) {
116 m[i] =
new double[4];
119 c = 3*(ordonnees[i+1]-ordonnees[i])-2*deriv[i]-deriv[i+1];
120 d = -2*(ordonnees[i+1]-ordonnees[i])+deriv[i]+deriv[i+1];
122 fa[3] = a+i*(i*(c-i*d)-b);
123 fa[2] = b+i*(3*i*d-2*
c);
139 double MATValeurSpline(
double **spline,
double x,
int nb )
149 else i = (
int) floor( x );
151 if ( i == (nb-1) ) i--;
153 res = ( (sa[0]*x+sa[1])*x+sa[2] )*x+sa[3];
154 }
else {res = 0; }
return res;
159 double MATValeurSplineSlope(
double **spline,
double x,
int nb )
169 else i = (
int) floor( x );
171 if ( i == (nb-1) ) i--;
173 res = (3*sa[0]*x+2*sa[1])*x+sa[2];
174 }
else {res = 0; }
return res;
201 MatX = MATInterpolationHermite( X, FNb );
202 MatY = MATInterpolationHermite( Y, FNb );
203 MatZ = MATInterpolationHermite( Z, FNb );
212 for (
int i = 0; i < FNb-1; i++) {
230 return QVector( MATValeurSpline( MatX, t, FNb ), MATValeurSpline( MatY, t, FNb ), MATValeurSpline( MatZ, t, FNb ) );
235 #ifdef SPLINE_METHOD3
249 void SplinePoint(
int *u,
int n,
int t,
double v, XYZ *control, XYZ *output )
257 for (k = 0; k <= n; k++) {
258 b = SplineBlend( k, t, u, v );
259 output->x += control[k].x*
b;
260 output->y += control[k].y*
b;
261 output->z += control[k].z*
b;
271 double SplineBlend(
int k,
int t,
int *u,
double v )
275 if ( (u[k] <= v) && (v < u[k+1]) )
280 if ( (u[k+t-1] == u[k]) && (u[k+t] == u[k+1]) )
282 else if (u[k+t-1] == u[k])
283 value = (u[k+t]-
v)/(u[k+t]-u[k+1])*SplineBlend( k+1, t-1, u, v );
284 else if (u[k+t] == u[k+1])
285 value = (v-u[k])/(u[k+t-1]-u[k])*SplineBlend( k, t-1, u, v );
287 value = (v-u[k])/(u[k+t-1]-u[k])*SplineBlend( k, t-1, u, v )
288 +(u[k+t]-
v)/(u[k+t]-u[k+1])*SplineBlend( k+1, t-1, u, v );
300 void SplineKnots(
int *u,
int n,
int t )
303 for (j = 0; j <= n+t; j++) {
319 void SplineCurve( XYZ *inp,
int n,
int *knots,
int t, XYZ *outp,
int res )
322 double interval, increment;
325 increment = (n-t+2)/(
double) (res-1);
326 for (i = 0; i < res-1; i++) {
327 SplinePoint( knots, n, t, interval, inp, &(outp[i]) );
328 interval += increment;
330 outp[res-1] = inp[n];
339 XYZ inp[N+1] = {0.0, 0.0, 0.0, 1.0, 0.0, 3.0, 2.0, 0.0, 1.0, 4.0, 0.0, 4.0};
342 #define RESOLUTION 200
343 XYZ outp[RESOLUTION];
345 int main(
int argc,
char **argv )
349 SplineKnots( knots, N, T );
350 SplineCurve( inp, N, knots, T, outp, RESOLUTION );
354 printf(
"{ = SKEL\n" );
355 printf(
"%d %d\n", RESOLUTION, RESOLUTION-1 );
356 for (i = 0; i < RESOLUTION; i++)
357 printf(
"%g %g %g\n", outp[i].x, outp[i].
y, outp[i].z );
358 for (i = 0; i < RESOLUTION-1; i++)
359 printf(
"2 %d %d 1 1 1 1\n", i, i+1 );
363 printf(
"{ = SKEL 3 2 0 0 4 0 0 0 4 0 0 2 0 1 0 0 1 1 2 1 2 0 0 1 1 }\n" );
366 printf(
"{ = SKEL\n" );
367 printf(
"%d %d\n", N+1, N );
368 for (i = 0; i <= N; i++)
369 printf(
"%g %g %g\n", inp[i].x, inp[i].y, inp[i].z );
370 for (i = 0; i < N; i++)
371 printf(
"2 %d %d 0 1 0 1\n", i, i+1 );