最近接触了一些关于NURBS的东东,有些和以前接触的不一样的或者不知道的。首先值得注意的是B样条基函数。这里是不用递归的算法(来自Nurbs++):
template <class T, int D>
void NurbsCurve<T,D>::basisFuns(T u, int i, Vector<T>& N) const{
T* left = (T*) alloca(2*(deg_+1)*sizeof(T)) ;
T* right = &left[deg_+1] ;
T temp,saved ;
N.resize(deg_+1) ;
N[0] = 1.0 ;
for(int j=1; j<= deg_ ; j++){
left[j] = u-U[i+1-j] ;
right[j] = U[i+j]-u ;
saved = 0.0 ;
for(int r=0 ; r<j; r++){
temp = N[r]/(right[r+1]+left[j-r]) ;
N[r] = saved+right[r+1] * temp ;
saved = left[j-r] * temp ;
}
N[j] = saved ;
}
}