座標變換Quartz 2D

http://www.aichengxu.com/view/46588    轉載地址

iOS--座標變換Quartz 2D中的CGContextTranslateCTM、CGContextScaleCTM、,有需要的朋友可以參考下。


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控件本身的外觀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章