B-样条曲线:系数计算

B-样条曲线:系数计算

B-spline Curves: Computing the Coefficients

                                                                                                                  

上一页重要性质                 回目录                         下一页特例     

 


  

尽管de Boor算法是一个计算对应于给定uB-样条曲线上的点的标准方法, 我们许多情况下(例如,曲线插值和逼近)真正需要的是这些系数。我们将阐述一个简单方法来做这个。

给定一个由 n+1个控制点P0, P1, ..., Pn, m+1个节点 u0=u1=...=up=0, up+1, up+2, ..., um-p-1, um-p=um-p+1=...= um=1定义的p clamped B-样条曲线。对于任何给定在[0,1]上的 u ,我们想计算系数N0,p(u), N1,p(u), ..., Nn,p(u) 。一个简单方法是使用下列递推关系:

 

 

但是这是一个非常耗时的过程。为了计算 Ni,p(u), 我们需要计算 Ni,p-1(u)Ni+1,p-1(u). 为了计算Ni,p-1(u), 我们需要计算Ni,p-2(uNi+1,p-2(u). 为了计算Ni+1,p-1(u), 我们需要Ni+1,p-2(u)Ni+2,p-2(u). 如你们所看到的, Ni+1,p-2(u)出现了两次,因此,递归计算会重复。当递归继续深入,会出现更多的重复计算。这与在页讨论的de Casteljau算法的递归版本很相似。因此,计算速度非常慢。

有容易的方法。设 u 在节点区间[uk,uk+1)上。. B-样条基函数的重要性质 说明最多 p+1p 次基函数在[uk,uk+1)上非零,即: Nk-p,p(u), Nk-p+1,p(u), Nk-p+2,p(u), ..., Nk-1,p(u), Nk,p(u)。通过定义,在 [uk,uk+1)上的0次仅有的非零基函数是Nk,0(u)。结果,从.Nk,0(u)出发计算系数是以一个 "fan-out" 三角形式,如下图所示:

 

因为在 [uk,uk+1)Nk,0(u) = 1而其他0B-样条基函数在[uk,uk+1)上是零,我们可以从 Nk,0(u)开始而计算1次基函数 Nk-1,1(uNk,1(u)。从这两个值,我们可以计算2次基函数 Nk-2,2(u), Nk-1,2(u) Nk,2(u)。这个过程重复直到所有p+1 个非零系数计算出来。

在这个计算中,内部值如 Nk-1,2(u)有一个西北向前驱 (即, Nk-1,1(u))和一个西南向的前驱 (即, Nk,1(u));上述三角如Nk-1,1(u)的东北方向边界上的值只有一个西南向前驱 (即, Nk,0(u));这个三角如 Nk,2(u)的东南方向边界上的值只有一个西北前驱 (即, Nk,1(u))。因此, 在东北 (resp., 东南)方向边界上的值使用定义中的递归关系的第二 (resp., 第一)项 。只有内部值使用全部两项。基于这个观察,我们有下列算法: 

输入 n, p, m, u, m+1 clamped 节点 { u0, ..., um }
输出:系数N0,p(u), N1,p(u), ..., Nn,p(u
N[0], N[1], ..., N[n]
算法

初始化 N[0..n 0; // 初始化
if u = u0 then //
排除特例

N[0] = 1.0;
return

else u = um then

N[n] = 1.0
return

end if

// 现在u u0 um 之间

u 在节点区间[uk,uk+1);
N[k] := 1.0 //  0
次系数
 
for d :=1 to p do //
次数 d 1 p

begin

N[k-d] = * N[(k-d)+1]; // 仅右边 (东南角) 
for i := k-d+1 to k-1 do //
计算中间项

N[i] := * N[i] + * N[i+1];

N[k] = * N[k]; // 仅左边 (西北角)

end

// 数组 N[0..n] 有系数。

上述算法不是很有效的算法。它的目的是为了以一个直觉容易理解的方式说明思想。 数组N[ ] 保存所有中间值和最后结果。对一个次数 d, N[i] 保存了Ni,d(u)的值,且,最后,N[k-d], N[k-d+1], ..., N[k] 含有非零系数。计算以 d=1开始因为我们知道仅有的非零基函数是 Nk,0(u)如果 u 在节点区间 [uk,uk+1)上。 外循环使得次数 d 1  p begin 后面的第一次赋值是仅使用一项(即,三角中的西南项, Nk-d+1,d-1(u)),计算 Nk-d,d(u 内部 for 循环计算内部项,而外循环中最后一个语句仅使用一项(即,三角中的西北项,  Nk,d-1(u)) 计算 Nk,d(u)

你能使这个算法更有效吗?

                                                                                                                  

上一页重要性质                 回目录                         下一页特例    

                                                                                      

 译注:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: c 是英语字母表中的第三个字母。在音标中,c 通常表示清辅音 /k/ 的音素,也有时表示浊辅音 /g/ 的音素。在汉语拼音中,c 表示的是清辅音 /ts/ 的音素,如拼音 cā 表示的是音节 /tsa/。此外,c 还可以作为罗马数字中的 100 表示。在化学元素周期表中,C 表示的是碳元素的符号。在数学中,c 通常被用作常数的表示,如在复数中 c 可以表示实数部分,z = a + bi 中,a 表示实数部分,b 表示虚数部分。c 还经常用来表示光速的常数,即 c = 299792458 米/秒。此外,c 在计算机科学中也有特殊含义,比如在编程语言中,c 可以表示字符类型的数据。 在生活中,c 还可以代表许多其他的事物,例如 c 型夹子、c 弯曲度、c 字形的道路等等。总的来说,c 在不同的领域和语境中有着不同的含义和用途,它作为一个字母或符号的存在,为人们的交流和表达提供了便利。无论是在语言、科学、数学还是工程领域,c 都有着重要的地位和应用。 ### 回答2: 对于"c"这个字母,它在不同语言和不同领域中都有着不同的含义和重要性。 首先,在英语中,“c”是英语字母表中的第三个字母。它的发音是/k/,如cat(猫),cup(杯子)等。在英语单词中,它通常有很多不同的使用方式,例如作为词首,代表“大量”或“使用溶液离子增强液晶显示器”等。 其次,在计算机科学中,“c”代表着编程语言C。C是一种高级程序设计语言,由Dennis M. Ritchie在20世纪70年代初开发出来,并成为一种广泛应用于系统软件和应用软件开发的语言。它被认为是一种快速、高效和可移植的语言,在很多计算机领域中都有重要的应用。 此外,在物理学中,“c”代表光速。光速是一个基本的物理常量,约为299,792,458米每秒。它在电磁学和相对论中有重要的地位,并被用作计算星际距离、测量时间和处理其他涉及光的物理现象的计算。 最后,在数学中,“c”通常代表复数的虚部。复数是由实数和虚数组成的数学概念。虚数是通过在实数之前添加"i"来表示的,而"i"则代表平方根的负数。对于一个复数,它可以写成a + bi的形式,其中a是实部,而bi是虚部。 总之,字母"c"在不同语言和不同领域中都有着不同的含义和重要性。无论是在英语中作为字母,还是在计算机科学、物理学和数学中作为一个符号或代表意义,它都扮演着不可忽视的角色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值