2013-10-10 8 views
7

मैं निम्नलिखित पढ़ा है, One step affine transform for rotation around a point? से:मैं एक बिंदु के चारों ओर एक छवि को भरोसेमंद कैसे घुमा सकता हूं?

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y); 
transform = CGAffineTransformRotate(transform, a); 
transform = CGAffineTransformTranslate(transform,-x,-y); 

हालांकि, जब मैं इस तब्दील छवियों सभी नक्शे पर, और शायद ही कभी स्क्रीन पर रहे हैं।

मैंने सिस्टम बनाने के लिए थोड़ा सा प्रयास किया है जहां यह छवियों को रखेगा; यदि आप एक लूप चलाते हैं और कई मान देते हैं, तो सर्पिल दिखाई देता है। हालांकि, जब मैं अंततः छवियों के घूर्णन और उन बिंदुओं के बीच संबंधों को उलझाने में सक्षम हो सकता हूं, जिन्हें मैं चाहता हूं कि वे घूमने के लिए चाहते हैं, तो मैं सबसे अच्छा समाधान मांगना चाहता हूं "मेरे पास एक छवि है; मैं इस बिंदु पर विचार करता हूं केंद्र; मैं चाहता हूं कि यह इस राशि से अपने केंद्र के चारों ओर घूमता है लेकिन अन्यथा विस्थापित नहीं होता है। "

मैं http://JonathansCorner.com/ancient-clock/ का एक संशोधित बंदरगाह बनाने की कोशिश कर रहा हूं, और अभी मैं घंटे का हाथ रखने की कोशिश कर रहा हूं। उपरोक्त गीत और नृत्य करने के सभी प्रयास, और इसका अनुवाद करें ताकि उसका केंद्र वांछित केंद्र पर हो, विफल हो गया है।

कैसे, इस घड़ी के हाथों के लिए, क्या मैं कह सकता हूं "मैं निम्नलिखित घूर्णन में हाथ चाहता हूं" और उन्हें उचित रूप से केंद्र के चारों ओर रखा गया है?

--EDIT--

इस कोड, एक टिप्पणी के जवाब में परतों का उपयोग करने की कोशिश में संपादित की महत्वपूर्ण हिस्सा है:

UIImage *hourHandImage = [UIImage imageNamed:@"hour-hand.png"]; 
UIImageView *hourHandView = [[UIImageView alloc] initWithImage:hourHandImage]; 
float hourRotation = .5; 
hourHandImage = [UIImage imageNamed:@"hour-hand.png"]; 
hourHandView = [[UIImageView alloc] initWithImage:hourHandImage]; 
CGAffineTransform transform = CGAffineTransformMakeTranslation(centerX - 21, -centerY - 121); 
// transform = CGAffineTransformRotate(transform, hourRotation); 
// transform = CGAffineTransformTranslate(transform, 2 * centerX, 2 * centerY); 
hourHandView.transform = transform; 
hourHandView.layer.anchorPoint = CGPointMake(centerX, centerY); 
hourHandView.layer.affineTransform = CGAffineTransformRotate(transform, hourRotation); 
[self.view addSubview:hourHandView]; 

धन्यवाद,

- EDIT -

अब मेरे पास कुछ ख़राब है; अगर मैं निर्देश के कुछ का पालन करें, मेरे पास है:

CGAffineTransform transform = CGAffineTransformMakeTranslation(100 -21, 100 -121); 
transform = CGAffineTransformRotate(transform, hour/12.0 * M_PI * 2.0); 
transform = CGAffineTransformTranslate(transform, -330, 330); 
hourHandView.transform = transform; 

मैं उन संख्याओं बाहर हो रही पर काम करना चाहते हैं, लेकिन इस 9:00 एक घंटे सही ढंग से प्रदर्शित किया है।

आपकी सभी मदद के लिए धन्यवाद!

+0

आप उदाहरण छवियों को आप पोस्ट कर सकता की एक जोड़ी है? आप 'x' और' y' के रूप में क्या उपयोग कर रहे हैं? आप जिस चीज को घुमाने की कोशिश कर रहे हैं उसके बाध्य आयत के क्रमशः, आधा चौड़ाई और ऊंचाई होना चाहिए। –

+0

इसके अलावा, 'ए' क्या है? ध्यान दें कि इसे रेडियंस में व्यक्त किया जाना चाहिए, डिग्री नहीं। –

+0

दृश्य के लिए सभी ज्यामितीय जोड़-विरूपण एंकर बिंदु के आसपास होते हैं। उदाहरण, अगर एंकरपॉइंट = {0.5,0.5} (केंद्र), दृश्य घूमता है जैसे कि केंद्र के माध्यम से एक ज़ेड-अक्ष सही था। घड़ी के हाथ लगभग टिप के चारों ओर घूमते हैं, इसलिए आपको घंटा की तरह कुछ चाहिए .layer.anchorPoint = CGPointMake (0.5f, 0.9f); – Jano

उत्तर

6

यह पंक्ति:

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y); 

एक्स द्वारा छवि ले जाता है, वाई।

transform = CGAffineTransformRotate(transform, a); 

नियंत्रण बिंदु के आसपास यह घूमता है:

इस लाइन (Note-- आप नियंत्रण बिंदु के आसपास घूमता रहेगा, आपको लगता है कि होने के लिए निर्धारित किया है जो कुछ भी)।

यदि आपका नियंत्रण बिंदु ऊपरी बाएं कोने में (डिफ़ॉल्ट) है, तो यह शीर्ष lefthand कोने के आसपास घूम जाएगा।

आप इस निर्धारित करने की आवश्यकता:

[self layer].anchorPoint = CGPointMake(0.5, 0.5); 

यह परत के केंद्र के चारों ओर स्पिन करने के लिए।

+1

ऐसा लगता है कि आप यह भी नहीं समझ पाए हैं कि कैसे trabsformations काम करते हैं: मक etranslation एक ट्रांस मैट्रिक्स बनाता है जो सभी बिंदुओं को + x, + y द्वारा चलाता है; Roatate मौजूदा ट्रांसफॉर्म मैट्रिक्स का एक संयोजन बनाता है और (0,0) के आसपास एक रोटेशन मैट्रिक्स जोड़ता है। यदि आप एंकर पॉइंट सेट करते हैं तो रोटेशन के मामले में आईओएस आपके लिए दो ट्रान्डफॉर्मेटिन मैट्रिक्स बनाता है: पहले एंकर को (0,0) अपने roattion में ट्रांसफर करें, फिर वापस अनुवाद करें। – AlexWien

9

एक घूर्णन हमेशा (0,0) के आसपास किया जाता है।

किसी बिंदु के चारों ओर अनुवाद करने के लिए आपको सबसे पहले घुमावदार बिंदु (0,0) पर अनुवाद करने की आवश्यकता है और फिर इसे घुमाएं, और फिर इसे वापस अनुवाद करें।

तो यह होना चाहिए:

// cx, cy is center of screen 
// move (cx,cy) to (0,0) 
CGAffineTransform transform = CGAffineTransformMakeTranslation(-cx, -cy); 

// roate around (0,0) 
transform = CGAffineTransformRotate(transform, angleRadians); 

// mov e (0,0) back to (cx,cy) 
transform = CGAffineTransformTranslate(transform,cx,cy); 
7
hourImageView.layer.anchorPoint = CGPointMake(0.5f, 0.9f); 
CGFloat angle = hour/12.0 * M_PI * 2.0; 
hourHand.transform = CGAffineTransformMakeRotation(angle); 
0

स्विफ्ट 4.0

एक रोटेशन हमेशा के आसपास किया जाता है (0,0)।

एक बिंदु के आसपास अनुवाद करने के लिए आपको सबसे पहले घुमाव बिंदु (0,0) का अनुवाद करने की आवश्यकता है और फिर इसे घुमाएं, और फिर इसे वापस अनुवाद करें।

तो यह होना चाहिए:

// centerX, centerY is center of screen 
// move (centerX,centerY) to (0,0) 
var myTransform = CGAffineTransform(translationX: -centerX, y: -centerY) 

// rotate around (0,0) 
myTransform = myTransform.concatenating(CGAffineTransform(rotationAngle: angleInRadians)) 

// move (0,0) back to (cx,cy) 
myTransform = myTransform.concatenating(CGAffineTransform(translationX: centerX, y: centerY)) 

myView.transform = myTransform 
संबंधित मुद्दे

 संबंधित मुद्दे