cgcontextaddarctopoint archery怎么计算半径

下次自动登录
关注移动互联网和移动APP开发工具、开发框架、测试工具、微信开发、Android源码、Android开源类库以及各种开源组件的IT科技网站
现在的位置:
iOS Quartz: CGPathAddArc和CGPathAddArcToPoint函数
CGPathAddArc函数是通过圆心和半径定义一个圆,然后通过两个弧度确定一个弧线。注意弧度是以当前坐标环境的X轴开始的。
需要注意的是由于iOS中的坐标体系是和Quartz坐标体系中Y轴相反的,所以iOS
UIView在做Quartz绘图时,Y轴已经做了Scale为-1的转换,因此造成CGPathAddArc函数最后一个是否是顺时针的参数结果正好是相反的,也就是说如果设置最后的参数为YES,根据参数定义应该是顺时针的,但实际绘图结果会是逆时针的!
比如,我们设置起点弧度为0,终点弧度为1.5 * PI(等于270角度),然后最后的clockwise参数为NO,代码:
CGPathAddArc(, , , , , , , )
- (void)viewDidLoad
[super viewDidLoad];
//创建CGContextRef
UIGraphicsBeginImageContext(self.view.bounds.size);
CGContextRef gc = UIGraphicsGetCurrentContext();
//=== 绘画逻辑 ===
//创建用于转移坐标的Transform,这样我们不用按照实际显示做坐标计算
CGAffineTransform transform = CGAffineTransformMakeTranslation(50, 50);
//创建CGMutablePathRef
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddArc(path, &transform, 50, 50, 50, 0, 1.5 * M_PI, NO);
CGPathMoveToPoint(path, &transform, 50, 0);
CGPathAddLineToPoint(path, &transform, 50, 50);
CGPathAddLineToPoint(path, &transform, 100, 50);
//将CGMutablePathRef添加到当前Context内
CGContextAddPath(gc, path);
[[UIColor grayColor] setFill];
[[UIColor blueColor] setStroke];
CGContextSetLineWidth(gc, 2);
//执行绘画
CGContextDrawPath(gc, kCGPathFillStroke);
//从Context中获取图像,并显示在界面上
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imgView = [[UIImageView alloc] initWithImage:img];
[self.view addSubview:imgView];
结果会是顺时针绘制弧线.
如果把CGPathAddArc函数改成这样:
//虽然顺时针参数是YES,在iOS中的UIView中,这里实际是逆时针。所以只会画出1/4。
CGPathAddArc(path, &transform, 50, 50, 50, 0, 1.5 * M_PI, YES);
虽然顺时针参数是YES,在iOS中,这里实际是逆时针。所以只会画出1/4。结果会是:
而CGContextAddArcToPoint函数则是另一种绘制弧线的方式,同样可以参考那个SO回答的截图.它是通过画两个虚拟的线来完成绘图的,这两条线是通过当前CGContextRef的点,和CGContextAddArcToPoint函数本身定义的两个点来完成的。而弧线会从当前CGContextRef的点开始,画到中心圆与第二条线的交点处。这样的画弧方式,在某些情况下可以使CGContextAddArcToPoint函数比CGPathAddArc用起来更加方便些。比如花圆角矩形。
//创建CGContextRef
UIGraphicsBeginImageContext(self.view.bounds.size);
CGContextRef gc =
UIGraphicsGetCurrentContext();
绘画逻辑 ===
//创建用于转移坐标的Transform,如许我们不消遵守实际显示做坐标策画
CGAffineTransform transform =
CGAffineTransformMakeTranslation(100,200);
//创建CGMutablePathRef
CGMutablePathRef path =
CGPathCreateMutable();
//半径为30
CGFloat radius =
//初始点为(0, 0)
CGPathMoveToPoint(path, &transform,
//右上角和右下角两个点,画出半个圆角
CGPathAddArcToPoint(path, &transform,
100, 0, 100,
100, radius);
//右下角和左下角两个点,画出别的半个圆角
CGPathAddArcToPoint(path, &transform,
100, 100, 0,
100, radius);
CGPathAddArcToPoint(path, &transform,
0, 100, 0,
0, radius);
CGPathAddArcToPoint(path, &transform,
0, 0, 100,
0, radius);
//将CGMutablePathRef添加到当前Context内
CGContextAddPath(gc, path);
grayColor] setFill];
blueColor] setStroke];
CGContextSetLineWidth(gc,
//履行绘画
CGContextDrawPath(gc,
kCGPathFillStroke);
//从Context中获取图像,并显示在界面上
UIImage *img =
UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imgView = [[UIImageView
alloc] initWithImage:img];
[self.view
addSubview:imgView];
如下图说:
【上篇】【下篇】iOS绘图系列三:画弧线CGContextAddArc ,CGContextAddArcToPoint,CGContextAddCurveToPoint,UIB
iOS绘图系列三:画弧线CGContextAddArc ,CGContextAddArcToPoint,CGContextAddCurveToPoint,UIB
[摘要:那一节我们去绘弧线,我们须要到达的方针是如图所示 能够用CGContext 往完成 CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1);//设置线的色彩 CGContextSetRGBFillColo]
这一节我们来画弧线,我们需要达到的目标是如图所示
可以用CGContext 去实现
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1);//设置线的颜色
CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);//设置填充颜色
CGContextSetLineWidth(ctx, 2); //设置线的宽度
CGContextAddEllipseInRect(ctx, CGRectMake(10, 30, 60, 60)); //画一个椭圆或者圆
CGContextDrawPath(ctx, kCGPathFillStroke);
//根据中心点,半径,起始的弧度,最后的弧度,是否顺时针画一个圆弧
CGContextAddArc(ctx, 140, 60, 30, M_PI/2.f, M_PI, 1);
CGContextDrawPath(ctx, kCGPathStroke);
CGPoint p[3] =
CGPointMake(210.0, 30.0),
CGPointMake(210.0, 60.0),
CGPointMake(240.0, 60.0),
//先移到p1点
CGContextMoveToPoint(ctx, p[0].x, p[0].y);
//从p1点开始画弧线,圆弧和p1-p2相切;p2-p3和弧线相切,圆弧的半径是20
CGContextAddArcToPoint(ctx, p[1].x, p[1].y, p[2].x, p[2].y, 20.0);
CGContextStrokePath(ctx);
//画一个圆角矩形
CGRect rrect = CGRectMake(210.0, 70.0, 60.0, 60.0);
CGFloat radius = 10.0;
CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect);
CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect);
CGContextMoveToPoint(ctx, minx, midy);
CGContextAddArcToPoint(ctx, minx, miny, midx, miny, radius);
CGContextAddArcToPoint(ctx, maxx, miny, maxx, midy, radius);
CGContextAddArcToPoint(ctx, maxx, maxy, midx, maxy, radius);
CGContextAddArcToPoint(ctx, minx, maxy, minx, midy, radius);
CGContextClosePath(ctx);
CGContextDrawPath(ctx, kCGPathFillStroke);
//贝塞尔曲线一,两个控制点
CGPoint s = CGPointMake(30.0, 120.0); //起始点
CGPoint e = CGPointMake(300.0, 120.0);//终点
CGPoint cp1 = CGPointMake(120.0, 30.0);//控制点1
CGPoint cp2 = CGPointMake(210.0, 210.0);//控制点2
CGContextMoveToPoint(ctx, s.x, s.y);
CGContextAddCurveToPoint(ctx, cp1.x, cp1.y, cp2.x, cp2.y, e.x, e.y);
CGContextStrokePath(ctx);
//贝塞尔曲线二,一个控制点
s = CGPointMake(30.0, 300.0);
e = CGPointMake(270.0, 300.0);
cp1 = CGPointMake(150.0, 180.0);
CGContextMoveToPoint(ctx, s.x, s.y);
CGContextAddQuadCurveToPoint(ctx, cp1.x, cp1.y, e.x, e.y);
CGContextStrokePath(ctx);
用UIKit去实现
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(10, 30, 60, 60)];
[[UIColor redColor] setStroke];
[[UIColor blueColor] setFill];
path.lineWidth = 2;
[path stroke];
[path fill];
path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(140, 60) radius:30 startAngle:M_PI/2.f endAngle:M_PI clockwise:YES];
path.lineWidth = 2;
[path stroke];
path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(210, 70, 60, 60) cornerRadius:5];
path.lineWidth = 2;
[path stroke];
[path fill];
path = [UIBezierPath bezierPath];
path.lineWidth = 2;
CGPoint s = CGPointMake(30.0, 120.0);
CGPoint e = CGPointMake(300.0, 120.0);
CGPoint cp1 = CGPointMake(120.0, 30.0);
CGPoint cp2 = CGPointMake(210.0, 210.0);
[path moveToPoint:s];
[path addCurveToPoint:e controlPoint1:cp1 controlPoint2:cp2];
[path stroke];
path = [UIBezierPath bezierPath];
path.lineWidth = 2;
s = CGPointMake(30.0, 300.0);
e = CGPointMake(270.0, 300.0);
cp1 = CGPointMake(150.0, 180.0);
[path moveToPoint:s];
[path addQuadCurveToPoint:e controlPoint:cp1];
[path stroke];
感谢关注 Ithao123iOS频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
IThao123周刊

我要回帖

更多关于 cgcontextaddarc 参数 的文章

 

随机推荐