Quartz2d 画饼状图 图形上下文栈 矩阵操作 裁剪圆角图片

画饼状图

- (void)drawRect:(CGRect)rect {
    // Drawing code

    // 需求:根据sections的数据,绘制多个扇形

    // 1.获取上下文(Layer Graphics Context)
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 2.根据sections的个数,计算扇形的起始和结束位置来画扇形
    NSInteger count = self.sections.count;

    // 如果没有数据,直接返回,不用画
    if(count == 0) return;

    // 圆心
    CGFloat centerX = rect.size.width * 0.5;
    CGFloat centerY = rect.size.height * 0.5;

    //半径就是x的中心点
    CGFloat radius = centerX;

    // 计算所有组的总数
    NSInteger sum = 0;
    for (NSInteger i = 0; i < count; i++) {
        sum += [self.sections[i] integerValue];
    }

    // 默认设置扇形的起始位置为 0
    CGFloat startAngle = 0;

    for (NSInteger i = 0; i < count; i++) {
        // 计算每组占用的比例
#warning 计算float的值,一要除以一个float类型值
        CGFloat scale = [self.sections[i] integerValue] / (sum * 1.0);

        // 指定颜色
        UIColor *sectionColor = self.sectionColors[i];
        [sectionColor set];

        // 计算结束的位置
#warning 计算结束的位置 = 起始位置 + 需要的画的弧度
        CGFloat endAngle = startAngle + scale * 2 * M_PI;

#warning 指定 "弧" 的中心点路径
        CGContextMoveToPoint(ctx, centerX, centerY);
        // 画弧
        CGContextAddArc(ctx, centerX, centerY, radius, startAngle, endAngle, 0);

        // 渲染
        CGContextFillPath(ctx);

        NSLog(@"scale:%f startAngle:%f endAngle:%f",scale, startAngle,endAngle);

        // 重新设置起始的位置,供一次循环使用
        startAngle = endAngle;

    }

}

图形上下文栈

- (void)drawRect:(CGRect)rect {
    // Drawing code

    // 需求: 先画一个矩形,颜色为红色,线宽为3
    //       再画一个矩形,颜色为黑色,线宽为默认

    // 上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 保存一个当前上下文的绘图状态到一个栈里面
    // G代理Graphics[绘图]
    CGContextSaveGState(ctx);
//    CGContextSaveGState(ctx);

    // 画红色,线宽为3的矩形
    [[UIColor redColor] set];
    CGContextSetLineWidth(ctx, 3);
    CGContextAddRect(ctx, CGRectMake(10, 10, 100, 100));
    CGContextStrokePath(ctx);

    // 画黑色,线宽为默认的矩形
//    [[UIColor blackColor] set];
//    CGContextSetLineWidth(ctx, 1);

    // 恢复 当前上下文的状态
//    CGContextRestoreGState(ctx);

    CGContextAddRect(ctx, CGRectMake(10, 120, 50, 50));
    CGContextStrokePath(ctx);

    //再恢复
#warning 恢复状态不能随便调用,保存了多少次绘图状态,就可以调用多少
//    CGContextRestoreGState(ctx);

}

矩阵操作

- (void)drawRect:(CGRect)rect {
    // Drawing code
    //矩阵操作 平移、绽放,旋转

    // 画个三角形 + 画一条线

    CGContextRef ctx = UIGraphicsGetCurrentContext();

#warning qurtz2d的平移,要在绘制之前
    //平移
    //CGContextTranslateCTM(ctx, 0,50);

    //缩放
    //CGContextScaleCTM(ctx, 1.5, 1.5);

    //旋转
    // 负数 逆时针/ 正数 顺时针
    // 围绕左上角(0,0) 旋转
    CGContextRotateCTM(ctx, - M_PI * 0.25);

    // 定义三个点
    CGPoint points[3] = {{50,20},{100,80},{10,80}};
    CGContextAddLines(ctx, points, 3);

    // 合并三个点的路径
    CGContextClosePath(ctx);

    // 画线
    CGPoint linePoints[2] = {{10,20},{80,80}};
    CGContextAddLines(ctx, linePoints, 2);
    CGContextStrokePath(ctx);

    // 渲染
    CGContextStrokePath(ctx);
}

裁剪圆角图片

- (void)drawRect:(CGRect)rect {
    // Drawing code

    // 1.实现裁剪图片显圆形 并显示

    // 1.1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 1.2.指定圆的路径,并圆外面多余的剪切掉[CGContextClip]
#warning CGContextClip方法要记住
    // 定义图片的Rect
    CGRect imageRect = CGRectMake(0, 0, rect.size.width, rect.size.height);
    CGContextAddEllipseInRect(ctx, imageRect);
    CGContextClip(ctx);

    // 1.3.就把图片显示在UIView
    UIImage *image = [UIImage imageNamed:self.imageName];
    [image drawInRect:imageRect];

    // 2.添加一个圆的边框
    //线宽
    CGContextSetLineWidth(ctx, self.borderWidth);

    //设置边框的颜色
    [self.borderColor set];

    CGContextAddEllipseInRect(ctx, imageRect);
    CGContextStrokePath(ctx);

}

时间: 2024-10-25 05:51:19

Quartz2d 画饼状图 图形上下文栈 矩阵操作 裁剪圆角图片的相关文章

[控件] 画饼状图的控件

画饼状图的控件 效果 注意:支持遮罩效果 源码 https://github.com/YouXianMing/CircleView // // CircleView.h // YXMWeather // // Created by XianMingYou on 15/5/12. // Copyright (c) 2015年 XianMingYou. All rights reserved. // #import <UIKit/UIKit.h> @interface CircleView : U

Quartz 2D 图形上下文栈 矩阵 裁剪

Quartz 2D 图形上下文栈  矩阵 1 // 2 // DJVIew.m 3 // 图形上下文栈 4 // 5 // Created by zjj on 15/6/30. 6 // Copyright (c) 2015年 zjj. All rights reserved. 7 // 8 9 #import "DJVIew.h" 10 11 @implementation DJVIew 12 13 - (void)drawRect:(CGRect)rect 14 { 15 CGCo

图形上下文的矩阵操作(平移-缩放-旋转)

图形上下文的矩阵操作(旋转.缩放和平移) CGContextRotateCTM:图形上下文旋转,以上下文的原点(左上角)为基准 CGContextScaleCTM:图形上下文的缩放,以上下文的原点(左上角)为基准 CGContextTranslateCTM:图形上下文的平移,以上下文的原(左上角)点为基准 注意:一定要在添加路径之前进行设置 下面贴出swift版代码: 1 override func draw(_ rect: CGRect) { 2 let context = UIGraphic

canvas+js画饼状图

效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>饼状图</title> </head> <body> <canvas id="canvas"></canvas> <script> (function () {

HTML画饼状图

<!DOCTYPE HTML> <html> <head> <title>简单化饼图</title> <meta charset="utf-8"/> </head> <body> <canvas id="cav" width="800" height="800"> 对不起,您的浏览器版本过低,不支持HTML5. <

用canvas 画饼状图

<canvas id="cans"  height="800" width="1200" ></canvas> <script> function disToRad(n){ // 把角度转换为弧度 return n*Math.PI/180; //π用PI表示,π=180°,所以1°=PI/180 } window.onload=function(){ let cans=document.getElementBy

python plotly 画饼状图

代码 import pandas as pd import numpy as np import plotly.plotly as py import plotly.graph_objs as go path = '/home/v-gazh/PycharmProjects/us_data/limit_code.csv' df = pd.read_csv(path) df.set_index(['code'], inplace=True) # ST 占比 total_count = len(df)

PHP画矩形,椭圆,圆,画椭圆弧 ,饼状图

1:画矩形: imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $col ) imagerectangle() 用 col 颜色在 image 图像中画一个矩形,其左上角坐标为 x1, y1,右下角坐标为 x2, y2.图像的左上角坐标为 0, 0. 2:画椭圆: imageellipse ( resource $image , int $cx , int $cy , int $width

python 饼状图

https://www.cnblogs.com/liming19680104/p/10614132.htmlimport pandas as pdimport numpy as npimport matplotlib.pyplot as plt #解决能显示中文plt.rcParams['font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 plt.titl