2009-10-01 14 views

cevap

5

Aday üyesine ait asin() veya acos() öğesini b veya c.

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

Bunun arkasındaki matematik Kuvars 2D Programlama Kılavuz alt bölüm "Matris arkasında Math" açıklanmıştır: http: // Ölçek olduğunda developer.apple.com/mac/library/DOCUMENTATION/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html#//apple_ref/doc/uid/TP30001066-CH204-CJBECIAD –

+2

asin ve acos doğru değil. Doğru formül: CGFloat radians = atan2f (self.view.transform.b, self.view.transform.a); CGFloat derece = radyan * (180/M_PI); – lbsweek

0

CGAffineTransformMakeRotation'un ne yaptığını tersine çevirmek için acos() ve asin() işlevlerini kullanmayı deneyebilirsiniz. Bununla birlikte, buradaki Ölçek dönüştürme matrisini aldığınız için, bunu yapmak biraz zor olabilir.

0

Geçmişte benzeşik bir matristen dönme çıkarmak için GeoTools araç gelen XAffineTransform sınıfı kullanılan sahip. Ölçeklendirme ve kesme işlemi uygulandığında bile çalışır.

Bu bir Java kütüphanesidir, ancak kolayca (Objective-) C'ye dönüştürebilirsiniz. the source for XAffineTransform here'a bakabilirsiniz. (Yöntem getRotation olarak adlandırılır.) Ve read the API here yapabilirsiniz. Ayrıca getScale/getShear yöntemleri uygulamak gerekiyordu

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); 

:

Bu

yöntemin kalbidir. Hiç de zor değil. (Olduğu gibi Çoğunlukla sadece Java kodu kopyalayabilirsiniz.)

5
atan2(rotationTransform.b, rotationTransform.d) 

birileri tarafından önerilen acos (b) çözümü aralığı +/- 0.5pi içinde geçerlidir. Bu çözüm, neredeyse kesinlikle kesilmemesine rağmen, rotasyon, çeviri ve ölçekleme kombinasyonları altında sağlam görünmektedir. Daha önceki cevabım (atan2(rotationTransform.b, rotationTransform.a) ölçeklendirme için sağlam değildi.

This duplicate was the basis for my original answer. Ölçek olduğunda, asin ve acos doğru değil

+2

Sanırım, "atan2 (rotationTransform.b, rotationTransform.d)" –

+0

Luiz - Bunlar hem çeviri hem de döndürme kombinasyonları altında aynı ve doğrudur, ancak ölçekleme eklendiğinde sizinki de doğru gibi görünüyor. güncellemek için Teşekkür ederim. Transform.b, transform.d kullanarak –

+0

günü kurtardı! Teşekkürler! – srik

0

.

doğru formüldür:

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

ya:

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