B-Spline Global Interpolation
现在来考虑一个问题。在空间中有n个点,如何求过这n个点的曲线呢?比如,我们要求过已知点的三次B-Spline曲线,并且分别作为曲线的起点和终点。这样的问题我们称为B-Spline Global Interpolation。先来分析一下,我们已经知道,根据B-Spline曲线的定义,一个参数u就对应一个曲线上的点。或者说,一个时刻t就对应一个曲线上的点。这些点,在这里就是我们已知的这几个点。
于是,上面公式中,是我们已知的空间上的点,是该曲线的控制点,是未知的。 是曲线经过时的参数,也是未知的。我们知道,要得到一条B-Spline曲线,控制点和knot是不可少的。如果我们能计算出曲线经过时的,并且给出曲线的knots,那么我们根据上面的公式就可以得到一个线性方程组,解这个线性方程组就可以得到曲线的控制点。然后再根据这些控制点和我们给的knots,就可以得到我们要的曲线了。
先来看看曲线过点时参数的求法, 一般来说有三种方法。
平均法(equally spaced)
这种求knot的方法简单,但是不推荐。
弦长法(chord length)
令d为总的弦长
那么
这里推荐这种方法,弦长法也是最广泛使用的方法之一。使用这种方法求出的曲线是最理想的。
向心法
那么
求出了参数,现在来看看knots的求法,这里有两种方法。第一种方法,让每个knot的间隔都相等。那么有
这种方法仍然是不推荐的,这里推荐下面的方法,求出平均的knot。
上式中,p为曲线的次数,n为最后一个控制点的索引,m=n+p+1。
到这里,需要我们计算的东西都解决了,下面就是建立线性方程组并且求解的问题了。下面举个例子来说明。
例:
已知空间中的点 ,求:过这些点的三次B-Spline曲线。
根据前面内容讲的,先使用弦长法求曲线过这些点的参数u,然后使用平均法求出曲线的knots,再建立线性方程组求解即可。
那么根据题设,有
所以总弦长d=17,根据前面介绍的公式有
也就是说,曲线在过空间上的点的时候,参数u分别为0,5/17,9/17,14/17和1。
现在来求knots,同样根据公式有
那么该曲线的knots为
下面就是建立方程组了,由于曲线的起点和终点对应第一个通过的点和最后一通过的点,所以第一个通过的点和最后一个通过点也就是曲线的控制点。所以有
写成矩阵形式有
这里未知数就是P,解这个线性方程组求出控制点P后,再根据B-Spline曲线公式,带入控制点P和刚才求得的knots,就可以得到通过Q点的曲线了。
从上面图中是三次B-Spline曲线,可以看到是按照我们设定好的点来生成的。
*原创文章,转载请注明出处*