At+B(1-t)+C(-4t²+4t)
B-样条曲线最终目的:只需要修改t值,就可以表述曲线上的任意点。
B样条曲线的基本参数中其实就几样,t,阶数,控制点列表,节点表,基本函数表
t值通过控制点和权重相乘计算得出的结果。

控制点列表代表一系列需要用户提供的顶点。

阶数越高,生成每个t值所需要的控制点数越多。阶数=所有权重中t值的最高次幂。(At+B(1-t)+C(-4t²+4t)二阶曲线)

节点表是生成基本函数表的关键参数,大小严格等于控制点数量+阶数+1。节点表的参数是人为设置的,一般设置的方法有两种:顺序方法和Clamped方法。前者用于制作标准的B-样条开曲线和闭曲线,后者用于制作一种比较实用的B-样条曲线。

顺序列表只需要从0-1线性递增设置即可,Clamped列表则需要将前后各阶数+1个节点设置成0。

举个例子就能讲的很清楚:假设曲线有6个控制点,阶数是3阶,那么节点表大小=6+3+1=10。

如果是顺序列表,只需要按顺序设置:0,1/9,2/9,3/9,4/9,5/9,6/9,7/9,8/9,1 ;

如果是Clamped列表,由于是3阶,前面3+1个参数均设置为0,后面3+1个参数均设置为1,然后剩余参数均匀递增:0,0,0,0,1/3,2/3,1,1,1,1 。

java中如何实现B样条曲线算法 b样条曲线公式_算法


knot代表节点,也就是我们前面提到的节点表。knoti代表节点表中的第i个元素。

而 Bi,deg(t)就是基本函数表的参数了。没错,基本函数表是一个二维数组。参数i和deg分别表示第几个元素和阶数。 所以 Bi,deg(t)的意思就是用户输入值为t时,基本函数表在第deg阶的第i个元素的值。

整个公式实际上是两个部分相加。而加号两侧的公式格式一致:一个通过节点表 knot 和 t 经过一系列计算得出的权重值和一个比当前更低一阶的基本函数表值的乘积。

B-样条算法规定,回退到0阶时使用以下公式:

java中如何实现B样条曲线算法 b样条曲线公式_java中如何实现B样条曲线算法_02


设最终t值在B-样条曲线的对应位置为 C(t) ,则最终B-样条曲线计算公式为:

java中如何实现B样条曲线算法 b样条曲线公式_java中如何实现B样条曲线算法_03


而 Pi 便是我们前面一直提到的控制点,而且在这里是第i个控制点。求和符号上的 n 表示控制点的总数。

java中如何实现B样条曲线算法 b样条曲线公式_java中如何实现B样条曲线算法_04