详细解析IOS中的CGContextAddArcToPoint方法的使用

来源:互联网 发布:中华田园犬 知乎 编辑:程序博客网 时间:2024/06/05 04:39

CGContextAddArc方法较为好理解,都已经制定了原点坐标,半径,始末弧度,顺逆时针等数值了,弧线基本上都已经出来了

而对于CGContextAddArcToPoint方法则有点不好理解。

研究好一会才明白,特写下来以供后面查询

首先当传入参数无法绘制弧线的时候(比如current point和start point还有end point都在一条直线上,那么根本无法绘制出圆弧),那么API则相当于无效被忽略了,即当前的点为上一次绘制结束时的坐标。

计算弧线过程是这样的,首先要明白current point的概念,在你调用CGContextMoveToPoint时,你其实是将一个点设置为current point,或者你调用了CGContextAddLineToPoint也同样在绘制线段后将current point修改为添加线段后的坐标点。

当你明白了current point后,在调用了CGContextAddArcToPoint这个方法的时候 ,系统在这个时候就计算出来了2个直线了,分别为current point (下面叫做p1)与 start point(下面叫p2)连接的直线和start point与end point(下面叫p3)连接的直线。由于我们是从p1连接到p2,向量方向是p1->p2的,再加上p2到p3,向量方向是p2->p3,这样实际上我们就知道了圆弧所在的大概方向,他是处于两条直线夹角那一边!

然后呢我们需要明白CGContextAddArcToPoint是用来画弧线的,但是这个弧线是有特点的,就是它会和我们之前计算出来的2个直线相切的,那么理论上不管半径有多小多大,只要之前两条直线的夹角大于0度小于180度,也就是说不是2条直线不是在一条直线上就好,我们总能找到一个这样的圆弧,使圆弧所在的圆和两条直线相切。

这个时候又出现神奇的地方了,就是当计算出这段弧度的时候,我们的p1点会和圆弧的起点自动绘制一条线段,然后再继续绘制弧线,最后end point落在弧线结束的地方。

这个说明了什么,说明实际上我们传入CGContextAddArcToPoint的两个点并不一定在我们绘制的图形里出现,他们只不过用来计算直线,定位圆弧用的,圆弧出来后,他的起点被连接到调用CGContextAddArcToPoint前的current point上,而圆弧的终点被设置为新的current point,说了这么多,还不如我放段代码和图片容易让人理解。

代码如下:

[cpp] view plain copy
  1. CGContextSetRGBStrokeColor(ctx,1,0,0,1);//设置红色画笔  
  2. CGContextMoveToPoint(ctx,110,0);  
  3. CGContextAddLineToPoint(ctx,50,50);  
  4. CGContextAddLineToPoint(ctx,80,10);     //你可以去掉这一行和下面一行看看,就知道为什么我说的传入addArcToPoint方法里的参数本身不一定要绘制的原因了  
  5. CGContextAddLineToPoint(ctx,50,50);  
  6. CGContextAddArcToPoint(ctx,80,10,80,110,50);  
  7. CGContextAddLineToPoint(ctx,80,110);    //测试显示调用addArcToPoint结束后current point不在(80,110)上,而是在弧线结束的地方  

 代码里我故意添加了一些addLineToPoint方法去描出一些线段,你可以去掉看看就知道其中奥妙了。


转载自:http://blog.csdn.net/dick_china/article/details/7864428

0 0