2011-01-31 17 views
5

से 2 डी रूपांतरण मैट्रिक्स की गणना करना प्रोग्रामिंग की बात आती है और मेरी वर्तमान समस्या ने मुझे स्टंप करने का कोई मतलब नहीं है।एक प्रारंभिक और परिणामस्वरूप 2 डी मैट्रिक्स

मैं इस सवाल Trying to derive a 2D transformation matrix using only the images कि कम से कम आंशिक मेरे सवाल लेकिन छवि कि समाधान दिखाना चाहिए जवाब देने के लिए लगता है पाया है अब उपलब्ध नहीं है: एस

मैं सी # में नहीं काम कर रहा हूँ और के रूप में WPF का उपयोग कर न मेरी इनपुट या आउटपुट को ग्राफिकल रूप से प्रदर्शित करने की आवश्यकता है।

मेरे कार्यक्रम में मेरे पास 2 चतुर्भुज हैं, उन्हें एक इनपुट और आउटपुट चतुर्भुज कहते हैं।

इनपुट क्वाड में नीचे बाईं ओर से (2,1), (2,3), (4,4), (3,1) के सह-समन्वय होते हैं।

आउटपुट क्वाड में कोई सह-समन्वय हो सकता है और फिर नीचे बाईं ओर से क्रमशः सूचीबद्ध किया जाएगा।

इन 8 समन्वय जोड़े को देखते हुए, क्या एक रूपांतरण मैट्रिक्स की गणना करना संभव है जिसे मैं किसी एकल समन्वय जोड़ी पर लागू कर सकता हूं?

मै मैट्रिक्स पर बहुत गर्म नहीं हूं लेकिन मैं सही दिशा में इंगित करने के लिए सीखने के लिए तैयार हूं।

कई धन्यवाद

जोश

+1

मुझे नहीं लगता कि यहां बहुत अधिक मैट्रिक्स भागीदारी है; आप एक चतुर्भुज के भीतर एक बिंदु को एक चतुर्भुज के भीतर एक बिंदु पर प्रोजेक्ट करने के लिए एक आइसोमोर्फिक फ़ंक्शन मांग रहे हैं। यह बहुत कठिन नहीं होना चाहिए ... आपको केवल यह समझने की जरूरत है कि पहले और दूसरे बहुभुज के भीतर बिंदु एक दूसरे के लिए कैसे मानचित्र करते हैं। –

+0

आप http://math.stackexchange.com/questions/13404/mapping-irregular-quadrilateral-to-a-rectangle –

उत्तर

2

एक त्वरित Google या एक हॉप, छोड़ें और एक Google को this मिला। मुझे लगता है कि यह निश्चित रूप से आपकी समस्या का समाधान करेगा।

जैसा कि मैंने टिप्पणी में उल्लेख किया है, आप एक चतुर्भुज के भीतर एक बिंदु को दूसरे चतुर्भुज में एक बिंदु पर प्रोजेक्ट करने के लिए एक आइसोमोर्फिक फ़ंक्शन मांग रहे हैं। इसे मैन्युअल रूप से काम करने के बजाय मुझे नीचे एल्गोरिदम मिला है।

भावी पीढ़ी के लिए यहाँ एल्गोरिथ्म पोस्ट करना:

Let p00, p10, P11, और P01 पहले चतुर्भुज वामावर्त क्रम में सूचीबद्ध की कोने हो।

q00, q10, q11, और q01 को काउंटरक्लॉक वार क्रम में सूचीबद्ध दूसरे चतुर्भुज के शीर्ष दें।

परिभाषित P10 = p10-p00, P11 = P11-p00, P01 = P01-p00, प्रश्न 10 = q10-q00, प्रश्न 11 = Q11-q00, और Q01 = q01-q00।

ए और बी की गणना करें ताकि Q11 = aQ10 + bQ01।

यह दो अज्ञातों में दो रैखिक समीकरणों का एक सेट है।

इसी तरह, गणना सी और डी ताकि पी 11 = सीपी 10 + डीपी 01।

ऐसा लगता है कि में एक> = 0, b> = 0, ए + बी> 1, सी> = 0, घ> = 0, और ग + d> 1.

किसी भी बिंदु पी चतुर्भुज को पी = (1-xy) पी 00 + xp10 + yp01 लिखा जा सकता है जहां x = 0, y = 0, (1 - डी) x + c (y - 1) = 0, और डी (x - 1) + (1 - सी) वाई = 0.

चतुर्भुज में किसी बिंदु बिंदु q = (1-uv) q00 + uq10 + vq01 जहां u = 0, v = 0, (1 - बी) यू + ए (वी -1) = 0, और बी (यू - 1) + (1 - ए) वी = 0.

परिप्रेक्ष्य मैपिंग (यू, वी) से (एक्स, वाई) यू = एम 0 एक्स एन 0 + एन 1 एक्स + एन 2 वाई और वी = एम 1 एन एन 0 + एन 1 एक्स + एन 2y जहां एम 0 = विज्ञापन (1 - सी - डी), एम 1 = बीसी (1 - सी - डी), एन 0 = सीडी (1 - ए - बी), एन 1 = डी (ए - सी + बीसी - विज्ञापन), और एन 2 = सी (बी-डी - बीसी + विज्ञापन)।

प्रभावी ढंग से पी-चतुर्भुज एक "मानक" एक, < को मैप किया है (0, 0), (1, 0), (0, 1), (सी, डी)>

और q -क्वाड्रिप्रेटल को < (0, 0), (1, 0), (0, 1), (ए, बी)> पर मैप किया गया है।

(x, y) से (u, v) मैपिंग इन दोनों से संबंधित है।

आप सत्यापित कर सकते हैं कि

• (एक्स, वाई) = (0, 0) को मैप किया है (u, v) = (0, 0)

• (एक्स, वाई) = (1, 0) को मैप किया है (यू, वी) = (1, 0)

• (एक्स, वाई) = (0, 1) से (u, v) = (0, 1)

मैप किया गया है

• (एक्स, वाई) = (सी, डी) के लिए मैप किया गया है (u, v) = (क, ख)

मैं देने के लिए जा रहा हूँ एक और जवाब जो वर्णन करता है कि मैं टिप्पणियों में उदाहरण कैसे हल करूंगा - यह जवाब बहुत लंबा हो रहा है।

+0

वह शानदार किर्क है, जो आपके ज्ञान को साझा करने के लिए बहुत धन्यवाद। –

+0

ग्रेट सामान, किर्क। –

+0

ठीक है दोस्तों, मैंने इसे कोड में सबसे अच्छा लगाया है क्योंकि मुझे पता है कि यह मेरे लिए कैसे काम नहीं कर रहा है। मैं वर्तमान में एक नमूना अनुप्रयोग का उपयोग कर रहा हूं जहां मैं मैन्युअल रूप से सभी समन्वय परिभाषित करता हूं और सरल परिवर्तनों का उपयोग करता हूं, मुझे नतीजे नहीं मिल रहे हैं। उदाहरण के लिए यदि मैं शुरुआती के लिए 0,0 से 10x10 वर्ग का उपयोग करता हूं, और 20x20 वर्ग भी 0,0 से करता हूं, जब मैं प्रारंभिक के लिए एक्स और वाई के रूप में 5,5 को सह-इनपुट करता हूं, तो मुझे 10, 10 परिणामस्वरूप, फिलहाल मुझे 5,5 मिलते हैं। जब मैं ऐसा करता हूं, ए, बी, सी, डी के मान 1 होते हैं जब मुझे लगता है कि वे नहीं होना चाहिए। क्या किसी को पता है कि मैं गलत कहां गया हूं? –

2

अपने प्रश्न के शीर्षक भ्रामक है, क्योंकि यह संकेत मिलता है कि आप प्रारंभिक और अंतिम मैट्रिक्स है। वास्तव में आपके पास क्या है, अंक के दो सेट हैं: शुरुआती बिंदु और समापन बिंदु।

सबसे पहले, के रूप में आप का उल्लेख किया है, यह संभव गणना करने के लिए एक परिवर्तन मैट्रिक्स है, लेकिन जरूरी नहीं कि परिवर्तन मैट्रिक्स। किसी भी विशेष परिवर्तन के लिए, इसे पूरा करने के लिए कई (अनंत?) तरीके हैं।

ध्यान दें कि निम्नलिखित कुछ विचार हैं। मैंने वास्तव में ऐसा नहीं किया है। मुझे लगता है कि आपके पास अंक के दो सेट हैं, A और B, और आप निश्चित रूप से जानते हैं कि B कुछ परिवर्तन को A पर लागू करने का परिणाम है।

समस्या केवल तभी होती है जब केवल परिवर्तन की अनुमति ही अनुवाद हो। उस स्थिति में, आप केवल नीचे बाएं बिंदुओं के बीच की दूरी ले सकते हैं। यही है, यदि मूल बिंदु A[0]A[3] के माध्यम से हैं, और नए अंक B[0]B[3] के माध्यम से हैं, तो रूपांतरण केवल एक्स, वाई अनुवाद: ((B[0].X - A[0].X), (B[0].Y - A[0].Y)) है।

यदि स्केलिंग की अनुमति भी है, तो आप अनुवाद और फिर स्केलिंग को समझ सकते हैं। हालांकि सरलीकृत करने के लिए, पहले आप मूल में अनुवाद करना चाहते हैं। वास्तव में, यदि आप पहले मूल में अनुवाद करते हैं तो इनमें से अधिकतर सरल हो जाता है।

यदि रोटेशन की अनुमति है, तो चीजें थोड़ा और मुश्किल हो जाती हैं। चतुर्भुज को देखते हुए, सबसे पहले आपको चीज को घुमाएं ताकि अंक मूल के समान उन्मुखीकरण में हों। इसके लिए आपको अंक के बीच की दूरी की गणना करने और अनुपात का उपयोग करने के लिए यह पता लगाने के लिए कि कौन सा बिंदु निचला बायां है। फिर उचित जगह में घुमाएं।

घूर्णन, स्केलिंग और अनुवाद का मामला हल करने के लिए सरल होना चाहिए।

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

+0

को भी देखना चाहते हैं, मुझे आपके उत्तर के पहले भाग को पसंद है। प्रश्न का मेरा पठन यह था कि निर्देशांक का दूसरा सेट * किसी भी * निर्देशांक का सेट हो सकता है; घूर्णन, स्केल, शीयर सभी टेबल पर हैं। कोई 'असली' रोटेशन (90 डिग्री से अधिक) नहीं होगा, क्योंकि ये नीचे-बाएं सबसे कोने से निर्धारित केवल दो चतुर्भुज हैं। –

+0

@ किर्क: आप "चतुर्भुज" के अर्थ की जांच करना चाहेंगे। यह सिर्फ 4-पक्षीय आकार है। तो वहां * वास्तविक रोटेशन हो सकता है। –

+0

यह मानना ​​वास्तव में उचित नहीं है कि मैं चतुर्भुज के अर्थ को नहीं जानता, है ना? मेरा मुद्दा यह था कि 2 चतुर्भुज के लिए, दोनों परिभाषित * पूरी तरह से * 4 निर्देशांक द्वारा, और जहां निर्देशांक को 'नीचे बाएं' से घड़ी की दिशा में आदेश दिया जाता है, तो आप किसी भी 'रोटेशन' को कैसे निर्धारित कर सकते हैं? यदि आपको पता था कि क्यू 1 से कौन सा कोने क्यू 2 में किस कोने में मैप किया गया है, तो आपको दिया गया है कि आपको 'रोटेशन' हो सकता है, लेकिन जब आपके पास यह जानकारी उपलब्ध नहीं है तो रोटेशन एक अप्रासंगिक अवधारणा है। –

1

एक उदाहरण केस हल करने के लिए - एक वर्ग (0,0) - (10,10) से एक वर्ग (0,0) - (20,20) पर एक बिंदु (5,5) को स्थानांतरित करना - आप चालू हैं सही ट्रैक लेकिन या तो बहुत जल्द बंद हो गया या खो गया। एल्गोरिदम सबसे सरल नहीं है लेकिन यह समझने के बाद यह काफी उपयोगी है कि आप कहां जा रहे हैं।

'वर्ग' से निपटने के दौरान जो x & वाई अक्षों के लंबवत हैं, तो हाँ a = b = c = d = 1

चलिए अपने क्वाड पी 1, पी 2, पी 3 और पी 4 के बिंदुओं को कॉल करते हैं। अब पी 2 और पी 3 (पी 1 के सापेक्ष) के बीच संबंधों का वर्णन करने के रूप में a के बारे में सोचें, और बी 4 और पी 3 (पी 1 के सापेक्ष) के बीच समान संबंध का वर्णन करने के रूप में। बहुत simplistically, आप a और b बाहर काम करना चाहते हैं जहां

  • एक्स p1 के समन्वय + a * length of side p1-p2 = एक्स पी 3 के समन्वय, और
  • y p1 + b * length of side p1-p4 की समन्वय = y p3 की समन्वय।

यानी नीचे बाईं ओर से शुरू होता है, शीर्ष दाएं कोने के एक्स समन्वय को प्राप्त करने के लिए मुझे कितने नीचे किनारों की आवश्यकता होती है, और इसी तरह y समन्वय के लिए। यद्यपि यह एक मुट्ठी भर है, जब आप एक वर्ग से निपट रहे हैं तो सही परिणाम निश्चित रूप से 1 और 1 है। एक बार जब आप लंबवत वर्गों से दूर चले जाते हैं तो यह काफी सरल नहीं है लेकिन यह कल्पना करना आसान है।

जब आप को हल इस

  • p =(1-x-y)p00 + xp10 + yp01, जहां
  • x >= 0
  • y >= 0
  • (1 - d)x + c(y - 1) = 0
  • d(x - 1)+(1 - c)y = 0

एक बिंदु (5,5) का उपयोग करके आपको x = 1/2, y = 1/2 का मान मिलेगा। ध्यान दें कि ये आपके बिंदु के एक्स और वाई निर्देशांक नहीं हैं। इसके बजाय वे प्रतिनिधित्व करते हैं कि चतुर्भुज को (1,1) आकार वर्ग के लिए अनुमानित किया गया था, तो आपका बिंदु कहां बैठेगा। इस मामले में उनका मतलब है कि आपका बिंदु 1/2 रास्ता (क्षैतिज) और 1/2 रास्ता ऊपर (लंबवत) आपके बहुभुज में स्थित है - यानी यह बीच में है।

अपने a,b,c,d,x और y मूल्यों को बड़े समीकरण में प्लग करें (लिंक को यहां पढ़ने की कोशिश करने के बजाय लिंक का पालन करें!), आप भी (यू, वी) = (1/2, 1/2) प्राप्त करते हैं, जहां आप & v उपरोक्त एक ही अवधारणा का प्रतिनिधित्व करते हैं लेकिन दूसरे वर्ग में। यह सही है क्योंकि परिणामी बिंदु दूसरे बहुभुज के बीच में होने की उम्मीद है।

अंत में, जब आप

समीकरण में

  • q =(1-u-v)q00 + uq10 + vq01
अपने u, v में प्लग आप बिंदु q = (10,10) प्राप्त होंगे, जो कि तुम क्या उम्मीद।

मुझे नहीं पता & कोड में एक साथ समीकरणों को हल करने के बारे में नहीं सोचा है, मुझे यकीन है कि एक तरीका है लेकिन यह आसान नहीं हो सकता है लेकिन दुर्भाग्य से मुझे इसे आपके पास छोड़ना होगा। मैंने अभी पेपर के टुकड़े पर यह किया है और यह सब काम किया है; हालांकि मेरे गणित अधिक मामूली उदाहरण से ज्यादा कुछ करने के लिए थोड़ा जंगली है।

+0

हाय किर्क, मुझे लगता है कि मैं खो गया और उस तथ्य के कारण जल्दी बंद कर दिया। मैं इस कोड को बाद में आज लागू करने के बारे में देखूंगा जब मेरा दिमाग थोड़ा बेहतर काम करेगा। –

+0

@ जोश मैं आपको कागज पर पहले इसे चलाने की सलाह देता हूं ताकि आप देख सकें कि यह कैसे काम करता है; फिर कोड में इसे लागू करने का प्रयास करें। –

+0

सुझाव के लिए धन्यवाद, मैंने इसे दो अलग-अलग परिदृश्यों के साथ पेपर पर जल्दी से चलाया है और यह अच्छी तरह से काम करता प्रतीत होता है। मैंने इसे कोड में कार्यान्वित किया और ऐसा लगता है कि यह सब मेरे लिए एक ही परिदृश्य के लिए काम कर रहा है लेकिन कोड इनपुट और आउटपुट पैराम के अधिक जटिल बदलावों के साथ खत्म हो रहा है। मैं कुछ दिनों में इसे और देखने जा रहा हूं जब मेरा दिमाग थोड़ा ताजा महसूस कर रहा है और मैं वहां से जाऊंगा। चीयर्स फिर से। –

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