से रोटेशन प्राप्त करें क्या सीजीएफ़ाइन ट्रान्सफॉर्म से घूर्णन के कोण को प्राप्त करना संभव है जिसमें अनुवाद और स्केलिंग मान भी हैं? यदि हां, तो कैसे?केवल CGAffineTransform
अग्रिम धन्यवाद!
से रोटेशन प्राप्त करें क्या सीजीएफ़ाइन ट्रान्सफॉर्म से घूर्णन के कोण को प्राप्त करना संभव है जिसमें अनुवाद और स्केलिंग मान भी हैं? यदि हां, तो कैसे?केवल CGAffineTransform
अग्रिम धन्यवाद!
एफ़िन सदस्य बी या सी के asin() या acos() लें।
struct CGAffineTransform {
CGFloat a;
CGFloat b;
CGFloat c;
CGFloat d;
CGFloat tx;
CGFloat ty;
};
आप CGAffineTransformMakeRotation करता है के विपरीत Acos() और asin() फ़ंक्शंस का उपयोग करने का प्रयास कर सकते हैं। हालांकि, चूंकि आपको वहां स्केल ट्रांसफॉर्म मैट्रिक्स गुणा हो गया है, इसलिए ऐसा करना थोड़ा मुश्किल हो सकता है।
मैं में पिछले 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 तरीकों को लागू करने होंगे:
इस विधि का दिल है। बिल्कुल मुश्किल नहीं है। (अधिकांश भाग के लिए आप सिर्फ जावा कोड कॉपी कर सकते हैं के रूप में।)
atan2(rotationTransform.b, rotationTransform.d)
acos (ख) समाधान किसी ने सुझाव दिया सीमा +/- 0.5pi में ही मान्य है। यह समाधान घूर्णन, अनुवाद और स्केलिंग के संयोजन के तहत मजबूत लगता है हालांकि लगभग निश्चित रूप से कतरनी नहीं है। मेरा पिछला उत्तर (atan2(rotationTransform.b, rotationTransform.a
) स्केलिंग के लिए मजबूत नहीं था।
मुझे लगता है कि यह 'atan2 (rotationTransform.b, rotationTransform.d) होना चाहिए ' –
लुइज़ - वे दोनों अनुवाद और रोटेशन के संयोजन के तहत समान और सही हैं, लेकिन स्केलिंग जोड़े जाने पर भी आपका सही रहता है इसलिए मैं जा रहा हूं इसे अद्यतन करने के लिए। धन्यवाद। –
transform.b का उपयोग कर, transform.d दिन बचाया! धन्यवाद! – srik
स्किन होने पर एसिन और एकोस सही नहीं है।
सही सूत्र है:
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];
इस के पीछे का गणित क्वार्ट्ज 2 डी प्रोग्रामिंग गाइड के उप-अनुभाग "मैट्रिसेस के पीछे गणित" से समझाया गया है: http: // developer.apple.com/mac/library/DOCUMENTATION/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html#//apple_ref/doc/uid/TP30001066-CH204-CJBECIAD –
असिन और एकोस स्केल होने पर सही नहीं है। सही सूत्र है: CGFloat radians = atan2f (self.view.transform.b, self.view.transform.a); CGFloat डिग्री = रेडियंस * (180/एमएफआई); – lbsweek