/* Subroutine to generate B-spline basis functions for open knot vectors C code for An Introduction to NURBS by David F. Rogers. Copyright (C) 2000 David F. Rogers, All rights reserved. Name: basis.c Language: C Subroutines called: none Book reference: p. 279 c = order of the B-spline basis function d = first term of the basis function recursion relation e = second term of the basis function recursion relation npts = number of defining polygon vertices n[] = array containing the basis functions n[1] contains the basis function associated with B1 etc. nplusc = constant -- npts + c -- maximum number of knot values t = parameter value temp[] = temporary array x[] = knot vector */ #include basis(c,t,npts,x,n) int c,npts; int x[]; float t; float n[]; { int nplusc; int i,k; float d,e; float temp[36]; nplusc = npts + c; /* printf("knot vector is \n"); for (i = 1; i <= nplusc; i++){ printf(" %d %d \n", i,x[i]); } printf("t is %f \n", t); */ /* calculate the first order basis functions n[i][1] */ for (i = 1; i<= nplusc-1; i++){ if (( t >= x[i]) && (t < x[i+1])) temp[i] = 1; else temp[i] = 0; } /* calculate the higher order basis functions */ for (k = 2; k <= c; k++){ for (i = 1; i <= nplusc-k; i++){ if (temp[i] != 0) /* if the lower order basis function is zero skip the calculation */ d = ((t-x[i])*temp[i])/(x[i+k-1]-x[i]); else d = 0; if (temp[i+1] != 0) /* if the lower order basis function is zero skip the calculation */ e = ((x[i+k]-t)*temp[i+1])/(x[i+k]-x[i+1]); else e = 0; temp[i] = d + e; } } if (t == (float)x[nplusc]){ /* pick up last point */ temp[npts] = 1; } /* put in n array */ for (i = 1; i <= npts; i++) { n[i] = temp[i]; } }