Core Graphics 学习笔记 之 Image Drawing(二)

1.绘制箭头的三种方式

  // Drawing code
//    CGContextRef con = UIGraphicsGetCurrentContext();
//    //draw a black(by default) vertical line,the shaft of the arrow  箭杆
//    CGContextMoveToPoint(con, 100, 100);
//    CGContextAddLineToPoint(con, 100, 19);
//    CGContextSetLineWidth(con, 20);
//    CGContextStrokePath(con);
//    //draw a red triangle,the point of the arrow
//    CGContextSetFillColorWithColor(con, [[UIColor redColor] CGColor]);
//    CGContextMoveToPoint(con, 80, 25);
//    CGContextAddLineToPoint(con, 100, 0);
//    CGContextAddLineToPoint(con, 120, 25);
//    CGContextFillPath(con);
//    //snip a triangle out of the shaft by drawing in clear blend mode
//    CGContextMoveToPoint(con, 90, 100);
//    CGContextMoveToPoint(con, 100, 90);
//    CGContextMoveToPoint(con, 110, 100);
//    CGContextSetBlendMode(con, kCGBlendModeClear);
//    CGContextSetAlpha(con, 1.0);
//    CGContextFillPath(con);

     //当需要获取CGPath时,可以使用UIBezierPath
//    UIBezierPath *p = [UIBezierPath bezierPath];
//
//    [p moveToPoint:CGPointMake(100, 100)];
//    [p addLineToPoint:CGPointMake(100, 19)];
//    [p setLineWidth:20];
//    [p stroke];
//    [[UIColor redColor] set];
//    [p removeAllPoints];
//    [p moveToPoint:CGPointMake(80, 25)];
//    [p addLineToPoint:CGPointMake(100, 0)];
//    [p addLineToPoint:CGPointMake(120, 25)];
//    [p fill];
//
//    [p removeAllPoints];
//    [p moveToPoint:CGPointMake(90, 101)];
//    [p addLineToPoint:CGPointMake(100, 90)];
//    [p addLineToPoint:CGPointMake(110, 101)];
//    [p fillWithBlendMode:kCGBlendModeClear alpha:1.0];

   //Clipping
    CGContextRef con = UIGraphicsGetCurrentContext();
    //punch triangular hole in context clipping region
    CGContextMoveToPoint(con, 90, 100);
    CGContextAddLineToPoint(con, 100, 90);
    CGContextAddLineToPoint(con, 110, 100);
    CGContextClosePath(con);
    CGContextAddRect(con, CGContextGetClipBoundingBox(con));
    CGContextEOClip(con);
    //draw the vertical line
    CGContextMoveToPoint(con, 100, 100);
    CGContextAddLineToPoint(con, 100, 19);
    CGContextSetLineWidth(con, 20);
    CGContextStrokePath(con);
    //draw the red triangle.the point of the arrow
    CGContextSetFillColorWithColor(con, [[UIColor redColor] CGColor]);
    CGContextMoveToPoint(con, 80, 25);
    CGContextAddLineToPoint(con, 100, 0);
    CGContextAddLineToPoint(con, 120, 25);
    CGContextFillPath(con);

效果:

    CGContextRef con = UIGraphicsGetCurrentContext();
    [[self arrowImage]  drawAtPoint:CGPointMake(0, 0)];
    for (int i=0; i<3; i++) {
        CGContextTranslateCTM(con, 20, 100);
        CGContextRotateCTM(con, 30*M_PI/180);
        CGContextTranslateCTM(con, -20, -100);
        [[self arrowImage] drawAtPoint:CGPointMake(0, 0)];

    }
//
}

-(UIImage *)arrowImage
{
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(40, 100), NO, 0.0);
    CGContextRef con = UIGraphicsGetCurrentContext();
    //punch triangular hole in context clipping region
    CGContextMoveToPoint(con, 10, 100);
    CGContextAddLineToPoint(con, 20, 90);
    CGContextAddLineToPoint(con, 30, 100);
    CGContextClosePath(con);
    CGContextAddRect(con, CGContextGetClipBoundingBox(con));
    CGContextEOClip(con);
    //draw the vertical line
    CGContextMoveToPoint(con, 20, 100);
    CGContextAddLineToPoint(con, 20, 19);
    CGContextSetLineWidth(con, 20);
    CGContextStrokePath(con);
    //draw the red triangle.the point of the arrow
    CGContextSetFillColorWithColor(con, [[UIColor redColor] CGColor]);
    CGContextMoveToPoint(con, 0, 25);
    CGContextAddLineToPoint(con, 20, 0);
    CGContextAddLineToPoint(con, 40, 25);
    CGContextFillPath(con);

    UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return im;
}

当我不是绘制在(0,0)时就有问题,好像是由坐标系统改变导致的

    CGContextRef con = UIGraphicsGetCurrentContext();
    [[self arrowImage]  drawAtPoint:CGPointMake(150, 200)];
    for (int i=0; i<12; i++) {
        CGContextTranslateCTM(con, 20, 100);
        CGContextRotateCTM(con, 30*M_PI/180);
        CGContextTranslateCTM(con, -20, -100);
        [[self arrowImage] drawAtPoint:CGPointMake(150, 200)];

    }

尚未找到原因,有知道的童鞋,欢迎告知,一起交流

时间: 2024-10-09 22:56:13

Core Graphics 学习笔记 之 Image Drawing(二)的相关文章

Asp.Net Core WebApi学习笔记(四)-- Middleware

Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Middleware功能支持. 在演示Middleware功能之前,先要了解一下Asp.Net管道模型发生了什么样的变化. 第一部分:管道模型 1. Asp.Net管道 在之前的Asp.Net里,主要的管道模型流程如下图所示: 请求进入Asp.Net工作进程后,由进程创建HttpWorkRequest对象

Halcon学习笔记之支持向量机(二)

例程:classify_halogen_bulbs.hdev 在Halcon中模式匹配最成熟最常用的方式该署支持向量机了,在本例程中展示了使用支持向量机对卤素灯的质量检测方法.通过这个案例,相信大家可以对支持向量机的使用有一个更加清晰的了解.在相当多的检测和识别的应用中,都可以使用相同的方法来解决分类问题. 图1. 卤素灯图像 大致原理: 一.准备阶段:描述样本 1. 准备好两组卤素灯图像样本,好坏的各若干张图像: 2. 对样本图像进行分割,获取卤素灯关键部位区域: 3. 选择合适的对图像的描述

Core Graphics 学习——1 两张图合成为一张图

-(UIImage *)MergeTwoImage { UIImage * img =[UIImage imageNamed:@"icon"]; CGSize sz = img.size; UIGraphicsBeginImageContextWithOptions(CGSizeMake(sz.width*2, sz.height), NO, 0); [img drawAtPoint:CGPointMake(0, 0)]; [img drawAtPoint:CGPointMake(sz

Object C学习笔记26-文件管理(二)

上一篇简单的介绍了如何获取文件属性,删除,拷贝文件等,本文继续记录Object C中文件IO操作. 一. 获取文件的执行主目录 在Object C中提供了一个方法 NSHomeDirectory() 用于获得执行执行的主目录,使用如下代码测试: NSString *homePath=NSHomeDirectory(); NSLog(@"执行文件的主目录:%@",homePath); 通过以上代码可以正确的输出应用程序的执行目录,上一张也提到了文件的目录问题,这个和Windows系统的有

马程序员学习笔记——红黑树解析二

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 四.树中删除元素 1.先找到需要删除的元素. 2. 2.1如果被删元素没有子元素,那么直接用NIL节点代替他: 2.2如果被删元素只有一个子元素,那么直接用这个子元素代替他: 2.3如果被删元素有两个子元素,那么就用左子元素中的最大元素或者右子元素的最小元素代替他. 比如说原来要删除的元素是N,N有两个分支,其中P是N左分支中的最大元素,那么就

capwap学习笔记&mdash;&mdash;初识capwap(二)

2.5.1 AC发现机制 WTP使用AC发现机制来得知哪些AC是可用的,决定最佳的AC来建立CAPWAP连接. WTP的发现过程是可选的.如果在WTP上静态配置了AC,那么WTP并不需要完成AC的发现过程. WTP首先发送一个 Discovery Request message给受限的广播地址,或者CAPWAP的多播地址(224.0.1.140),或者是预配置的AC的单播地址.在IPV6网络中,由于广播并不存在,因此使用"All ACs multicast address" (FF0X

Nani_xiao的图像处理学习笔记:透视变换(二):X,Y方向校正原理

接着上一篇进行,上一篇为: Nani_xiao的图像处理学习笔记:透视变换(一) 这里采用一点透视投影 X 方向校正 图2 是透视投影的灭点原理图.在不考虑其他畸变的情况下,边ab 和边cd 平行于X 轴, 而边ac 和边bd 则和X 轴成一定的夹角.根据a .b .c .d 点的图像坐标,可以求出透视投影的灭点e 的坐标(mx , my)(在图像坐标系下). 然后根据透视缩小效应, 对其进行反运算, 进行X 方向的校正.在X 方向的校正中, 可以选择图像高度(0- H - 1)任意一条水平线的

Dynamic CRM 2013学习笔记(四十二)流程5 - 实时/同步工作流(Workflow)用法图解

实时工作流跟插件一样,也是用事件执行管道来执行,能在pre,post或核心操作中执行.跟插件一样,不能在创建之前和删除之后执行.如果执行过程中有异常发生,会取消并回滚整个操作.实时工作流里所有的活动和子流程都是一个事务,不像异步工作流里,子流程是单独的一个事务.不能使用等待或并行等待条件步骤.如果执行成功,就看不到执行的log.实时工作流能被转到异步工作流,还能再转回实时工作流.下面详细介绍如何创建一个实时工作流.   一.创建实时工作流 1. 打开 Setting > Process, 点击N

支持向量机学习笔记--原理篇(二)

支持向量机学习笔记(二) 前言 在上一篇中,讲述了感知机是什么.接下来将叙述感知机的对偶形式,这在解决支持向量机问题中非常有用,因为直接求解存在困难时,我们往往会把它变换到其等价形式进行求解.这篇将继续上篇内容,把遗留的两个问题解释清楚. 感知机 感知机学习算法的对偶形式 现在考虑感知机学习算法的对偶形式.感知机学习算法的原始形式和对偶形式在支持向量机学习算法的原始形式和对偶形式相对应. 对偶形式的基本想法是,将w和b表示为实例xi和标记yi的线性组合的形式,通过求解其系数而求得w和b,不失一般