最近在研究CoreText看了很多的例子其中有很多地方不是特別理解所以上網收集了IOS矩陣的轉換原理來記錄下
CGAffineTransformMake(a,b,c,d,tx,ty)
ad縮放bc旋轉tx,ty位移,基礎的2D矩陣
公式
x=ax+cy+tx
y=bx+dy+ty
1.矩陣的基本知識:
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),用來作為座標系的標準。所以所有的變化都由前兩列完成。
以上參數在矩陣中的表示為:
|a b 0|
|c d 0|
|tx ty 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即?的弧度表示。