2009-10-01 68 views

回答

5

取出仿射成員b或c的asin()或acos()。

struct CGAffineTransform { 
    CGFloat a; 
    CGFloat b; 
    CGFloat c; 
    CGFloat d; 
    CGFloat tx; 
    CGFloat ty; 
}; 
+4

這背後的數學中的 「數學的矩陣的後面」 石英2D編程指南的分段說明:HTTP:// developer.apple.com/mac/library/DOCUMENTATION/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html#//apple_ref/doc/uid/TP30001066-CH204-CJBECIAD – 2009-10-01 17:58:18

+2

asin和acos在有規模時是不正確的。正確的公式是: CGFloat radians = atan2f(self.view.transform.b,self.view.transform.a); CGFloat度=弧度*(180/M_PI); – lbsweek 2014-02-25 09:51:38

0

您可以嘗試使用acos()和asin()函數來逆轉CGAffineTransformMakeRotation的操作。但是,由於您已將Scale變換矩陣乘以那裏,因此執行該操作可能有點困難。

0

我在過去使用的XAffineTransform類從GeoTools工具包,以提取從仿射矩陣的旋轉。即使在應用縮放和剪切時也能正常工作。

這是一個Java庫,但您應該能夠輕鬆將其轉換爲(Objective-)C。你可以看看the source for XAffineTransform here。 (該方法稱爲getRotation。)並且您可以read the API here

這是該方法的心臟:

final double scaleX = getScaleX0(tr); 
final double scaleY = getScaleY0(tr) * flip; 
return Math.atan2(tr.getShearY()/scaleY - tr.getShearX()/scaleX, 
        tr.getScaleY()/scaleY + tr.getScaleX()/scaleX); 

你需要同時實現的getScale/getShear方法。不難。 (在大多數情況下,你可以只複製Java代碼不變。)

5
atan2(rotationTransform.b, rotationTransform.d) 

的ACOS(B)溶液有人建議只在範圍+/- 0.5pi有效。這種解決方案在旋轉,平移和縮放的組合下看起來很穩健,但幾乎肯定不會剪切。我之前的回答(atan2(rotationTransform.b, rotationTransform.a)對縮放並不健壯。

This duplicate was the basis for my original answer

+2

我認爲它應該是'atan2(rotationTransform.b,rotationTransform.d)' – 2015-01-10 08:33:26

+0

Luiz - 它們在翻譯和旋轉的組合下都是相同和正確的,但是當縮放添加時,您的似乎仍然正確,所以我要去更新它。謝謝。 – 2015-01-14 17:20:02

+0

使用transform.b,transform.d保存了一天!謝謝! – srik 2016-05-03 11:23:25

0

asin和acos在有規模時是不正確的。

正確的公式是:

CGFloat radians = atan2f(self.view.transform.b, self.view.transform.a); 
CGFloat degrees = radians * (180/M_PI); 

或:

CGFloat angle = [(NSNumber *)[view valueForKeyPath:@"layer.transform.rotation.z"] floatValue];