2009-02-24 20 views
13

this programming game के संदर्भ में मैं वर्तमान में निर्माण कर रहा हूं।डब्ल्यूपीएफ: घूर्णन के बाद नए निर्देशांक प्राप्त करना

alt text http://img12.imageshack.us/img12/2089/shapetransformationf.jpg

WPF में एक कैनवास अनुवाद करने के लिए, मैं दो रूपों का उपयोग कर रहा: TranslateTransform (इसे स्थानांतरित करने के लिए), और RotateTransform (उसे घुमाने के लिए)

[एक हीTransformationGroup की बच्चों] जब मैं घुमाया नहीं जाता (या 90 डिग्री पर घुमाया जाता है, तो यह एक ही कैनवास के शीर्ष बाएं x, y निर्देशांक आसानी से प्राप्त कर सकता है, क्योंकि यह वही होगा), लेकिन जिस समस्या का सामना कर रहा हूं वह शीर्ष बाएं (और अन्य 3 अंक) प्राप्त कर रहा है। समन्वय करता है।

यह जब एक RotateTransform, लागू किया जाता है, क्योंकि है TranslateTransform के X और Y गुण नहीं बदल रहे हैं (और इस प्रकार अभी भी संकेत मिलता है कि बिंदीदार वर्ग की तरह ऊपर-बाईं ओर वर्ग की है (छवि से)

कैनवास अपने केंद्र से घुमाया जा रहा है, ताकि अपने मूल है।

तो मैं कैसे प्राप्त कर सकते हैं 'नई' एक्स और 4 अंक के y निर्देशांक एक रोटेशन के बाद?

[अद्यतन]

alt text http://img25.imageshack.us/img25/8676/shaperotationaltransfor.jpg

मैं खोजने के लिए एक रास्ता मिल गया है ऊपरी बाएं भाग (के रूप में आप नई छवि से देख सकते हैं) एक रोटेशन के बाद निर्देशांक रोटेशन से OffsetX और OffsetY जोड़कर प्रारंभिक एक्स और वाई निर्देशांक के लिए।

लेकिन अब मुझे शेष निर्देशांक (अन्य 3) को समझने में परेशानी हो रही है।

इस घुमावदार आकार के साथ, मैं शेष 3 कोनों के एक्स और वाई निर्देशांक कैसे प्राप्त कर सकता हूं?

[संपादित करें]

2 छवि में अंक सटीक और सही अंक नहीं हैं। मैंने अपने सिर में अनुमानों के साथ अंक बनाये।

[अद्यतन] समाधान:

सबसे पहले, मुझे लगता है कि लंबी और बहुत जानकारीपूर्ण पोस्ट जिसमें उन्होंने पूरी प्रक्रिया के पीछे गणित का वर्णन के लिए Jason S धन्यवाद देना चाहते हैं; मैंने निश्चित रूप से आपकी पोस्ट पढ़कर और मूल्यों को आजमाकर बहुत कुछ सीखा।

लेकिन अब मैं एक कोड का टुकड़ा (EugeneZ के TransformBounds का उल्लेख करने के लिए धन्यवाद) है कि वास्तव में करता है जो मैं चाहता पाया है:

public Rect GetBounds(FrameworkElement of, FrameworkElement from) 
{ 
    // Might throw an exception if of and from are not in the same visual tree 
    GeneralTransform transform = of.TransformToVisual(from); 

    return transform.TransformBounds(new Rect(0, 0, of.ActualWidth, of.ActualHeight)); 
} 

संदर्भ: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/86350f19-6457-470e-bde9-66e8970f7059/

+0

आप सबसे आसान तरीका है http://stackoverflow.com/a/22511805/2106820 –

उत्तर

13

तो मैं समझता हूँ कि आपके सवाल का सही:

given: 
shape has corner (x1,y1), center (xc,yc) 
rotated shape has corner (x1',y1') after being rotated about center 

desired: 
how to map any point of the shape (x,y) -> (x',y') by that same rotation 

यहाँ प्रासंगिक समीकरण है:

(x'-xc) = Kc*(x-xc) - Ks*(y-yc) 
(y'-yc) = Ks*(x-xc) + Kc*(y-yc) 

जहां Kc=cos(theta) और Ks=sin(theta) और theta वामावर्त रोटेशन के कोण है। (सत्यापित करने के लिए: यदि theta = 0 यह समन्वय को अपरिवर्तित छोड़ देता है, अन्यथा यदि xc = yc = 0, तो यह (1,0) से (cos (theta), पाप (theta)) और (0,1) से (- पाप (थेटा), कोस (थेटा))। चेतावनी: यह समन्वय प्रणालियों के लिए है जहां (x, y) = (1,1) ऊपरी दाएं चतुर्भुज में है। आपके लिए जहां यह निचले दाएं चतुर्भुज में है, थेटा होगा काउंटरक्लॉक रोटेशन के बजाए घड़ी के घूर्णन के कोण।)

यदि आप एक्सई अक्ष के साथ गठबंधन के अपने आयत के निर्देशांक जानते हैं, तो xc केवल दो एक्स-निर्देशांकों का औसत होगा और yc केवल औसत का औसत होगा दो वाई-निर्देशांक। (आपकी स्थिति में, यह xc = 75, yc = 85 है।)

यदि आप थेटा जानते हैं, तो अब आपके पास नए निर्देशांक की गणना करने के लिए पर्याप्त जानकारी है। यदि आप थेटा नहीं जानते हैं, तो आप केसी, केएस के लिए हल कर सकते हैं। जो एक system of linear equations कि हल किया जा सकता (पाठक के लिए व्यायाम है

(62-75) = Kc*(50-75) - Ks*(50-85) 
(40-85) = Ks*(50-75) + Kc*(50-85) 

-13 = -25*Kc + 35*Ks = -25*Kc + 35*Ks 
-45 = -25*Ks - 35*Kc = -35*Kc - 25*Ks 

: यहाँ अपने उदाहरण के लिए प्रासंगिक गणना है MATLAB में यह बताया गया है:

[-25 35;-35 -25]\[-13;-45] 

उपज के लिए इस मामले में,, सी = 1.027 , केएस = 0.3622 जो समझ में नहीं आता है (के = केसी + केएस शुद्ध रोटेशन के लिए 1 बराबर माना जाता है; इस मामले में यह के = 1.089 है) इसलिए यह शुद्ध रोटेशन नहीं है आयताकार केंद्र, जो आपकी ड्राइंग इंगित करता है आटेस। न ही यह मूल के बारे में एक शुद्ध घूर्णन प्रतीत होता है। जांच करने के लिए, पाइथागोरियन प्रमेय का उपयोग करके घूर्णन से पहले और बाद में घूर्णन के केंद्र से दूरी की तुलना करें, डी = डेलटैक्स + डेल्टे । (xc = 75, yc = 85 के बारे में घूर्णन के लिए, 43.01 से पहले दूरी 46.84 के बाद दूरी है, अनुपात के = 1.089 है; उत्पत्ति के घूर्णन के लिए, 70.71 से पहले दूरी, 73.78 के बाद की दूरी, अनुपात 1.043 है। विश्वास कर सकते हैं 1.01 या उससे कम अनुपात अनुपात को पूर्णांक से समन्वय से उत्पन्न होगा, लेकिन यह एक राउंडऑफ त्रुटि से स्पष्ट रूप से बड़ा है)

तो यहां कुछ गायब जानकारी है। आपको संख्याएं कैसे मिलीं (62,40)?

हालांकि, घूर्णन के पीछे गणित का मूल आधार है।

संपादित करें: आह, मुझे नहीं पता था कि वे अनुमान लगा रहे थे। (यथार्थवादी होने के करीब, हालांकि!)

+0

मुझे शुरुआती एक्स और वाई निर्देशांक ऑफसेटएक्स और ऑफसेट वाई से पुनर्प्राप्त किए गए उन नंबरों को मिलाकर प्राप्त किया गया है। रोटेशन मैट्रिक्स। इस प्रकार, अगर ऑफसेटएक्स 12 है, और "अज्ञात" आकार का एक्स 50 है, तो नया एक्स (रोटेशन के बाद) 62 है। वाई समन्वय –

+0

बीटीडब्ल्यू के लिए ही जाता है, बस स्पष्ट करने के लिए: छवि में जो अंक मैंने रखे हैं वे नहीं हैं असली अंक, और ऑफसेट भी असली नहीं हैं; मैंने उन्हें छवि –

+0

के लिए बनाया है, मुझे लगता है कि मान एक अनुमानित अनुमान हैं, उन्होंने उदाहरण के रूप में चित्रण दिखाया। – Drahcir

1

मैं सुनिश्चित नहीं हूं , लेकिन यह वही है जो आप खोज रहे हैं - कार्टेशियन समन्वय प्रणाली में एक बिंदु का घूर्णन: link

+0

यह पर एक नज़र होगा लगता है पा सकते हैं। धन्यवाद। –

1

आप ca n एक नया बिंदु प्राप्त करने के लिए एक ही बिंदु के साथ अपने प्वाइंट पर ट्रांसफॉर्म। ट्रांसफॉर्म() विधि का उपयोग करें, जिसमें इन परिवर्तनों को लागू किया गया था।

+0

ट्रांसफॉर्म() एक प्वाइंट वैरिएबल स्वीकार करता है। उस बिंदु के एक्स और वाई क्या होना चाहिए? –

+0

आपके कैनवास के बाएं और ऊपर –

+0

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

2

सामान्य ट्रान्सफॉर्म देखें। ट्रांसफॉर्मबाउंड() विधि।

Point newPoint = rotateTransform.Transform(new Point(oldX, oldY)); 

जहां rotateTransform उदाहरण है जिस पर मैं काम करते हैं और कोण सेट ... आदि है:

6

मैं इस विधि का उपयोग।

यहाँ
संबंधित मुद्दे