iOS--坐標變換Quartz 2D中的CGContextTranslateCTM、CGContextScaleCTM、

在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提供更通用的坐標轉換方法。

1、void CGContextConcatCTM ( CGContextRef c, CGAffineTransform transform ):使用 transform 變換矩陣對 CGContextRef 的坐標系統執行變換,通過使用坐標矩陣可以對坐標系統執行任意變換。
2、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

  1. 垂直鏡像(繞 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控件本身的外觀。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容