回答
取出仿射成員b或c的asin()或acos()。
struct CGAffineTransform {
CGFloat a;
CGFloat b;
CGFloat c;
CGFloat d;
CGFloat tx;
CGFloat ty;
};
您可以嘗試使用acos()和asin()函數來逆轉CGAffineTransformMakeRotation的操作。但是,由於您已將Scale變換矩陣乘以那裏,因此執行該操作可能有點困難。
我在過去使用的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代碼不變。)
atan2(rotationTransform.b, rotationTransform.d)
的ACOS(B)溶液有人建議只在範圍+/- 0.5pi有效。這種解決方案在旋轉,平移和縮放的組合下看起來很穩健,但幾乎肯定不會剪切。我之前的回答(atan2(rotationTransform.b, rotationTransform.a
)對縮放並不健壯。
我認爲它應該是'atan2(rotationTransform.b,rotationTransform.d)' – 2015-01-10 08:33:26
Luiz - 它們在翻譯和旋轉的組合下都是相同和正確的,但是當縮放添加時,您的似乎仍然正確,所以我要去更新它。謝謝。 – 2015-01-14 17:20:02
使用transform.b,transform.d保存了一天!謝謝! – srik 2016-05-03 11:23:25
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];
- 1. 旋轉CGPoints; CIVector CGAffineTransform?
- 2. 使用CGAffineTransform的UIView旋轉
- 3. CGAffineTransform縮放和旋轉
- 4. iphone sdk CGAffineTransform獲取對象的旋轉角度
- 5. 獲取比例值並在CGAffineTransform中旋轉值xcode
- 6. 的UIView旋轉後調整與CGAffineTransform
- 7. CGAffineTransform:旋轉UIButton調整按鈕圖像
- 8. 旋轉後獲取座標
- 9. 從旋轉矩陣獲取有關y軸的旋轉
- 10. UIView無法調整時iOS8下CGAffineTransform旋轉
- 11. CGAffineTransform在幾次旋轉後讓UIBarButton變形
- 12. Raphael js獲取元素的旋轉
- 13. 從uiimageview獲取旋轉的圖像
- 14. iOS獲取子視圖的旋轉
- 15. WPF:旋轉後獲取新的座標
- 16. 自動旋轉關閉時獲取設備旋轉
- 17. 獲取旋轉角度旋轉視圖後
- 18. 將NSAffineTransform轉換爲CGAffineTransform
- 19. 將CGAffineTransform轉換爲NSString
- 20. 轉換CSS3動畫:旋轉。獲取旋轉元件當前角度的方法?
- 21. 創建動態旋轉器並獲取每個旋轉器的值,每當旋轉器項更改時,獲取所有旋轉器值
- 22. 螺旋工具包,獲取新的旋轉矢量
- 23. 旋轉JLabel並讀取旋轉值
- 24. 獲取旋轉度和度數顯示
- 25. 從matrix3d獲取CSS3旋轉週期數
- 26. Android:從URI獲取EXIF旋轉
- 27. 從旋轉位圖獲取像素Android
- 28. Unity - Sprite旋轉+獲取角度
- 29. 使用CGAffineTransform應用不成比例縮放和旋轉後的失真
- 30. CGAffineTransform轉去錯誤的方式
這背後的數學中的 「數學的矩陣的後面」 石英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
asin和acos在有規模時是不正確的。正確的公式是: CGFloat radians = atan2f(self.view.transform.b,self.view.transform.a); CGFloat度=弧度*(180/M_PI); – lbsweek 2014-02-25 09:51:38