B-spline Curves: Important Properties

 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习。

 (原来博客网址:http://blog.csdn.net/tuqu/article/details/4749586)

 原来的博主翻译还是很好的,所以前几章节直接借鉴参考原博主的内容。


  B-样条曲线有很多与贝塞尔曲线一样的重要性质,因为前者是后者的推广。而且,B-样条曲线有比贝塞尔曲线更渴望的性质。下面列出B-样条曲线一些最重要的性质。

  接下来我们假设一个由n + 1 控制点和一个节点向量U = { u0, u1, ...., um } 定义的 pB-样条曲线C(u),其中头p+1个和最后 p+1个节点是 "clamped" (即,u0 = u1 = ... = upum-p = um-p+1 = ... = um).

(1) 1.  B-样条曲线是个逐段曲线,每个分量是p次曲线。

  如前页提到的, C(u) 可看作是定义在每个节点区间的曲线段的联合。在下图中,其中n = 10, m = 14 和 p = 3, 头四个节点和最后四个节点是clamped而中间7个节点上均匀分布的。有8个节点区间,每个对应于一个曲线段。在下面左图,这些节点点以三角形标示。

  这个良好性质使得我们可以以更低次多项式来设计复杂形状。例如,下面右图显示了相同控制点的贝塞尔曲线。即使在其次数达到10仍然不能很好逼近控制折线 (polyline)!

  

  一般,次数越低,B-样条曲线越逼近它的控制折线(polyline)。下图都使用相同的控制折线(polyline)且节点是 clamped且 均匀分布。 第一个图是7次,中间的是5次而右图是3次。因此,当次数减小,产生的B-样条曲线越接近它的控制折线(polyline)。

    

(2) 等式 m = n + p + 1必须满足。

  由于每个控制点需要一个基函数且基函数数目满足 m = n + p + 1。

(3) Clamped B-样条曲线C(u)通过首尾两个控制点 P0 和Pn

  注意基函数N0,p(u) 是控制点 P0 的系数且在[u0,up+1)上非零因为对于一个clamped B-样条曲线有 u0 = u1 = ... = up = 0, N0,0(u), N1,0(u), ...., Np-1,0(u)为零且只有 Np,0(u)是非零(回忆三角计算格式) 因此,如果u = 0,那么N0,p(0)是1且C(0) = P0。相似地可得到C(1) = Pn

(4) 样条曲线包含在控制折线(ployline)的凸包内。更特别地,如果u 在节点区间[ui,ui+1)里,那么C(u)在控制点Pi-p, Pi-p+1, ..., Pi的凸包里。

  如果u 在节点区间 [ui, ui+1)里,那么只有p+1 个基函数(即,Ni,p(u), ... , Ni-p+1,p(u), Ni-p,p(u))在该节点区间非零。因为 Nk,p(u) 是控制点 Pk的系数,只有 p+1个控制点 Pi, Pi-1, Pi-2, .., Pi-p 有非零系数。因为在该节点区间上的基函数非零且累加和为 1,它们的“权重”平均( "weighted" average), C(u), 必须位于由控制点 Pi, Pi-1, Pi-2, .., Pi-p定义的凸包内。 “强”的意思是当 C(u) 仍位于由所有控制点定义的凸包内,它位于更小的里面。

   

  上面两个 B-样条曲线有11个控制点(即,n = 10), 3次 (即, p=3)  及15 个节点 (m = 14),其中头四个和最后四个节点 是 clamped。因此,节点区间的数目等于曲线段的数目。节点向量是

  

  左图有u 在节点区间 [u4, u5) = [0.12,0.25)上且相应的点(即 C(u))在第二条曲线段上。因此,有p+1 = 4 个基函数在给节点区间(即,N4,3(u), N3,3(u), N2,3(u) 和 N1,3(u) )上非零且相应的控制点是P4, P3, P2 and P1。阴影部分是由这四个点定义的凸包。很清楚C(u) 位于凸包内。

  右图的B-样条曲线同样方式定义。 但是,u 是在[u9, u10) = [0.75,0.87)上且非零基函数是 N9,3(u), N8,3(u), N7,3(u) 和N6,3(u)。 相应的控制点是 P9, P8, P7 和 P6

  因此,当  u 从 0移到1并越过一个节点时,一个基函数变为零而一个新的非零基函数开始有效。结果是,系数变为零的控制点会离开当前凸包的定义而被一个新的系数变为非零的控制点所代替。

(5) Pi 只影响在区间[ui, ui+p+1)上的曲线 C(u)

  这是从B-样条基函数的一个重要性质得到。回忆Ni,p(u) 在区间[ui, ui+p+1)上非零。. 如果u 不在该区间, Ni,p(u)Pi 在计算computing C(u)时没有作用因为 Ni,p(u)是零。另一方面,如果u 是指示的区间, Ni,p(u) 非零。如果 Pi 改变它的位置, Ni,p(u)Pi 被改变导致C(u)被改变。

    

  上面B-样条曲线以在前面凸包例子一样的参数定义。我们想移动控制点P2 。控制点的系数是N2,3(u) 且有非零系数在其上的区间是 [u2, u2+3+1) = [u2, u6) = [0,0.37)。因为 u2 = u3 = 0,只有三段被影响,分别是对应 u3, u4) 的(第一个曲线段的定义域), [u4, u5) (第二个曲线段的定义域) 和[u5, u6) (第三个曲线段的定义域) 。右图显示的是移动 P2 到右下角的结果。正如你看到的,只有第一,第二和第三曲线段改变了形状而剩余其他曲线段保持在原来位置没有改变。

  局部修改方案对曲线设计非常重要,因为我们可以局部修改曲线而不需全局改变形状。这将在 moeing control point 页详细说明。而且,如果需要更精细调整曲线形状,可以插入更多节点(因而更多控制点)以至于被影响的区域被限制在很窄区域。以后我们会谈到节点插入。

(6) C(u) 在重复度 k 的节点上是Cp-k 连续的

  如果 u 不是一个节点, C(u) 是p 次曲线段的中部因而是无限可微的。如果 u 是在 Ni,p(u)的非零定义域中的一个节点,既然后者是Cp-k 连续的,C(u)也一样。

  

  上图B-样条曲线有18个控制点 (即, n = 17),  4次(degree),clamped节点向量如下

  

  因此, u6 是一个双重节点, u9是一个三重节点而u13 是一个四重节点。因此, C(u) 在不是节点的任何点是 C4 连续的,在所有简单节点处 C3 连续的,在 u6C2 连续的,在u9C1 连续的,在u13C0 连续的。

  在曲线上与节点相对应的所有点用小三角标记。那些对应于多重节点的点用圆和重复度标记。要可视化 C4, C 3 和甚至C2 连续性之间的差别是很困难的。对 C1 情况,相应的点位于一条边(leg)上,而 C0 情况迫使曲线通过一个控制点。我们会在后面讨论修改节点时返回这个问题。

(7) 变分减小性质

  变分减小性质度对B-样条曲线也成立。如果曲线在平面(resp., 空间)上,这意味着没有直线(resp., 平面) 与 B-样条曲线相交的次数多于它与曲线控制折线(polyline)相交的次数

  

  在上图中,蓝线与控制折线(polyline)和B-样条曲线都相交6次,而黄线也与控制折线和B-样条曲线相交 5次。但是,橘黄线与控制折线相交 6次和曲线相交4次。

(8) 贝塞尔曲线是B-样条曲线的特例

  如果 n = p (即,B-样条曲线的次数是n, 控制点的数目减1有 2(p + 1) = 2(n + 1)个节点,其中 p + 1个在端(end)处clamped,这个B-样条曲线退化到贝塞尔曲线。

(9) 仿射不变性

  仿射不变性对B-样条曲线也成立。如果一个仿射变换应用于B-样条曲线,得到的结果可以从它的控制点的仿射像(images)构建得到。这是一个好性质。当我们要对B-样条曲线应用一个几何或仿射变换,这条性质说明我们可以对控制点进行变换,而这相当容易,而且一旦获得了这些变换后的控制点,变换B-样条曲线就是这些新点定义的。因此,我们不需要对曲线进行变换。

2. 使用B-样条曲线的优点

  B-样条曲线比贝塞尔曲线需要更多信息(即,曲线的次数和一个节点向量 )和更复杂的理论。但是它有更多优点来弥补这个缺点。

(1) 一个B-样条曲线可以是一个贝塞尔曲线。

(2) B-样条曲线满足贝塞尔曲线有的所有重要性质。

(3) B-样条曲线提供了比贝塞尔曲线更灵活的控制。

  例如,一个B-样条曲线的次数与控制点数目是分开的。更准确地说,我们可以使用更低次曲线而仍然保持很多控制点。我们可以改变一个控制点位置而不会全局地改变整个曲线形状(局部修改性质)。因为B-样条曲线满足强凸包性质,它们可以进行更精细的形状控制。而且,还有其他设计和编辑形状的技术比如改变节点。

  但是,记住B-样条曲线仍然是多项式曲线而多项式曲线不能表示许多有用的简单的曲线比如圆和椭圆。因此,需要B-样条的一个推广,NURBS。后面会讨论 NURBS 。

  

  

B-spline Curves 学习之B样条曲线性质(5)的更多相关文章

  1. B-spline Curves 学习之B样条曲线的移动控制点、修改节点分析(7)

    B-spline Curves: Moving Control Points 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习 ...

  2. B-spline Curves 学习之B样条曲线的系数计算与B样条曲线特例(6)

    B-spline Curves: Computing the Coefficients 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关 ...

  3. B-spline Curves 学习之B样条曲线定义(4)

    B-spline Curves: Definition 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:h ...

  4. B-spline Curves 学习之B样条曲线的导数(8)

    Derivatives of a B-spline Curve 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客 ...

  5. B-spline Curves 学习前言与动机(1)

    B-spline Curves 学习之前言 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:http:// ...

  6. B-spline Curves 学习之B样条基函数的定义与性质(2)

    B-spline Basis Functions 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:http ...

  7. B-spline Curves 学习之B样条基函数计算实例(3)

    B-spline Basis Functions: Computation Examples 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完 ...

  8. [Thiinking in Java]自闭学习之路(一)构造器

    前言- 本文是为个人学习做的整理性质的笔记,肯定带有许多不妥的地方,仅供参考. (第五章·初始化与清理 <Thinking in Java>) 用构造器确保初始化 正文- 构造器: 什么是 ...

  9. 深度学习基础-基于Numpy的多层前馈神经网络(FFN)的构建和反向传播训练

    本文是深度学习入门: 基于Python的实现.神经网络与深度学习(NNDL)以及花书的读书笔记.本文将以多分类任务为例,介绍多层的前馈神经网络(Feed Forward Networks,FFN)加上 ...

随机推荐

  1. 【开源推荐】PredictionIO:构建预测功能的机器学习服务器

    PredictionIO是一款开源的机器学习服务器,开发工程师和数据分析师可以使用它构建智能应用程序,并且还可以做一些预测功能,比如个性化推荐.发现内容等.好比开发者可以使用数据库服务器过滤信息. P ...

  2. RK3288 GT触摸屏移植调试

    CPU:RK3288 系统:Android 5.1 IC:GT911 1.在 menuconfig 或者 rockchip_defconfig 中支持触摸屏.具体用哪种方式需要结合编译方法. 按照瑞芯 ...

  3. GCC参数详解 二

    1简介 2简单编译 2.1预处理 2.2编译为汇编代码(Compilation) 2.3汇编(Assembly) 2.4连接(Linking) 3多个程序文件的编译 4检错 5库文件连接 5.1编译成 ...

  4. Windows Server 2012/win8 iis8 上安装 asp.net 4.5 当时用了mvc5 .net framework 4.5 所以得装下

    vs2013+mvc5 +.net framework 4.5  本地 iisexpress 调试一点问题没有,当部署到本机iis时 出现 无法识别 modules错误,具体错误提示是: 锁定是默认设 ...

  5. Java-Runoob-高级教程-实例-字符串:03. Java 实例 - 删除字符串中的一个字符

    ylbtech-Java-Runoob-高级教程-实例-字符串:03. Java 实例 - 删除字符串中的一个字符 1.返回顶部 1. Java 实例 - 删除字符串中的一个字符  Java 实例 以 ...

  6. adb端口占用及模拟器调试

    首先在使用ADB前所有手机辅助类软件 1.CMD命令窗口输入:adb nodaemon server .然后就会提示你哪个端口被占用了. 2.输入netstat -ano | findstr &quo ...

  7. MTU&MSS

    MTU是Maximum Transmission Unit的缩写,意为最大传输单元,通俗的理解就是在网络上传送的最大数据包,单位是字节. 以太网对数据帧的长度都有一个限制,其最大值为1500,这个特性 ...

  8. JavaScript Promise的学习笔记

    首先声明:本人今天刚接触Promise,通过一个例子,希望能更好的来理解,如果有不对的地方,还望指正 Promise是专门为解决 js中回调而引起的各种问题,而产生的. 在异步编程中,我们经常使用回调 ...

  9. Redis 哨兵模式 带密码单机

    语法 https://segmentfault.com/a/1190000002680804 启动3台redis 6379,6380,6381 cp 多个redis.conf文件 开启daemoniz ...

  10. pac (PAC(Proxy Auto Config) 是一个 Script;经由编写这个 Script,我们可以让系统判断在怎么样的情形下,要利用哪一台 Proxy 来进行联机。)

    PAC自动代理文件格式,教你如何写PAC文件 PAC文件格式 PAC文件是纯文本格式的,实际上就是JavaScript文件.Chrome/Chromium的扩展Switchy!的"Auto ...