556 Chapter 11 Curves
Point X (float u)
{
float basis[d + 1][n+d+1]; //basis[j][i] = N(i,j)
// Get i for which u[i] <=u<u[i+1].
i = GetKey(u);
// Evaluate left diagonal and right vertical edges.
for (j = 1; j <= d; j++)
{
c0 = (u - u[i]) / (u[i + j] - u[i]);
c1=(u[i+1]-u)/(u[i+1]-u[i-j+1]);
basis[j][i] = c0 * basis[j-1][i];
basis[j][i - j] = c1 * basis[j - 1][i-j+1];
}
// Evaluate interior.
for (j = 2; j <= d; j++)
{
for(k=i-j+1;k<i;k++)
{
c0 = (u - u[k]) / (u[k + j] - u[k]);
c1=(u[k+j+1]-u)/(u[k+j+1]-u[k+1]);
basis[j][k] = c0 * basis[j - 1][k] * fInvD0 +
c1 * basis[j - 1][k + 1];
}
Point result = ZERO;
for(j=i-d;j<=i;j++)
{
result += basis[d][j] * B[j];
}
return result;
}
The only remaining issue is how to compute index i from the input parameter u.
For optimal efficiency ...