2010-04-22 50 views
17

我發現了一個類似的問題,關於只獲得旋轉,但據我所知,縮放和旋轉變換矩陣中的工作不同。只獲得CGAffineTransform的縮放變換

矩陣是不是我的強項,所以如果有人會暗示我怎麼去僅縮放了CGAffineTransform的我會非常感激。

btw。我嘗試在CGSize上應用CGAffineTransform,然後獲取高度x寬度來查看縮放的大小,但高度x寬度有奇怪的值(取決於在CGAffineTransform中找到的旋轉,所以... hm不起作用)

回答

43

假設變換是一個縮放後跟一個旋轉(可能在那裏有一個平移但沒有歪斜),水平比例因子是sqrt(a^2+c^2),垂直比例因子是sqrt(b^2+d^2),並且水平比例因子與垂直縮放因子應爲a/d = -c/b,其中a,b,cdCGAffineTransform的六個成員中的四個,每the documentationtxty只代表翻譯,不影響比例因子)。

| a b 0 | 
| c d 0 | 
| tx ty 1 | 
+0

第一個答案獲得該商標。兩個投票都起來了。感謝您在這一點上發出一些光 – 2010-04-22 21:52:00

+1

雖然請注意,這種方式提取的比例將始終爲正值(負比例可用於翻轉對象)。 – thenickdude 2016-04-30 00:40:40

4

我不熟悉CGAffineTransform或Objective-C(你用數學標籤引起我的注意)。一般來說,您需要單獨退出轉換。例如,如果仿射變換進行縮放,旋轉和平移只(縮放和旋轉是不是在下面的方法重要的順序,但翻譯應該絕對算是最後):

翻譯:應用A到向量(0,0)將返回結果(tx,ty),其中tx和ty分別是X方向和Y方向的平移。對於向量(1,0)應用A並獲得(sx0 + tx,sx1 + ty)。在X的縮放將SQRT(SX0^2 + SX1^2)

縮放在Y:應用A向矢量(0,1),並獲得(SY0 + TX,SY1 + TY)。由於仿射變換是通過線性變換的簡單技巧實現的,並且由於線性變換不是可交換的,所以您需要了解在變換之前如何對變換進行排序實際上正在通過如何將個人變革拉出來。

23
- (CGFloat)xscale { 
    CGAffineTransform t = self.transform; 
    return sqrt(t.a * t.a + t.c * t.c); 
} 

- (CGFloat)yscale { 
    CGAffineTransform t = self.transform; 
    return sqrt(t.b * t.b + t.d * t.d); 
}