CGContextAddCurveToPoint 的深入理解
CGContextAddCurveToPoint 这个函数看上去一般般,仔细琢磨发现不简单,为什么三个点就可以确定一条曲线呢? 网上查了查,小小研究了一下下。
1.关键知识 窃取自 (http://learn.gxtc.edu.cn/NCourse/jxcamcad/cadcam/Mains/main4-2.htm)
Bezier曲线
在工程设计中,由给定型值点进行曲线设计往往由于型值点的误差而得不到满意的结果。另一方面,在一些更注重外观的设计中,型值点的精度又不很重要。从 1962年起,法国雷诺汽车公司的Bezier开始构造他的以“逼近”为基础的参数曲线表示法。以这种方法为基础,完成了一种自由型曲线和曲面的设计系统 UNIS-URF,1972年在雷诺汽车公司正式使用。
Bezier曲线的形状是通过一组多边折线(称为特征多边形)的各顶点唯一地定义出来的。在多边形的各顶点中,只有第一点和最后一点在曲线上,其余的顶 点则使用控制曲线的导数、阶次和形式。第一条和最后一条折线则表示出曲线在起点和终点处的切线方向。曲线的形状趋向仿效多边折线的形状。改变控制点与改变 曲线形状有着形象生动的直接联系。如图2.6所示。
1)Bezier曲线的定义
给定 n+ l个空间向量bi(i= 0,l,…,n),称 n次参数曲线段
为Bezier曲线。式中使用了Bernstein多项式Bi,n(u)作为基函数:
u是局部参数,u∈[0,1]。我们给出n=3的Bezier曲线的矩阵表示:
则有 P(u)=UMB
2)Bezier曲线的性质
Bezier曲线的基本数学表达式:
这说明Bezier曲线在始点和终点处的切线方向是与Bezier控制多边形的第一边及最后一边的走向一致。
这 说明曲线在起点和终点处的二阶导数仅与相邻的二点位置有关,而与其余各点的位置关。Bezier曲线的这一特性说明,只需适当移动控制点就能获得满意的曲 线位置和形状。利用这个特性,当采用分段Bezier曲线时,只要保证曲线在接点处的折线共线,就可以得到C1连续性。如图2.7所示的一个公共端点的二 条Bezier曲线,当两段曲线的控制折线在接点处共线时,就保证了它们连成的曲线在公共端点的一阶连续。
Bezier曲线还具有凸包性,即B6zier曲线均落在由它的控制点形成的凸壳内。所谓凸壳是指用橡皮图从外面去套所有控制点所形成的凸多边形。研究表明,分段Bezier曲线的凸包性体现更明显,这对于曲线的分割求交将更为有利。
此外,Bezier曲线的形状仅与特征多边形各控制点bi有关,它不依赖于坐标系的选择,因此具有几何不变性。没有局部控制能力是 Bezier曲线的一个缺点。在工程中,产品的模型常常需要局部修改。缺乏局部控制的能力在工程中是难以接受的。Bezier曲线另一缺点是随着控制点的 增加,曲线的次数也增加,因而计算量增大。下面介绍的B样条曲线可克服这两个缺点。
3)Bezier曲线的计算及分割作图法
Bezier曲线在工程中广泛接受的一个重要原因是其可以采用非常简单的方法制作。下面推导Bezier多项式的递归关系,这种关系可方便用计算机程序实现,而且便于用图形来解释。重写Bezier曲线方程为
可以看到,第一个括号内的项形成对控制点b0,b1,…,bn-1的Bezier多项式,而第二个方括号内的项对b1,b2,…,bn形成多项式。现在引人符号Pk,i(u)表示对bk,bk+l,…,b的Bezier多项式,那么上述
方程可以重写为
上式表明,Bezier多项式可以由另外两个这种多项式求得。其求法为用一条线连接相应的点(即在同一参数U),并与u成比例地分那条线。
我 们再用图2.8所示的例子来看一下Bezier曲线的分割作图法。前例给出的由点b0,b1,b2,b3控制成的一条三次Bezier曲线可在u=l/2 处分段,分成b4的两段均为Bezier曲线,它们由各自的四个控制点控制。在图2.8中,点b0,b1,b2和b3控制形成一条三次,Bezier曲 线。取线段bobl的中点b4,线段b1b2的中点b5,线段 b2b3的中点 b6,线段 b4b5的中点 b7,线段 b5 b6的中点b8,以及线段b7bs的中点bg,则可以证明,b9在由b。,b1,b2,b3确定的三次Bezier曲线上,且为u=l/2时的点 P(l/2)。我们将u=l/2代人矩阵方程就可得到:
图 2.8的分割,我们获得折线b0b4 b7b9b8b6b3,它比折线b0blb2b3更接近该BeZier曲线,且b9在曲线上。继续分别对由b9分成的两段曲线作分割,除获得更接近曲线的 折线外,还获得曲线上的两个点。分割次数越多,新的折线越逼近曲线,当到达某种精度时,可将获得的折线近似的表达Bezier曲线。由于分割操作仅涉及加 法和移位操作,所以便于硬件实现,提高作图速度。读者可根据送推式写出相应的计算机程序,进一步从几何作图的角度,对计算式改进,以便使算法更为简单。
以上部分为算法原理,下面是实际的应用

CGContextAddCurveToPoint 的深入理解的更多相关文章
- 理解CSS视觉格式化
前面的话 CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...
- 彻底理解AC多模式匹配算法
(本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...
- 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信
接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念
一.前言 DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...
- 学习AOP之透过Spring的Ioc理解Advisor
花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...
- ThreadLocal简单理解
在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...
- JS核心系列:理解 new 的运行机制
和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...
- 深入理解JS 执行细节
javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等 ...
随机推荐
- Git常用命令举例
clone一个git project到本地 git clone https://github.com/huahuiyang/network-certification.git 到这个目录下,可以发现有 ...
- jQuery入门第一天
使用jQuery之前,我们需要加一些代码到HTML文件中. 首先在页面顶端增加一行script元素,然后写上结束符. 浏览器会运行script 里所有的Javascript,包括jQuery. 在你的 ...
- enum枚举类型的使用
修饰符为public static enum,不用加final,否则提示错误. 枚举类的所有实例必须在枚举类中显式列出(,分隔,; 结尾).列出的实例系统会自动添加 public static fin ...
- LightOJ1230 Placing Lampposts(DP)
题目大概说给一个森林求其最小点覆盖数,同时在最小点覆盖条件下输出最多有多少条边被覆盖两次. dp[0/1][u]表示以u为根的子树内的边都被覆盖且u不属于/属于覆盖集所需的最少点数 另外,用cnt[0 ...
- Shell 编程基础之 For 练习
一.语法 for var in con1 con2 con3 ... do # 执行内容 done for var in {min..max} do # 执行内容 done for (( 初始值; 限 ...
- iOS学习26之UINavigationController
1. UINavigationController 1> 概述 UINavigationController : 导航控制器, 是 iOS 中最常用的多视图控制器之一, 用它来管理多个视图控制器 ...
- 来自于2016.2.24的flag
今天又做了一套xj模拟题-------打比赛这种事情变得越来越无聊了------既影响自己的计划(虽然看起来很难完成的样子),又扰乱心情.而且题目大都是学习算法之类的,与计划不接轨就非常没有兴趣. 然 ...
- Codeforces Round #242 (Div. 2) A. Squats
注意题目一次只能改变一个松鼠,Pasha can make some hamster ether sit down or stand up.是单数不是复数 #include <iostream& ...
- ACM 精挑细选
精 挑 细 选 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管.这听起来不算什么,但是这根钢 ...
- 【ZOJ】1015 Fishing Net
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1015 题意:给出一个n个点的无向图,询问是否为弦图,弦图定义为对于图中任意 ...