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引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等 ...
随机推荐
- 注册事件处理程序onclick和addEventListener、attachEvent
一.设置HTML标签属性为事件处理程序(注意和下面的设置javascript对象属性为事件处理程序是不同的) 用于设置文档元素事件处理程序属性也能化成对应的HTML标签的属性.如果这样做,属性值应该是 ...
- NUC_HomeWork1 -- POJ1088(DP)
D - 滑雪 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Mic ...
- Target:IG
https://www.zhihu.com/question/25525630 别人轻轻松松红名,我拼死挣扎才1700+分. 仔细想想,虽然我在这东西上花了太多的精力,可是我根本没有认真学.做题全靠抄 ...
- Shell 脚本
近期在别人的工作基础上完善了几个shell自动安装脚本. 1. 循环远程访问机器并安装 #!/bin/bash IpPrefix=. User=root Pwd= SMNIP=52.1.123.79 ...
- HDU 1576 (乘法逆元)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目大意:求(A/B)mod 9973.但是给出的A是mod形式n,n=A%9973. 解题思 ...
- iPad apple-touch-startup-image实现portrait和landscape
iPad apple-touch-startup-image实现portrait和landscape 为ipad制作web应用程序的启动画面时发现个问题,只能显示竖屏图,横屏图出不来,网上的朋友都说无 ...
- 洛谷 P1014 Cantor表 Label:续命模拟QAQ
题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … ...
- BZOJ 1034 题解
1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2613 Solved: 1334[Submit][St ...
- BZOJ3636: 教义问答手册
Description “汉中沃野如关中,四五百里烟蒙蒙.黄云连天夏麦熟,水稻漠漠吹秋风.”——摘自 黄裳<汉中行>“泉岭精神不朽,汉中诸球永生.”——摘自<泉岭精神创立者语录> ...
- C# 委托和Lambda---基础
[委托]是一个类可以把一个方法当作另一个方法的参数使用. 声明委托:delegate string 委托名(参数列表);//跟定义方法一样,只是没有方法体,必须使用关键字delegate使用委托的函数 ...