CoreGraphics 之CGAffineTransform仿射变换(3)

 CoreGraphics 的 仿射变换 可以用于 平移、旋转、缩放变换路径 或者图形上下文。

   (1)平移变换将路径或图形上下文中的形状的当前位置平移到另一个相对位置。举例来说,如果你在(10,20)的位置处画一个点,对它应用(30,40)的平移变换,然后绘制它,这个点将被绘制在(40,60)的位置处。为了创建一个平移变换,使用CGAffineTransformMakeTranslation函数,它将返回一个CGAffineTransform类型的仿射变换,这个函数的两个参数指定x和y方向上以点为单位的平移量。我们还可以使用CGContextTranslateCTM过程对图形上下文应用变换。

 平移变换路径

1//平移变换 2 3-(void)drawRect:(CGRect)rect 4{ 5 CGMutablePathRef path = CGPathCreateMutable(); 6 CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f); 7 8 CGAffineTransform transform = CGAffineTransformMakeTranslation(100.0f, 0.0f); 9 10 11 CGContextRef currentContext = UIGraphicsGetCurrentContext(); 12 CGPathAddRect(path, &transform, rectangle); 13 CGContextAddPath(currentContext, path); 14 [[UIColor brownColor] setStroke]; 15 [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill]; 16 CGContextSetLineWidth(currentContext, 5.0f); 17 CGContextDrawPath(currentContext, kCGPathFillStroke); 18 CGPathRelease(path); 19}

平移变换图形上下文

1-(void)drawRect:(CGRect)rect 2{ 3 CGMutablePathRef path = CGPathCreateMutable(); 4 CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 300.0f); 5 CGPathAddRect(path, NULL, rectangle); 6 7 CGContextRef currentContext = UIGraphicsGetCurrentContext(); 8 CGContextSaveGState(currentContext); 9 10 CGContextTranslateCTM(currentContext, 100.0f, 40.0f); 11 12 CGContextAddPath(currentContext, path); 13 [[UIColor colorWithRed:0.20f green:0.6f blue:0.8f alpha:1.0f] setFill]; 14 [[UIColor brownColor] setStroke]; 15 16 CGContextSetLineWidth(currentContext, 5.0f); 17 CGContextDrawPath(currentContext, kCGPathFillStroke); 18 19 CGPathRelease(path); 20 21 CGContextRestoreGState(currentContext); 22 23 24 25}

    (2)缩放是另外一个你可以使用的变换。你可以很容易地让CoreGraphics 对形状进行缩放,例如一个圆形缩放到原来的100倍。要创建一个仿射缩放变换,使用CGAffineTransformMakeScale函数,它返回一个CGAffineTransform 类型的变换对象。如果你想直接对一个图形上下文使用缩放变换,使用CGContextScaleCTM过程来缩放当前变换矩阵。

 缩放路径

1-(void)drawRect:(CGRect)rect 2{ 3 CGMutablePathRef path = CGPathCreateMutable(); 4 CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f); 5 6 7 CGAffineTransform transform = CGAffineTransformMakeScale(0.5f, 0.5f); 8 9 CGContextRef currentContext = UIGraphicsGetCurrentContext(); 10 CGPathAddRect(path, &transform, rectangle); 11 CGContextAddPath(currentContext, path); 12 [[UIColor brownColor] setStroke]; 13 [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill]; 14 CGContextSetLineWidth(currentContext, 5.0f); 15 CGContextDrawPath(currentContext, kCGPathFillStroke); 16 CGPathRelease(path); 17}

  缩放图形上下文

1-(void)drawRect:(CGRect)rect 2{ 3 CGMutablePathRef path = CGPathCreateMutable(); 4 CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 300.0f); 5 CGPathAddRect(path, NULL, rectangle); 6 7 CGContextRef currentContext = UIGraphicsGetCurrentContext(); 8 CGContextSaveGState(currentContext); 9 10 11 CGContextScaleCTM(currentContext, 0.5f, 0.5f); 12 13 CGContextAddPath(currentContext, path); 14 [[UIColor colorWithRed:0.20f green:0.6f blue:0.8f alpha:1.0f] setFill]; 15 [[UIColor brownColor] setStroke]; 16 17 CGContextSetLineWidth(currentContext, 5.0f); 18 CGContextDrawPath(currentContext, kCGPathFillStroke); 19 20 CGPathRelease(path); 21 22 CGContextRestoreGState(currentContext); 23 24 25 26}

  (3)就像缩放和平移,你可以对绘制在路径上的形状和图形上下文应用旋转变换。你可以使用CGAffineTransformMakeRoation函数和一个旋转的弧度值来获取一个CGAffineTransform类型的变换.如果你想对整个图形上下文旋转指定角度,可以使用CGContextRotateCTM过程。

  旋转路径

1-(void)drawRect:(CGRect)rect 2{ 3 CGMutablePathRef path = CGPathCreateMutable(); 4 CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f); 5 6 CGAffineTransform transform = CGAffineTransformMakeRotation((45.0f * M_PI) / 180.0f); 7 CGContextRef currentContext = UIGraphicsGetCurrentContext(); 8 CGPathAddRect(path, &transform, rectangle); 9 CGContextAddPath(currentContext, path); 10 [[UIColor brownColor] setStroke]; 11 [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill]; 12 CGContextSetLineWidth(currentContext, 5.0f); 13 CGContextDrawPath(currentContext, kCGPathFillStroke); 14 CGPathRelease(path); 15}

  旋转图形上下文

1-(void)drawRect:(CGRect)rect 2{ 3 CGMutablePathRef path = CGPathCreateMutable(); 4 CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 300.0f); 5 CGPathAddRect(path, NULL, rectangle); 6 7 CGContextRef currentContext = UIGraphicsGetCurrentContext(); 8 CGContextSaveGState(currentContext); 9 CGContextRotateCTM(currentContext, (45.0f * M_PI) / 180.0f); 10 CGContextAddPath(currentContext, path); 11 [[UIColor colorWithRed:0.20f green:0.6f blue:0.8f alpha:1.0f] setFill]; 12 [[UIColor brownColor] setStroke]; 13 14 CGContextSetLineWidth(currentContext, 5.0f); 15 CGContextDrawPath(currentContext, kCGPathFillStroke); 16 17 CGPathRelease(path); 18 19 CGContextRestoreGState(currentContext); 20 21 22 23}

   另外我们还可以组合变换效果,使用 CGAffineTransformConcact函数组合两个变换效果,这个函数的两个参数都是类型为CGAffineTransform类型的变换。

组合多个变换效果,同时进行平移和缩放

1-(void)drawRect:(CGRect)rect 2{ 3 CGMutablePathRef path = CGPathCreateMutable(); 4 CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f); 5 6 CGAffineTransform transform1 = CGAffineTransformMakeTranslation(100.0f, 0.0f); 7 CGAffineTransform transform2 = CGAffineTransformMakeScale(0.5f, 0.5f); 8 CGAffineTransform transform = CGAffineTransformConcat(transform1, transform2); 9 CGContextRef currentContext = UIGraphicsGetCurrentContext(); 10 CGPathAddRect(path, &transform, rectangle); 11 CGContextAddPath(currentContext, path); 12 [[UIColor brownColor] setStroke]; 13 [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill]; 14 CGContextSetLineWidth(currentContext, 5.0f); 15 CGContextDrawPath(currentContext, kCGPathFillStroke); 16 CGPathRelease(path); 17}
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

OpenCV实现仿射变换

什么是仿射变换?¶(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.opencv.org.cn%2Fopencvdoc%2F2.3.2%2Fhtml%2Fdoc%2Ftutorials%2Fimgproc%2Fimgtrans%2Fwarp_affine%2Fwarp_af

HTML5中canvas知识点详解4

一.变换的三种方式1.平移:translate(25,25);2.扩大缩小:scale(0.9,0.9);//注意:在一个循环的操作中,倍数是可以累加的,还有border也是可以放大缩小的。3.旋转:rotate(Math.PI/10);二.实例操作<!DOCTYPEhtmlPUBLIC"/

10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换

1.几何变换的基本概念  图像几何变换又称为图像空间变换,它将一副图像中的坐标位置映射到另一幅图像中的新坐标位置。我们学习几何变换就是确定这种空间映射关系,以及映射过程中的变化参数。图像的几何变换改变了像素的空间位置,建立一种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下面两种计算:1.原图像任意像素

D3D12学习笔记3.3——仿射变换

·仿射变换是由一个线性变换与一个平移变换组合而成。对于向量来说平移操作是没有意义的,而平移变换只能应用于点。·齐次坐标表示,是将原先的三元组扩展成四元组,第四个坐标w的取值将根据被描述对象是点还是向量而定。具体如下:w0是向量,w1是点。·说完两个基本概念后,我们来说说仿射变换的具体公式:!a(u)\iota(u)b

GAMES101 作业0 图形学

简介作业用来校验自己做的是否正确。请不用copy,因为这是cheatyouself。题目给定一个点P(2,1),将该点绕原点先逆时针旋转45◦,再平移(1,2),计算出变换后点的坐标(要求用齐次坐标进行计算)。codeinclude<cmathinclude<eigen3/Eig

CoreGraphics 之CGAffineTransform仿射变换(3) - HelloWorld