iOS--座標變換Quartz 2D中的CGContextTranslateCTM、CGContextScaleCTM、CGContextRotateCTM、CGContextConcatCTM等
iOS講義總結
在iOS中,Quartz 2D提供了座標變換支援。
一、特殊的座標變換(平移、縮放、旋轉)
1. - void CGContextTranslateCTM ( CGContextRef c, CGFloat tx, CGFloat ty ):平移座標系統。
該方法相當於把原來位於 (0, 0) 位置的座標原點平移到 (tx, ty) 點。在平移後的座標系統上繪製圖形時,所有座標點的 X 座標都相當於增加了 tx,所有點的 Y 座標都相當於增加了 ty。
2. - void CGContextScaleCTM ( CGContextRef c, CGFloat sx, CGFloat sy ):縮放座標系統。
該方法控制座標系統水平方向上縮放 sx,垂直方向上縮放 sy。在縮放後的座標系統上繪製圖形時,所有點的 X 座標都相當於乘以 sx 因子,所有點的 Y 座標都相當於乘以 sy 因子。
3. - void CGContextRotateCTM ( CGContextRef c, CGFloat angle ):旋轉座標系統。
該方法控制座標系統旋轉 angle 弧度。在縮放後的座標系統上繪製圖形時,所有座標點的 X、Y 座標都相當於旋轉了 angle弧度之後的座標。
為了讓開發者在進行座標變換時無須計算多次座標變換後的累加結果,Quartz 2D還提供瞭如下兩個方法來儲存、恢復繪圖狀態。
- void CGContextSaveGState ( CGContextRef c ):儲存當前的繪圖狀態。
- void CGContextRestoreGState ( CGContextRef c ):恢復之前儲存的繪圖狀態。
需要說明的是,CGContextSaveGState() 函式儲存的繪圖狀態,不僅包括當前座標系統的狀態,也包括當前設定的填充風格、線條風格、陰影風格等各種繪圖狀態。但 CGContextSaveGState() 函式不會儲存當前繪製的圖形。
二、通用的座標變換(通過變換矩陣進行變換)
除了以上3個座標轉換方法之外,Quartz 2D提供更通用的座標轉換方法。
void CGContextConcatCTM ( CGContextRef c, CGAffineTransform transform ):使用 transform 變換矩陣對 CGContextRef 的座標系統執行變換,通過使用座標矩陣可以對座標系統執行任意變換。
CGAffineTransform CGContextGetCTM ( CGContextRef c ):獲取CGContextRef的座標系統的變換矩陣。
上述兩個方法中都涉及一個關於矩陣的API:CGAffineTransform。
建立CGAffineTransform的4種方式:
1. CGAffineTransform CGAffineTransformMakeTranslation ( CGFloat tx, CGFloat ty ):建立進行位移變換的變換矩陣。該函式的兩個引數與前面介紹的位移變換的兩個引數的作用相同。
2. CGAffineTransform CGAffineTransformMakeScale ( CGFloat sx, CGFloat sy ):建立進行縮放變換的變換矩陣。該函式的兩個引數與前面介紹的縮放變換的兩個引數的作用相同。
3. CGAffineTransform CGAffineTransformMakeRotation ( CGFloat angle ):建立進行旋轉變換的變換矩陣。該函式的引數與前面介紹的旋轉變換的引數的作用相同。
4. CGAffineTransform CGAffineTransformMake ( CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty ):該函式使用自定義變換矩陣執行變換。
其中 ( a, b, c, d )會形成變換矩陣,tx、ty為橫向和縱向的位移,變換後結果應該為:
a, b
(x, y) x (c, d) + (tx, ty) = (xa x yc, xb x yd) + (tx, ty) = (xa x yc + , xb x yd + ty)。
一般座標變換矩陣
1)水平映象(繞 Y 軸做對稱變化):CGAffineTransformMake ( -1, 0, 0, 1, 0, 0 )
-1, 0
0, 1
2) 垂直映象(繞 X 軸做對稱變化):CGAffineTransformMake ( 1, 0, 0, -1, 0, 0 )
1, 0
0, -1
3)繞 x=y軸做對稱變化:CGAffineTransformMake ( 0, 1, 1, 0, 0, 0 )
0, 1
1, 0
4)繞x =-y軸做對稱變化:CGAffineTransformMake ( 0, -1, -1, 0, 0, 0 )
0, -1
-1, 0
5)做“水平傾斜”的變換,此時 Y 座標無須變換,只要將 X 座標增加 tan( angle ) x X 即可(angle 代表順時針轉過的角度):CGAffineTransformMake ( 1, 0, tan(angle), 1, 0, 0 )
1, 0
tan(angle), 1
6)做“垂直傾斜”的變換,此時 X 座標無須變換,只要將 Y 座標減少 tan( angle ) x X 即可:CGAffineTransformMake ( 1, -tan(angle), 0, 1 )
1, -tan(angle)
0, 1
三、複合矩陣座標變換
1. CGAffineTransform CGAffineTransformTranslate ( CGAffineTransform t, CGFloat tx, CGFloat, ty ):對已有的變換矩陣 t 額外增加位移變換。
2. CGAffineTransform CGAffineTransformScale ( CGAffineTransform t, CGFloat sx, CGFloat sy ):對已有的變換矩陣 t 額外增加縮放變換。
3. CGAffineTransform CGAffineTransformRotate ( CGAffineTransform t, CGFloat angle ):對已有的變換矩陣 t 額外增加旋轉變換。
4. CGAffineTransform CGAffineTransformInvert ( CGAffineTransform t ):對已有的變換矩陣 t 進行反轉。
5. CGAffineTransform CGAffineTransformConcat ( CGAffineTransform t1, CGAffineTransform t2 ):將兩個變換矩陣進行疊加。
四、對CGPoint、CGSize和CGRect進行座標變換
1. CGPoint CGPointApplyAffineTransform ( CGPoint point, CGAffineTransform t ):對指定的CGPoint執行變換,函式返回座標變換後的CGPoint。
2. CGSize CGSizeApplyAffineTransform ( CGSize size, CGAffineTransform t ):對指定的CGSize執行變換,函式返回座標變換後的CGSize。
3. CGRect CGRectApplyAffineTransform ( CGRect rect, CGAffineTransform t ):對指定的CGRect執行變換,函式返回座標變換後的CGRect。
五、對UIView進行座標變換
UIView提供了一個transform屬性,該屬性支援設定CGAffineTransform變換矩陣,這樣就可對UIView控制元件本身進行座標變換,從而改變UIView控制元件本身的外觀。