CGAffineTransformMake(a,b,c,d,tx,ty) 矩阵运算原理

Stella981
• 阅读 718

CGAffineTransformMake(a,b,c,d,tx,ty)

a d 缩放, b c 旋转, tx ty 位移

(x , y) -> (x' , y') 的公式

    x' = ax + cy + tx
    y' = bx + dy + ty

矩阵的基本知识:

struct CGAffineTransform {
  CGFloat a, b, c, d;
  CGFloat tx, ty;
};

CGAffineTransform CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty);

为了把二维图形的变化统一在一个坐标系里,引入了齐次坐标的概念,即把一个图形用一个三维矩阵表示,其中第三列总是(0,0,1),用来作为坐标系的标准。所以所有的变化都由前两列完成。

以上参数在矩阵中的表示为:

CGAffineTransformMake(a,b,c,d,tx,ty) 矩阵运算原理

运算原理:原坐标设为(X,Y,  1)

                          | a    b    0 |

    (X,Y,  1)   ⅹ   | c    d    0 |     =     (aX + cY + tx , bX + dY + ty , 1) ;

                          | tx    ty   1 |

通过矩阵运算后的坐标(aX + cY + tx, bX + dY + ty, 1) 我们对比一下可知:

一、设a=d=1, b=c=0

(aX + cY + tx ,  bX + dY + ty , 1) = (X  + tx , Y + ty , 1)

可见,这个时候,坐标是按照向量(tx,ty)进行平移,

也就是函数CGAffineTransform CGAffineMakeTranslation(CGFloat tx,CGFloat ty)的计算原理。

二、设b=c=tx=ty=0

(aX + cY + tx ,  bX + dY + ty , 1) = (aX , dY , 1)

可见,这个时候,坐标X按照a进行缩放,Y按照d进行缩放,a,d就是X,Y的比例系数,

也就是函数CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)的计算原理。

a对应于sx,d对应于sy。

三、设tx=ty=0,a=cosβ,b=sinβ,c=-sinβ,d=cosβ

(aX + cY + tx , bX + dY + ty , 1) = (Xcosβ - Ysinβ , Xsinβ + Ycosβ , 1)

可见,这个时候,β就是旋转的角度,逆时针为正,顺时针为负。

也就是函数CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)的计算原理。

angle即β的弧度表示。

参考:

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq\_affine/dq\_affine.html

http://justsee.iteye.com/blog/1969933

点赞
收藏
评论区
推荐文章
Java:输出1~20000内的所有素数,按每行5个打印出来
publicclassSupublicstaticvoidmain(Stringargs)intx,y;intk0;for(x2;x<1000;x)//11000的素数从2开始booleanflagtrue;for(y2;y<x;y)if(x%y0)flagfalse;
Wesley13 Wesley13
3年前
C语言函数:用位运算交换的方法交换两个变量值
void inplace_swap(int x, int y){    y  x ^ y; //Step 1    x  x ^ y; //Step 2    y  x ^ y; //Step 3 }int main(){  
Stella981 Stella981
3年前
Python OpenCV实例:图像灰度拉伸
coding:utf8'''灰度拉伸定义:灰度拉伸,也称对比度拉伸,是一种简单的线性点运算。作用:扩展图像的直方图,使其充满整个灰度等级范围内公式:g(x,y)255/(BA)f(x,y)A,其中,Aminf(x,y),最小
Wesley13 Wesley13
3年前
3D数学
4D向量和4x4矩阵不过是对3D运算的一种方便的记忆而已。4D齐次空间4D向量有4个分量,前3个是标准的x,y和z分量,第4个是w,有时称作齐次坐标。为了理解标准3D坐标是怎样扩展到4D坐标的,让我们先看一下2D中的齐次坐标,它的形式为(x,y,w)。想象在3D中w1处的标准2D平面,实际的2D点(x,y)用齐次坐标表示为(x,
Stella981 Stella981
3年前
Julia
算术运算符算术运算符适用于所有的基本数值类型x,一元加法,就是x本身\x,一元减法,x的相反数xy,二元加法,做加法运算xy,二元减法,做减法运算x\y,乘法,做乘法运算x/y,除法,做除法运算x^y,乘方,x的y次幂x%y,取余,x除以y然后取余数,等价于
Wesley13 Wesley13
3年前
常用模块之
importdatetimeimporttimeprint(time.strftime('%y/%m/%d%X'))输出结果:18/06/0520:40:46print(time.strftime('%Y/%m/%d%X'))输出结果:2018/06/
Wesley13 Wesley13
3年前
Unity脚本
1,Transform旋转 transform.Rotate(X,Y,Z);//分别绕X,Y,Z轴旋转,可写为绕某个轴旋转,栗子transform.Rotate(0,90,0); transform.Rotate(Vector3.right\Time.deltaTime);//以欧拉角旋转,顺序是ZXY,right是向X轴
Wesley13 Wesley13
3年前
PHP字符串函数
<?php$x10;$x$x;echo$x;//输出10$c10;$c$c;echo$c;//输出10$y10;$y$y;echo$y;//输出10$z10;$z
Wesley13 Wesley13
3年前
51nod 1318 最大公约数与最小公倍数方程组(2
题意给你$n$个元素,$m$个方程。每个方程形如$$\\begin{align}\\gcd(x\_i,y\_i)c\_i\\\\mathrm{lcm}(x\_i,y\_i)d\_i\\end{align}$$之类的形式。询问这个方程组是否有解。有$T$组数据。$1\\leT\\le10,1\
小万哥 小万哥
7个月前
C++ 数学函数、头文件及布尔类型详解
C数学C有许多函数可以让您在数字上执行数学任务。最大值和最小值max(x,y)函数可用于找到x和y的最大值:示例cppcout<<max(5,10);而min(x,y)函数可用于找到x和y的最小值:示例cppcout<<min(5,10);C头