[iOS][筆記] Transform

原文請參考。以下並非完全的翻譯,而是以我自己的角度理解並且整理的結果。另外太簡單的我就不寫在內了。


Quartz 2D drawing model定義了兩個分開的座標空間(coordinate spaces):
  • user space
  • device space
user space的座標是浮點數(floating point number),當你要顯示你的內容時,Quartz會將user space coordinate轉映到device space coordinate,你不需要為了在不同的device上顯示而做額外的工作。
預設的user space可以透過CTM (current transformation matrix)來調整。當你創建一個graphic context後,CTM會是 identity matrix。可以使用Quartz transformation functions去調整CTM來改變在user space上的繪圖結果。

About Quartz Transformation Functions

CTM代表著user space和device space之間的轉換矩陣(或是映射、函數)。
Quartz 2D API提供了一些函數讓你取得和修改CTM,你可以做到下列這些行為:
  • rotate
  • scale
  • translate
  • concatenate:連接上述幾個的結果

Modifying the Current Transformation Matrix

簡單說呢,就是直接操作CTM,透過下面三個函數,不過這樣講可能有點模糊,就是你可以直接針對著context的CTM調整,和下面諸如CGAffineTransformMakeTranslation之類的差異在於,後者是先建立好一個CGAffineTransform,然後之後才套用在transform上,前者是立即的使用,當你呼叫並執行的時候就立刻的改變了device space上呈現的結果了。
可使用的函數有:
  • CGContextTranslateCTM
  • CGContextRotateCTM
  • CGContextScaleCTM
連續著使用就是concatenate了。

Creating Affine Transforms

你可以先建好一些affine transform matrices等待之後用於CTM上。相關的函數有以下六個,基本上只有三種功能:
  • CGAffineTransformMakeTranslation
  • CGAffineTransformMakeRotation
  • CGAffineTransformMakeScale
以及
  • CGAffineTransformTranslate
  • CGAffineTransformRotate
  • CGAffineTransformScale
前三者是直接建立一個CGAffineTransform,後三者是對既存的CGAffineTransform再進行轉換。
另外還有反矩陣:
  • CGAffineTransformInvert
另外有對point、size和rect施以線性轉換的方法:
  • CGPointApplyAffineTransform
  • CGSizeApplyAffineTransform
  • CGRectApplyAffineTransform
或是自己建立全新的矩陣:
  • CGAffineTransformMake

Evaluating Affine Transforms

可以用CGAffineTransformEqualToTransform來檢查兩個affine transform是否相同。
CGAffineTransformIsIdentity可檢查一個affine transform是否是identity matrix

留言