B-spline Curves 学习之B样条曲线的移动控制点、修改节点分析(7)
B-spline Curves: Moving Control Points
本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习。
(原来博客网址:http://blog.csdn.net/tuqu/article/details/4749586)
原来的博主翻译还是很好的,所以前几章节直接借鉴参考原博主的内容。
B-样条曲线:移动控制点
移动控制点是改变B-样条曲线形状的最明显的方法。在前面页讨论的局部修改方案说明了修改控制点 Pi 的位置仅影响在区间[ui, ui+p+1)上的曲线 C(u) 。其中 p 是B-样条曲线的次数。实际上,形状的改变是在控制点被移动方向上的 t平移 。更准确地,如果控制点Pi向某个方向移动到一个新位置Qi ,那么点C(u),其中 u 在[ui, ui+p+1)上,会以相同方向从Pi 移动到 Qi。 但是,移动的距离点与点之间是不同的。下图中,控制点 P4 从左图位置移到中图新位置最后到右图最终位置。可看到那些对应节点的点(小三角标记)也以相同方向移动。
让我们看些细节。假设C(u) 是一个给定的p 次B-样条曲线定义如下:
设控制点 Pi 被移动到一个新位置Pi + v. 。那么,新 p 次B-样条曲线 D(u)如下:
因此,新曲线D(u)是简单的原始曲线C(u)的和以及一个平移向量Ni,p(u)v。 因为 Ni,p(u)在区间 [ui,ui+p+1)上非零,如果u 不在该区间,这个“平移”项为零。因此,移动一个控制点仅影响给定曲线部分形状。 下面左曲线是个由13个控制点 control points (即, n = 12)和18个节点(即, m = 17)定义的4次 (即, p = 4)B-样条曲线 。这些18个节点都是简单的并定义了一个clamped曲线(即,u0 = u1 = u2 = u3 = u4 = 0 和 u13 = u14 = u15 = u16 = u17 = 1)。剩余的节点定义了9个节点区间,因此如图所示有9个曲线段。这9个节点区间和曲线段命名如下:
现在让我们移动 P6。结果显示在上面右图。如你们所看到的,曲线以同样方向移动。P6 的系数是 N6,4(u), 其在[u6, u11)上非零。因此,移动 P6 影响曲线段3, 4, 5, 6 和7。曲线段1, 2, 8和9不受影响。
来自强凸包性质的有用结果
回忆 强凸包性质,如果u位于 [ui,ui+1),那么 C(u) 位于由控制点Pi, Pi-1, ..., Pi-p+1, Pi-p定义的凸包内。这有助于帮助我们进行下列设计任务:
(1)强制曲线段变成直线段:让p+1 相邻控制点共线。
如果 u 位于节点区间 [ui,ui+1)上,那么C(u) 位于由 p+1个控制点Pi, Pi-1, ..., Pi-p+1, Pi-p定义的凸包内。因为这对所有在该区间的u 都成立,所以在该节点区间的曲线段完全位于该凸包内。如果所有这些 p+1 个控制点是共线的(即,在一条直线上),凸包退化到线段,它所包含的曲线段也是如此。 结果,在节点区间 [ui,ui+1)上的曲线段变成了直线段。注意在这个情况下只有这个曲线段变成了直线段。其他曲线段仍然是非线性的。
让我们来看一个例子。上面的图由 n = 15 (即,16个控制点), p = 3 (次数为3) 和m = 19 (即,20个节点)。注意头四个和最后四个节点是clamped。图 (a)是给定的B-样条曲线。 让我们使得P9, P8, P7 和P6 共线。因此,在 [u9,u10)上的曲线段位于由 P9, P8, P7 和P6定义的凸包内。 因为这个凸包是直线段,所以曲线段也必须是直线段。记住头四个节点是clamped因此头三个节点区间不存在。因为[u9,u10)是第7个节点区间,第7段退化为直线段P7P8。这通过图 (b), (c) 和 (d)说明。
但是,为什么在 [u9,u10)上的曲线段只退化到曲线段? 看图(b)。阴影部分区域是 u 刚要进入enters [u9,u10)前的凸包。这个凸包由控制点 P8, P7, P6 和 P5定义,其还不是一条直线段。 一旦 u 进入[u9,u10),曲线段退化 (图 (c)).在u 离开[u9,u10)的同时,出现了一个新的凸包(图(d))。
图 (e) 有 P5 及其四个后继共线。该曲线包含多于一个直线段。 图 (f) 有 P10 和它的5个后继共线;但是,它被移动到P8 和 P9之间的位置。这导致相应曲线段的部分成为一条直线(为什么?)
(2)强制B-样条曲线经过一个控制点:让p个相邻控制点重合(identical )
考虑控制点Pi。因为在节点区间 [ui, ui+1)上的曲线段完全位于由Pi, ..., Pi-p+1,Pi-p定义的凸包内,如果我们使得前p 个控制点重合(即, Pi = Pi-1 = ... = Pi-p+1),凸包退化为一条直线段, Pi-pPi 而曲线必经过Pi。
上面左图的曲线是3次的。如果 P5 移到与 P6重合,曲线也移动更接近 P6 但还没有经过它。这如中图所示。注意曲线段的数目没有因为这个移动而改变;但是 P5 附近的小三角标记移动到更接近 P6。 如果 P4 被移到与P6 = P5 重合,曲线经过P6 且对应于节点的点因为移动而与控制点P4 重合。
(3) 强制B-样条曲线与控制折线的一边相切:让Pi-p, Pi-p+1 = Pi-p+2 = .... = Pi-1 = Pi 及Pi+1 共线
上面将 p 个相邻控制点重合。在那个控制点上,连续性是C0 因为曲线有一个尖头(见上面右图)。 但是,一个B-样条曲线在简单节点上是 Cp-1 在其他空间是无限可微的,在边Pi-pPi 上的控制点 Pi 上的曲线是Cp-1 连续的(退化控制点重新编号为i)而在边PiPi+1 上的控制点Pi 也是 Cp-1 连续的。因此,如果我们使得 Pi-p, Pi 和 Pi+1 共线,只要两个相邻曲线段在该节点上没有尖头,它们在 Pi是Cp-1 连续的。
在上面图中,曲线的次数是 2。如果我们使得控制点2, 3, 4 和 5 共线而 3 和 4 重合,我们得到右图。共线保证了曲线段位于直线上而重合控制点强制 C3-1 = C2 连续。
B-spline Curves: Modifying Knots
B-样条曲线:修改节点
因为B-样条曲线是许多曲线段的组合,每个定义于一个节点区间上,修改一个或多个节点位置会改变相应的曲线段和节点区间,因此改变曲线的形状。
下图描述了修改一个单节点的效果。它是一个6次B-样条曲线,有17个节点,最前7个和最后7个在端点上是clamped,而内部节点是0.25, 0.5 和 0.75。初始曲线在左图显示。如果节点0.25 移动到0.1,曲线的形状改变,原来的C(0.25)向下移动到一个新位置。如果节点0.5移动到 0.1使得节点0.1变成一个双重节点 (重复度2),曲线的形状移动到左边;但是C(0.1) 向上移动到接近原始点(即,原来的 C(0.25))的位置。结果显示在右图。尽管我们在 0.1 有一个双重节点以及在0.75另一个节点非均匀地将定义域[0,1] 划分成三个节点区间,B-样条曲线被它们相应点几乎均匀地划分。
下图显示了三条曲线的形状的改变,每个由 10 (n=9)个控制点定义,次数是6。它们内部节点向量是 (0.25,0.5,0.75) - 红色曲线, (0.25,0.25,0.75) - 蓝色曲线, (0.25,0.25,0.25) -黑色曲线。
实际经验告诉我们修改节点位置不仅不可预测而且不令人满意。更准确地说,因为不清楚B-样条曲线会对节点向量的改变作怎样的反应,通过改变节点来修改B-样条曲线 通常都不令人满意而且很难达到设计目的。
关于多重节点的评注
多重节点对产生期望的结果有帮助。回忆前面讨论的多重节点的性质,增加一个内部节点的重复度会减小在该节点的非零基函数的数目。实际上,如果该节点的重复度是 k, 最多在该节点上有 p - k + 1 个非零函数。而且,在该节点的基函数是Cp-k 连续的。
假设一个节点有重复度 p-k,在该节点上有k+1 个非零基函数且曲线上的相应点位于由控制点(与那些非零基函数相对应)定义的凸包内。如果 k = p - 1, 有两个非零函数而相应的凸包是直线段。
如果 k = p, 只有一个非零基函数在该节点上,只有一个控制点有非零系数。结果,曲线通过该点。
上面图 (a),显示了一个5次B-样条曲线,相对应于标记的节点点的节点移动到它前面的节点,构建了一个重复度2的节点。结果在图 (b), 其与原始图没有太大差别。然后,下一个节点 (用矩形框标记)也被移动到产生的节点 ,构建了一个重复度3的节点。产生的曲线朝控制折线的一条边移动。再移动一个节点构建一个重复度4的新节点。这使得相应的点(椭圆标记)位于一条边上。最 后,仅剩的一个节点移到与其它节点结合起来。由于它的重复度是5而 p=5, 只有一个非零系数因此使得曲线通过该控制点。如图(e)所示,该控制点是P5 。
B-spline Curves 学习之B样条曲线的移动控制点、修改节点分析(7)的更多相关文章
- B-spline Curves 学习之B样条曲线性质(5)
B-spline Curves: Important Properties 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. ...
- B-spline Curves 学习之B样条曲线定义(4)
B-spline Curves: Definition 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:h ...
- B-spline Curves 学习之B样条曲线的系数计算与B样条曲线特例(6)
B-spline Curves: Computing the Coefficients 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关 ...
- B-spline Curves 学习之B样条曲线的导数(8)
Derivatives of a B-spline Curve 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客 ...
- B-spline Curves 学习前言与动机(1)
B-spline Curves 学习之前言 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:http:// ...
- VSTO学习笔记(七)基于WPF的Excel分析、转换小程序
原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...
- 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理
1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...
- 并发编程学习笔记(8)----ThreadLocal的使用及源码分析
1. ThreadLocal的理解 ThreadLocal,顾名思义,就是线程的本地变量,ThreadLocal会为每个线程创建一个本地变量副本,使得使用ThreadLocal管理的变量在多线程的环境 ...
- B-spline Curves 学习之B样条基函数的定义与性质(2)
B-spline Basis Functions 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:http ...
随机推荐
- 网站配色、网站模板网址 UE样式 metro报表
http://www.colourlovers.com http://unmatchedstyle.com网站模板目录 花瓣 http://huaban.com/ 油表 http://fl ...
- 虚拟机Linux桥接模式下设置静态IP
之前一直使用NAT模式,测试时android端远程访问虚拟机的mysql时发现无法连接,但是访问同学拷过来的虚拟机Linux的mysql却成功了,想了下原因是他设置的桥接模式.关于两种模式的区别,网上 ...
- hadoop启动时,报ssh: Could not resolve hostname xxx: Name or service not known
本文转载自:http://blog.csdn.net/wodewutai17quiet/article/details/76795951 问题:hadoop启动时,报ssh: Could not re ...
- KMP算法解释
给定两个字符串A,B,判断T是否为S的子串(变式:寻找子串B在串A中的位置). 要求一个O(|A|+|B|)的做法. 通常称A为目标串(或主串),B为模式串. 算法过程: 我们假设串A的长度为n,串B ...
- java io之管道流
一.java.io中存在一中流叫管道流,类似管道的功能.PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流.这个两个流必须同时使用. 二.作用:进行两个线 ...
- json中key大小写转换
最近工作中遇到json格式的字符串中的key为大写的,需要转换成小写的来解析,开始想使用正则来替换,结果不是很方便,后来考虑把JSONObject重新来封装. 如下json格式:{PWACHECKIN ...
- 【BZOJ】1756: Vijos1083 小白逛公园(线段树)
题目 传送门:QWQ 分析 线段树维护一下最大子序列 维护一下最大前缀 最大后缀 区间和 就ok了 好像只能用结构体..... 代码 #include <bits/stdc++.h> u ...
- Requests抓取火车票数据
1.数据接口 https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate=2016-08-01&from_ ...
- leetcode88
public class Solution { public void Merge(int[] nums1, int m, int[] nums2, int n) { //for (int i = 0 ...
- VMware 克隆网卡无法启动
问题描述: 最近学习 hadoop,环境准备搭建在虚拟机之上,装好一台虚拟机克隆完成后,网卡无法启动. 多年前,初学 Linux 的时候,就遇到过这个问题,记录的笔记找不到了,简单记录一下. shel ...