/* Subroutine to generate a nonuniform open knot vector proportional to the
chord lengths between defining polygon vertices
c = order of the basis function
chord = chord distance between defining polygon vertices
csum = accummulated sum of the chord distances from the first defining polygon vertex
maxchord = sum of the chord distances between defining polygon vertices
npts = the number of defining polygon vertices
nplusc = maximum value of the knot vector -- $n + c$
numerator = numerator of Eq. (5--86)
x() = array containing the knot vector
xchord = x-component of the distance between defining polygon vertices
ychord = y-component of the distance between defining polygon vertices
*/
#include
knotc(npts,c,b,x)
int npts,c;
float x[];
float b[];
{
int i,j;
int icount;
int nplusc,n;
float chord[31];
float maxchord;
float xchord,ychord,zchord;
float csum;
float numerator;
float temp1;
float temp2;
nplusc = npts + c;
n = npts - 1;
/* zero and redimension the knot vector and chord values */
for (i = 0; i <= npts; i++){
chord[i] = 0;
}
/* determine chord distance between defining polygon vertices and their sum */
maxchord = 0;
icount = 0;
for (i = 4; i <= 3*npts; i=i+3){
icount = icount + 1;
xchord = b[i]-b[i-3];
ychord = b[i+1]-b[i-2];
zchord = b[i+2]-b[i-1];
chord[icount] = sqrt(xchord*xchord + ychord*ychord + zchord*zchord);
maxchord = maxchord + chord[icount];
}
/* multiplicity of c=order zeros at the beginning of the open knot vector */
for (i = 1; i <= c; i++){
x[i] = 0;
}
/* generate the internal knot values */
for (i = 1; i <= n-c+1; i++){
csum = 0;
for (j = 1; j <= i; j++){
csum = csum + chord[j];
}
numerator = ((float)i)/((float)(n-c+2))*chord[i+1] + csum;
x[c+i] = (numerator/maxchord)*((float)(n-c+2));
}
/* multiplicity of c=order zeros at the end of the open knot vector */
for (i = n+2; i <= nplusc; i++){
x[i] = n-c+2;
}
}