贝赛尔曲线,颜色渐变,矩阵变换

The UIBezierPath class lets you define a path consisting of straight and curved line segments and render that path in your custom views. You use this class initially to specify just the geometry for your path. Paths can define simple shapes such as rectangles, ovals, and arcs or they can define complex polygons that incorporate a mixture of straight and curved line segments. After defining the shape, you can use additional methods of this class to render the path in the current drawing context.UIBezierPath类允许您定义一个路径组成的直线和曲线段和渲染路径在您的自定义视图。你使用这个类最初指定的几何路径。路径可以定义简单的形状如矩形、椭圆、弧或他们可以定义复杂的多边形,将直线和曲线段的混合物。定义形状之后,您可以使用这个类的其他方法来呈现在当前绘图上下文路径

  • 使用贝赛尔曲线创建简单图形
- (void)drawRect:(CGRect)rect{
    //创建UIBezierPath
    UIBezierPath *path = [UIBezierPath bezierPath];
    //绘制三角形
    [path moveToPoint:CGPointMake(100, 10)];
    [path addLineToPoint:CGPointMake(130, 40)];
    [path addLineToPoint:CGPointMake(70, 40)];
    [[UIColor redColor] setFill];
    [path fill];//填充模式
    [path closePath];
    
    
    //绘制剪切区域
    [path moveToPoint:CGPointMake(100, 80)];
    [path addLineToPoint:CGPointMake(105, 100)];
    [path addLineToPoint:CGPointMake(95, 100)];
    [path closePath];
    [path appendPath:[UIBezierPath bezierPathWithRect:rect]];
    path.usesEvenOddFillRule = NO;
    [path addClip];
    
    
    
    //绘制轴
    [path removeAllPoints];//画另一条线,不与之前的线连接
    [path moveToPoint:CGPointMake(100, 40)];
    [path addLineToPoint:CGPointMake(100, 100)];
    //设置周宽度
    [path setLineWidth:5];
    [path stroke];
}
三角形及箭头
  • 绘制箭头
- (void) drawRect:(CGRect)rect{
    //1.获取图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //2. 绘制大三角
    CGContextMoveToPoint(ctx, 100, 0);
    CGContextAddLineToPoint(ctx, 140, 40);
    CGContextAddLineToPoint(ctx, 60, 40);
    CGContextSetRGBFillColor(ctx, 1, 0, 0, 1.0);
    
    CGContextFillPath(ctx);
    //关闭路径
    CGPDFContextClose(cox);


#pragma >>>>下方的剪切部分
    //3 小三角
    CGContextMoveToPoint(ctx, 100, 80);
    CGContextAddLineToPoint(ctx, 110, 100);
    CGContextAddLineToPoint(ctx, 90, 100);
    CGContextClosePath(ctx);
    //添加剪切区域
    CGContextAddRect(ctx, rect);
    //用奇偶规则剪切
    CGContextEOClip(ctx);
    //4 绘制轴
    CGContextMoveToPoint(ctx, 100, 40);
    CGContextAddLineToPoint(ctx, 100, 100);
    CGContextSetLineWidth(ctx, 20);
    CGContextStrokePath(ctx);
    }
  • 渐变色
- (void) drawRect:(CGRect)rect{
    //1.获取图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //2. 绘制大三角
    CGContextMoveToPoint(ctx, 100, 0);
    CGContextAddLineToPoint(ctx, 140, 40);
    CGContextAddLineToPoint(ctx, 60, 40);
    CGContextSetRGBFillColor(ctx, 1, 0, 0, 1.0);
    
    CGContextFillPath(ctx);
    //关闭路径
    CGPDFContextClose(ctx);
    
    
#pragma >>>>下方的剪切部分
    //3 小三角
    CGContextMoveToPoint(ctx, 100, 80);
    CGContextAddLineToPoint(ctx, 110, 100);
    CGContextAddLineToPoint(ctx, 90, 100);
    CGContextClosePath(ctx);
    //添加剪切区域
    CGContextAddRect(ctx, rect);
    //用奇偶规则剪切
    CGContextEOClip(ctx);
    //4 绘制轴
    CGContextMoveToPoint(ctx, 100, 40);
    CGContextAddLineToPoint(ctx, 100, 100);
    CGContextSetLineWidth(ctx, 20);
   // CGContextStrokePath(ctx);//关闭,下方渐变才生效
    //确定渐变区域
    //stroke ->fill
    CGContextReplacePathWithStrokedPath(ctx);
    //保存设置状态
    CGContextSaveGState(ctx);
    CGContextClip(ctx);
    
    //绘制渐变颜色
    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
    const CGFloat components[] = {
        0.2,0.6,0.8,0.6,//开始的颜色
        0.5,0.9,0.3,0.8,//中间的颜色1
        0.7,0.5,0.2,0.7,//中间的颜色2
        0.4,0.7,0.7,0.4,//结束的颜色
    };
    //设置渐变区域
    const CGFloat locations[] = {0,0.32,0.56,1};
    /**
     space 颜色空间对象
     components 颜色的数组,存储的事rgb颜色
     location  颜色所在位置
     count :颜色的个数 = locations的个数
     */
    CGGradientRef gradientref = CGGradientCreateWithColorComponents(space, components, locations, 4);
    //绘制渐变
    //颜色0对应的开始点,颜色数组中的结束点位置
    CGContextDrawLinearGradient(ctx, gradientref,CGPointMake(90, 100),CGPointMake(110, 100),kCGGradientDrawsBeforeStartLocation);
    //释放颜色空间,渐变的对象
    CGColorSpaceRelease(space);
    CGGradientRelease(gradientref);
    //恢复以前的区域
    CGContextRestoreGState(ctx);



![渐变色](http://upload-images.jianshu.io/upload_images/2382884-3f853c36bdc2f7c1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 矩阵变幻 CGContextTranslateCTM

//1.获取图形上下文 Translate平移  Rotate旋转  cale缩放
CGContextRef ctx=UIGraphicsGetCurrentContext();

//5.矩阵变换,
//a.坐标轴的变换
CGRect bounds=self.bounds;
//平移坐标轴
CGContextTranslateCTM(ctx, 0, bounds.size.height);
//翻转Y的坐标轴
CGContextScaleCTM(ctx, 1, -1);
//移动位置,沿着x轴移动100
CGContextTranslateCTM(ctx, 100, 0);
//旋转
CGContextRotateCTM(ctx, radians(90));

//缩放
CGContextScaleCTM(ctx, 0.5, 0.5);
![翻转,平移](http://upload-images.jianshu.io/upload_images/2382884-e1e55a6e96391a85.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

# 非零绕数
在图形学中判断一个点是否在多边形内,若多边形不是自相交的,那么可以简单的判断这个点在多边形内部还是外部;若多边形是自相交的,那么就需要根据非零环绕数规则和奇-偶规则判断。

在图形学中判断一个点是否在多边形内,若多边形不是自相交的,那么可以简单的判的,那么就需要根据非零环绕数规则和奇-偶规则判断。判断多边形是否是自相交的:多边形在平面内除顶点外还有其他公共点内-外测试
不自交的多边形:多边形仅在顶点处连接,而在平面内没有其他公共点,此时可以自相交的多边形:多边形在平面内除顶点外还有其他公共点,此时划分内-外部分(1)奇-偶规则(Odd-even Rule):奇数表示在多边形内,偶数表示在多边形外从任意位置p作一条射线,若与该射线相交的多边形边的数目为奇数,则p是多边(2)非零环绕数规则(Nonzero Winding Number Rule):若环绕数为0表示在多首先使多边形的边变为矢量。将环绕数初始化为零。再从任意位置p作一条射线。
边计数,每当多边形的边从右到左穿过射线时,环绕数加1,从左到右时,环绕数减1则p为内部点,否则,p是外部点。
参考[1]中例子如下,判断点p是否在多边形内,从点p向外做一条射线(可以任意方向),多边形的边从线时环数加1,最后环数不为0,即表示在多边形内部。
当然,非零绕数规则和奇偶规则会判断出现矛盾的情况,如下图所示,左侧表示用 奇充。右侧图用非零绕环规则判断出绕数为2,非0表示在多边形内部,所以填充。

断
![屏幕快照 2016-09-16 下午2.24.03.png](http://upload-images.jianshu.io/upload_images/2382884-232fd9f074fe5937.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
需形
当 
左

断这个点在多边形内部还是外部;若多边形是自相交
直接划分内-外部分。要采用以下的方法。
内部点,否则是外部点。边形内,非零表示在多边形外
从p点沿射线方向移动时,对在每个方向上穿过射线的。处理完多边形的所有相关边之后,若环绕数为非零,
到右经过射线时环数减1,多边形的边从右往左经过射

偶规则判断绕环数为2 ,表示在多边形外,所以没有填

以需
形多
当1
![屏幕快照 2016-09-16 下午2.24.13.png](http://upload-images.jianshu.io/upload_images/2382884-12e07f1b60e19011.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
左

奇
另外一个例子,如下
非零环绕数规则和奇-偶规则(Non-Zero Winding Number Rule&&Odd-even Ru1.CGContextClip 使用非零环绕数规则来判断当前路径和裁剪路径的交集。2.CGContextEOClip 使用奇偶环绕数规则来判断当前路径和裁剪路径的交集。
![
](http://upload-images.jianshu.io/upload_images/2382884-15c331d9d7fe106d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
u
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 最近项目中要实现加速球效果。是时候该学习一波了,好了废话不多说,记笔记,还是从自己发憷的自定义view开始。 先来...
    laifrog阅读 1,451评论 0 4
  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,658评论 2 32
  • 简介 在绘图中, 我们经常需要对路径进行填充操作. 那么问题来了, 在一个路径的覆盖范围内, 如何判断哪些区域需要...
    李国安阅读 4,517评论 8 15
  • 绝代有佳人,幽居在空谷。自云良家子,零落依草木。 合昏尚知时,鸳鸯不独宿。但见新人笑,哪闻旧人哭。 ——杜甫《佳人...
    南宫即墨阅读 6,601评论 80 128
  • 说在前头:文章纯属原创,写的科普文章不容易,各路朋友转载还请注明出处。 ❶买多大容量的紫砂壶比较合适呢? 我们一般...
    KevinBC阅读 483评论 0 0