这里只是想记录一下积累的NURBS的相关知识,所以不打算介绍基础知识。如果大家有兴趣,可以去找些书看。The NURBS Book是本好书,就是国内没有卖……
首先是求点的方法,按照书上的递归公式当然是可行的,笔者也试过。但是仔细一看会有很多无用的计算。下面的代码展示了一种别的方法:
pt3d::Point3d NURBSCurve::evalPoint(double u) const
{
static std::vector<double> Nb;
int spanIndex = findSpan(u);
using namespace pt3d;
basisFuns(u, spanIndex, Nb);
Point3d p;
double bottom = 0;
for(int i = m_degree; i >= 0; --i)
{
p += m_ctrlPoints[spanIndex - m_degree + i] * Nb[i] * m_weights[spanIndex - m_degree + i];
bottom += Nb[i] * m_weights[spanIndex - m_degree + i];
}
p /= bottom;
return p;
}
可以看出,这里只计算了degree+1个顶点。值得注意的是Nb是个静态变量而不是临时变量,这样做的目的是为了提高速度,这里的方法都需要被多次调用,所以这些细小的优化也是很重要得。比如临时变量,无谓的循环等等是要尽量避免的。
findS