仿射变换
在上一章中有一个时钟的例子,在这个例子中,就使用了UIView的transform属性做了变换,transform这个属性是CGAffineTransform类型的,这个方法大多数人应该都用过,在视图中也比较常用,比如旋转,平移,放大缩小这些操作。这里他们的变化都是在二维空间进行的,后面还会有三位变换。而不管它怎么变换,原先平行的边在变换后依然是平行的,
//旋转,这里的angle需要特别注意,使用中为弧度制,也可转化为角度制,M_PI_4为我们使用的单位常量,类似的还有M_PI_2(180度,即圆周率pi),M_PI(360度,2pi) CGAffineTransformMakeRotation(CGFloat angle) //放大缩小,为各边放大缩小的倍数,是边,不是整体 CGAffineTransformMakeScale(CGFloat sx, CGFloat sy) //平移,以原位置为参考,中心点偏移的距离,x,y为中心点坐标变化,可为负 CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty) //这里的宏定义把弧度转化为了我们常用的度数 #define RADIANS_TO_DEGREES(x) ((x)/M_PI*180.0)
关于图层旋转的原理,是一个3X2的矩阵,见下图
灰色数字为后面添加的,为什么要添加呢?高数里面我们知道矩阵相乘的规则,x*a + y*c+?*t,?不存在,所以就补了1,那么后面的0,0,1,根据公式相乘后还是1,是不会影响原值的,这只是为了方便运算。