绘图学习

Posted phyLearn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了绘图学习相关的知识,希望对你有一定的参考价值。

最近对绘图进行了简单的学习,发现绘图的功能真是异常强大,基本可以自定义任何图形。下面对我学习的代码进行总结。
刚开始以为可以将代码直接写到控制器中,后来发现图形并不显示,后来发现必须重写视图的drawRect方法。
以下是自己模仿写的一些代码:

//一个不透明类型的quartz,相当于一个画布,可以在上面任意绘图
    CGContextRef content = UIGraphicsGetCurrentContext();
    //写文字
    CGContextSetRGBFillColor(content, 0, 0, 0, 1.0);//设置填充颜色
    UIFont *font = [UIFont boldSystemFontOfSize:15.0];//设置

    [@"画圆:" drawInRect:CGRectMake(10, 20, 80, 20) withFont:font];

    /**
     *  画圆
     */
    //1.无填充,有边框的圆
    CGContextSetRGBStrokeColor(content, 0, 0, 0, 1.0);//画笔线的颜色
    CGContextSetLineWidth(content, 1.0);//线的宽度
    //x,y圆点坐标,radius半径,startAngle为开始的弧度,endAngle为结束的弧度,clocksise 0为顺时针,1为逆时针
    CGContextAddArc(content, 100, 20, 15, 0, 2 * PI, 0 );//添加一个圆
    CGContextDrawPath(content, kCGPathStroke);//绘制填充


    //2.无边框,有填充的圆
    CGContextAddArc(content, 150, 30, 30, 0, 2 * PI, 0);//添加一个圆
    CGContextDrawPath(content, kCGPathFill);//绘制填充

    //3.有边框,有填充的圆
    UIColor *aColor = [UIColor colorWithRed:1 green:0.0 blue:1 alpha:1.0];
    CGContextSetFillColorWithColor(content, aColor.CGColor);//填充颜色
    CGContextSetLineWidth(content, 3.0);//线的宽度
    CGContextAddArc(content, 250, 40, 40, 0, 2 * PI, 0);//添加一个圆
    //kCGPathFill填充非零绕数规则,kCGPathEOFill表示用奇偶规则,kCGPathStroke路径,kCGPathFillStroke路径填充,kCGPathEOFillStroke表示描线,不是填充
    CGContextDrawPath(content, kCGPathFillStroke);

    /**
     *  画线及圆弧
     */
    //1.画线
    CGPoint aPoints[2];//坐标数组
    aPoints[0] = CGPointMake(100, 80);//坐标1
    aPoints[1] = CGPointMake(130, 80);//坐标2
    //CGContextAddLines(CGContextRef c, const CGPoint points[],size_t count)
    //points[]坐标数组,和count大小
    CGContextAddLines(content, aPoints, 2);//添加线
    CGContextDrawPath(content, kCGPathFillStroke);//根据坐标绘制路径
    //2.画笑脸圆弧
    //左
    CGContextSetRGBStrokeColor(content, 0, 0, 1, 1.0);//改变画笔颜色
    CGContextMoveToPoint(content, 140, 80);//开始坐标p1
    //CGContextAddArcToPoint(CGContextRef c, CGFloat x1, CGFloat y1,CGFloat x2, CGFloat y2, CGFloat radius)
    //x1,y1跟p1形成一条线的坐标p2,x2,y2结束坐标跟p3形成一条线的p3,radius半径,注意, 需要算好半径的长度,
    CGContextAddArcToPoint(content, 148, 68, 156, 80, 10);
    CGContextStrokePath(content);
    //右
    CGContextMoveToPoint(content, 160, 80);
    CGContextAddArcToPoint(content, 168, 68, 176, 80, 10);
    CGContextStrokePath(content);

    CGContextMoveToPoint(content, 150, 90);
    CGContextAddArcToPoint(content, 169, 68, 176, 80, 10);
    CGContextStrokePath(content);

    /**
     *  画矩形
     */
    CGContextStrokeRect(content, CGRectMake(100, 120, 10, 10));//画方框
    CGContextFillRect(content, CGRectMake(120, 120, 10, 10));//填充框

    //矩形,并填充颜色
    CGContextSetLineWidth(content, 2.0);//线的宽度
    aColor = [UIColor blueColor]; //blue蓝色
    CGContextSetFillColorWithColor(content, aColor.CGColor);//填充颜色
    aColor = [UIColor yellowColor];
    CGContextSetStrokeColorWithColor(content, aColor.CGColor);//线框颜色
    CGContextAddRect(content, CGRectMake(140, 120, 60, 30)); //画方框
    CGContextDrawPath(content, kCGPathFillStroke); //绘画路径

    /**
     *  //矩形,并填弃渐变颜色
     //关于颜色参考http://blog.sina.com.cn/s/blog_6ec3c9ce01015v3c.html
     //http://blog.csdn.net/reylen/article/details/8622932
     //第一种填充方式,第一种方式必须导入类库quartcore并#import <QuartzCore/QuartzCore.h>,这个就不属于在context上画,而是将层插入到view层上面。那么这里就设计到Quartz Core 图层编程了。
     */
    CAGradientLayer *gradient1 = [CAGradientLayer layer];
    gradient1.frame = CGRectMake(240, 120, 60, 30);
    gradient1.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor ,(id)[UIColor grayColor].CGColor,
                        (id)[UIColor blackColor].CGColor,
                        (id)[UIColor yellowColor].CGColor,
                        (id)[UIColor blueColor].CGColor,
                        (id)[UIColor redColor].CGColor,
                        (id)[UIColor greenColor].CGColor,
                        (id)[UIColor orangeColor].CGColor,
                        (id)[UIColor brownColor].CGColor,nil];
    [self.layer insertSublayer:gradient1 atIndex:0];

    //第二种填充方式
    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
    CGFloat colors[] = 
        1,1,1,1.00,
        1,1,0,1.00,
        1,0,0,1.00,
        1,0,1,1.00,
        0,1,1,1.00,
        0,1,0,1.00,
        0,0,0,1.00,
    ;
    CGGradientRef gradient = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors)/sizeof(colors[0]  * 4));
    CGColorSpaceRelease(rgb);

    //画线形成一个矩形
    //CGContextSaveGState与CGContextRestoreGState的作用
    /*
     CGContextSaveGState函数的作用是将当前图形状态推入堆栈。之后,您对图形状态所做的修改会影响随后的描画操作,但不影响存储在堆栈中的拷贝。在修改完成后,您可以通过CGContextRestoreGState函数把堆栈顶部的状态弹出,返回到之前的图形状态。这种推入和弹出的方式是回到之前图形状态的快速方法,避免逐个撤消所有的状态修改;这也是将某些状态(比如裁剪路径)恢复到原有设置的唯一方式。
     */
    CGContextSaveGState(content);
    CGContextMoveToPoint(content, 220, 90);
    CGContextAddLineToPoint(content, 240, 90);
    CGContextAddLineToPoint(content, 240, 110);
    CGContextAddLineToPoint(content, 220, 110);
    CGContextClip(content);//context裁剪路径,后续操作的路径
    //CGContextDrawLinearGradient(CGContextRef context,CGGradientRef gradient, CGPoint startPoint, CGPoint endPoint,CGGradientDrawingOptions options)
    //gradient渐变颜色,startPoint开始渐变的起始位置,endPoint结束坐标,options开始坐标之前or开始之后开始渐变
    CGContextDrawLinearGradient(content, gradient, CGPointMake(220, 90), CGPointMake(240, 110), kCGGradientDrawsAfterEndLocation);
    CGContextRestoreGState(content);//恢复到之前的context

    CGContextSaveGState(content);
    CGContextMoveToPoint(content, 260, 90);
    CGContextAddLineToPoint(content, 280, 90);
    CGContextAddLineToPoint(content, 280, 100);
    CGContextClip(content);

    CGContextDrawLinearGradient(content, gradient, CGPointMake(260, 90), CGPointMake(260, 100),kCGGradientDrawsAfterEndLocation);
    CGContextRestoreGState(content);

    //颜色渐变的圆
    CGContextDrawRadialGradient(content, gradient, CGPointMake(300, 100), 0.0, CGPointMake(300, 100),30, kCGGradientDrawsAfterEndLocation);

    /**
     *  画圆形和椭圆
     */
    //画扇形,也就是圆
    aColor = [UIColor colorWithRed:0 green:1 blue:1 alpha:1.0];
    CGContextSetFillColorWithColor(content, aColor.CGColor);
    //以10为半径围绕圆心画指定角度扇形
    CGContextMoveToPoint(content, 160, 180);
    CGContextAddArc(content, 160, 180, 30, - 60 * PI / 180, -120 * PI / 180, 1);
    CGContextClosePath(content);
    CGContextDrawPath(content, kCGPathFillStroke);
    CGContextAddEllipseInRect(content, CGRectMake(160, 180, 20, 8));

    //画椭圆
    CGContextAddEllipseInRect(content, CGRectMake(160, 180, 20, 20));
    CGContextDrawPath(content, kCGPathFillStroke);

    /**
     *  画三角形
     */
    CGPoint sPoints[3];
    sPoints[0] = CGPointMake(100, 220);
    sPoints[1] = CGPointMake(130, 220);
    sPoints[2] = CGPointMake(130, 160);
    CGContextAddLines(content, sPoints, 3);//添加线
    CGContextClosePath(content);
    CGContextClosePath(content);
    CGContextDrawPath(content, kCGPathFillStroke);

    float fw = 180;
    float fh = 280;

    CGContextMoveToPoint(content, fw, fh - 20);
    CGContextAddArcToPoint(content, fw, fh, fw - 20 , fh, 10);
    CGContextAddArcToPoint(content, 120, fh, 120, fh - 20, 10);
    CGContextAddArcToPoint(content, 120, 250, fw - 20, 250, 10);
    CGContextAddArcToPoint(content, fw, 250, fw, fh - 20, 10);
    CGContextClosePath(content);
    CGContextDrawPath(content, kCGPathFillStroke);

    /**
     *  画贝塞尔曲线
     */
    //二次曲线
    CGContextMoveToPoint(content, 120, 300);//设置path的起点
    CGContextAddQuadCurveToPoint(content, 190, 310, 120, 390);//设置贝塞尔曲线的控制点坐标和终点坐标
    CGContextStrokePath(content);
    //三次曲线函数
    CGContextMoveToPoint(content, 200, 300);
    CGContextAddCurveToPoint(content, 250, 280, 250, 400, 280, 300);
    CGContextStrokePath(content);

以上是关于绘图学习的主要内容,如果未能解决你的问题,请参考以下文章

计算几何学习9

createjs绘制扇形的方法

学习记录011-磁盘结构和文件系统

bzoj4418[Shoi2013]扇形面积并 扫描线+线段树

BZOJ4418[Shoi2013]扇形面积并 扫描线+线段树

bzoj4418 [Shoi2013]扇形面积并