用R语言怎么编B样条程序

Python098

用R语言怎么编B样条程序,第1张

static void(int[]group)

{

int temp

int pos=0

for(int i=0i<group.Length-1i++)

{

pos=i

for(intj=i+1j<group.Lengthj++)

{

if(group[j]<group[pos])

{

pos=j

}

}//第i个数与最小的数group[pos]交换

temp=group[i]

group[i]=group[pos]

B-样条曲线,是B-样条基函数的线性组合,是 贝塞尔曲线 的一般化。

给定n+1个控制点,P 0 ,P 1 , ..., P n 以及一个节点向量U = { u 0 ,u 1 , ..., u m }, p 次B-样条曲线由这些控制点和节点向量U 定义,其公式为:

在上式中, N i,p (u)是 p次B-样条基函数。

设U 是m + 1个非递减数的集合,u 0 <=u 1 <= u 2 <= ... <= u m 。u i 称为节点(knots), 集合U 称为节点向量(knot vector), 半开区间[u i , u i+1 ) 是第i个节点区间(knot span)。注意某些u i 可能相等,某些节点区间会不存在。如果一个节点u i 出现 k 次 (即,u i = u i+1 = ... = u i+k-1 ), 其中 k >1, u i 是一个重复度(multiplicity)为k 的多重节点,写为 u i (k)。 否则,如果u i 只出现一次,它是一个简单节点。如果节点等间距(即, u i+1 - u i 是一个常数,对 0 <= i <= m - 1),节点向量或节点序列称为均匀的;否则它是非均匀的。 一般情况下 ,我们经常使用 u 0 = 0和 u m = 1,所以定义域是闭区间[0,1]。

为了定义B-样条基函数,我们还需要一个参数,基函数的次数(degree)p,第i个p次B-样条基函数,写为N i,p (u),递归定义如下:

1.如果节点向量没有任何特别的结构,那么产生的曲线不会与控制折线(polyline)的第一边(leg)和最后一边(leg)接触,如下面左图所示。这种类型的B-样条曲线称为 。

2.我们可能想强制曲线使得它分别与第一个控制点和最后一个控制点的第一边和最后一边相切,像贝塞尔曲线那样。为了做到这些,第一个节点和最后一个节点必须是重复度为p+1。这就产生了所谓的 。参见下边中间的图。

3.通过重复某些节点和控制点,产生的曲线会是 。这种情况,产生的曲线的开始和结尾连接在一起形成了一个闭环如下边右图所示。

对于open(B-样条曲线),定义域是[u p ,u m-p ]

考虑一个由14个控制点(即,n = 13)定义的 6次 (即,p = 6) B-样条曲线。其节点的数目是 21 (即, m = n + p + 1 = 20)。如果节点向量是均匀的, 节点是0, 0.05, 0.10, 0.15, ..., 0.90, 0.95 和 1.0。 开(open)曲线定义在[u p , u m-p ] = [u6, u14] = [0.3, 0.7]上且与第一边和最后一边不相切。下面上图显示了曲线而下图给出了B-样条基函数。

有许多方法来产生闭曲线。简单的一种就是或者wrapping控制点或者wrapping节点向量。

假设我们想构建一个p次闭(closed)B-样条曲线C(u),由n+1 控制点P 0 ,P 1 , ..., P n .定义。节点数目是m+1, 其中 m = n + p + 1. 这儿是构建过程:

假设我们想要构建一个由n+1个控制点 P 0 , P 1 , ..., P n 定义的p次闭B-样条曲线C(u) 。构建过程如下:

本文旨在加深对B-样条曲线的理解,主要是对下述教程的总结,具体内容可以参考如下教程:

B-样条曲线教程