乐趣区

关于objective-c:CGAffineTransformMakeabcdtxty-矩阵运算原理

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),用来作为坐标系的规范。 所以所有的变动都由前两列实现。

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

运算原理:原坐标设为(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 即 β 的弧度示意。

公布于 2017/10/19 16:23
参考: https://developer.apple.com/l…_affine/dq_affine.html

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

退出移动版