CGAffineTransform与CATransform3D的认识

                               CGAffineTransform(是一个3*3的矩阵)

CGAffineTransform与CATransform3D的认识_第1张图片
默认矩阵


CGAffineTransform与CATransform3D的认识_第2张图片
系统定义的矩阵结构


CGAffineTransform与CATransform3D的认识_第3张图片
通过矩阵的相乘得到显示的每个点的坐标

X'=ax+cy+tx;

Y'=bx+dy+ty;

其中a是控制x的缩放比例,d是控制y的缩放比例;

x会跟着c的值进行拉伸(c*y,与y有关系),y会跟着b的值进行拉伸(b*x,说明x有关),要注意到的是c和b的值改变不会影响到View的point(center中心点)的改变。这是个很有意思的两个参数。其实,这里返回的就是每个点的坐标。b,c的值不会影响到center。当我们改变b ,c的时候,我们所计算出来的点形成的view的center,并不是原来的center。我们需要把对view进行平移,到原来的中心点,这样才是view显示出来的frame。


CGAffineTransform与CATransform3D的认识_第4张图片
测试代码

显然原来的frame:(50,50,100,100)

改变c的值后的frame:(0,50,200,100)

现在让我们来计算一下:1.取出view的四个顶点(50,50),(150,50),(50,150),(150,150)。

2.计算这四个顶点结果分别于矩阵| 1 0 0  |      

                                                       | 1 1  0  |

                                                       | 0 0  1  |                                                                          

想乘结果为 (100,50)(200,50)(200,150) (300,150)

相连后是一个平行四边形。所在的矩阵frame为(100 ,50 ,200,100),center(200,100)。因为center(原来的center(100,100))不变,需要左平移动   100      ,那么得到的frame是(0,50,200,100)。与运行得到的frame是一样的。    

x会跟着t.x进行x做表平移,y会跟着t.y进行平移。这里的point(center)是跟着变换的


CGAffineTransformInvert(CGAffineTransf)是将 b , c, tx ,ty变成原来的相反数(-b,-c,-tx,-ty)矩阵。如果你设置的矩阵,运行log打印:CGAffineTransformInvert: singular matrix。那么你不会得到反转后的矩阵,会还是原来的矩阵。

①CGPointApplyAffineTransform(CGPoint point,CGAffineTransform t)  得到转化后point CGPoint

②CGSizeApplyAffineTransform(CGSize size,CGAffineTransform t)          得到转化后size CGSize

③CGRectApplyAffineTransform(CGRect rect,CGAffineTransform t)        得到转化后rect CGRect




                                         CATransform3D(4*4矩阵)

{

CGFloat m11(x缩放), m12(y切变), m13(), m14();

CGFloat m21(x切变), m22(y缩放), m23(), m24();

CGFloat m31(), m32(), m33(), m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。当然,z方向上得有变化才会有透视效果(就是近大远小));

CGFloat m41(x平移), m42(y平移), m43(z平移), m44();

};

你可能感兴趣的:(CGAffineTransform与CATransform3D的认识)