2009-10-01 18 views
6

से रोटेशन प्राप्त करें क्या सीजीएफ़ाइन ट्रान्सफॉर्म से घूर्णन के कोण को प्राप्त करना संभव है जिसमें अनुवाद और स्केलिंग मान भी हैं? यदि हां, तो कैसे?केवल CGAffineTransform

अग्रिम धन्यवाद!

उत्तर

5

एफ़िन सदस्य बी या सी के asin() या acos() लें।

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

इस के पीछे का गणित क्वार्ट्ज 2 डी प्रोग्रामिंग गाइड के उप-अनुभाग "मैट्रिसेस के पीछे गणित" से समझाया गया है: http: // developer.apple.com/mac/library/DOCUMENTATION/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html#//apple_ref/doc/uid/TP30001066-CH204-CJBECIAD –

+2

असिन और एकोस स्केल होने पर सही नहीं है। सही सूत्र है: CGFloat radians = atan2f (self.view.transform.b, self.view.transform.a); CGFloat डिग्री = रेडियंस * (180/एमएफआई); – lbsweek

0

आप CGAffineTransformMakeRotation करता है के विपरीत Acos() और asin() फ़ंक्शंस का उपयोग करने का प्रयास कर सकते हैं। हालांकि, चूंकि आपको वहां स्केल ट्रांसफॉर्म मैट्रिक्स गुणा हो गया है, इसलिए ऐसा करना थोड़ा मुश्किल हो सकता है।

0

मैं में पिछले GeoTools टूलकिट से XAffineTransform वर्ग इस्तेमाल किया एक affine मैट्रिक्स से रोटेशन को निकालने के लिए है। यह तब भी काम करता है जब स्केलिंग और कतरन लागू किया गया है।

यह जावा लाइब्रेरी है, लेकिन आप इसे आसानी से (उद्देश्य-) सी में परिवर्तित करने में सक्षम होना चाहिए। आप 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 तरीकों को लागू करने होंगे:

इस विधि का दिल है। बिल्कुल मुश्किल नहीं है। (अधिकांश भाग के लिए आप सिर्फ जावा कोड कॉपी कर सकते हैं के रूप में।)

5
atan2(rotationTransform.b, rotationTransform.d) 

acos (ख) समाधान किसी ने सुझाव दिया सीमा +/- 0.5pi में ही मान्य है। यह समाधान घूर्णन, अनुवाद और स्केलिंग के संयोजन के तहत मजबूत लगता है हालांकि लगभग निश्चित रूप से कतरनी नहीं है। मेरा पिछला उत्तर (atan2(rotationTransform.b, rotationTransform.a) स्केलिंग के लिए मजबूत नहीं था।

This duplicate was the basis for my original answer

+2

मुझे लगता है कि यह 'atan2 (rotationTransform.b, rotationTransform.d) होना चाहिए ' –

+0

लुइज़ - वे दोनों अनुवाद और रोटेशन के संयोजन के तहत समान और सही हैं, लेकिन स्केलिंग जोड़े जाने पर भी आपका सही रहता है इसलिए मैं जा रहा हूं इसे अद्यतन करने के लिए। धन्यवाद। –

+0

transform.b का उपयोग कर, transform.d दिन बचाया! धन्यवाद! – srik

0

स्किन होने पर एसिन और एकोस सही नहीं है।

सही सूत्र है:

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]; 
संबंधित मुद्दे