2010-07-06 8 views
7

वर्तमान में मैं एक सॉफ्टवेयर कंपनी में इंटर्न कर रहा हूं और मेरे कार्यों में से एक माउस जेस्चर की पहचान को लागू करने के लिए किया गया है। वरिष्ठ डेवलपर्स में से एक ने मुझे शुरू करने में मदद की और कोड/परियोजनाएं प्रदान की जो $ 1 यूनिस्ट्रोक रिकॉग्नाइज़र http://depts.washington.edu/aimgroup/proj/dollar/ का उपयोग करती हैं। मुझे विस्तृत तरीके से मिलता है, $ 1 यूनिस्ट्रोक रिकॉग्नाइज़र क्या कर रहा है और यह कैसे काम करता है लेकिन इसके सभी आंतरिक/बेहतर विवरणों को समझने की कोशिश करने के साथ थोड़ा सा अभिभूत हूं।माउस जेस्चर से उत्पन्न अंकों की सूची से सभी लाइन सेगमेंट कैसे निर्धारित करें?

मेरी समस्या यह है कि मैं माउस डाउनवर्ड को ऊपर ले जाने के संकेत को पहचानने की कोशिश कर रहा हूं, फिर ऊपर। $ 1 यूनिस्ट्रोक रिकॉग्नाइज़र यह निर्धारित करता है कि मैंने जो इशारा किया है वह नीचे की इशारा था, जो वास्तव में यह करना चाहिए कि उसे क्या करना चाहिए। मैं वास्तव में ऐसा करना चाहता हूं कि "मैं एक डाउनर्ड इशारा पहचानता हूं और फिर ऊपर की ओर इशारा करता हूं।"

मुझे नहीं पता कि $ 1 यूनिस्ट्रोक रिकॉग्नाइज़र की समझ की कमी पूरी तरह से मुझे अपने सिर को खरोंच कर रही है, लेकिन क्या किसी के पास कोई विचार है कि माउस को नीचे की ओर आगे बढ़ने से दो अलग-अलग संकेतों को कैसे पहचानें?

यहां मेरा विचार है कि मैंने सोचा कि मेरी मदद कर सकती है लेकिन किसी ऐसे व्यक्ति के लिए प्यार करेगी जो एक विशेषज्ञ है या मुझे यह जानने के लिए कि आप क्या सोचते हैं, उससे थोड़ा और मुझे पता है। आपको पता है कि कोई भी सहायता या संसाधन बहुत सराहना की जाएगी।

कैसे मेरे आवेदन वर्तमान में कार्य करता है:

तरीका है कि मेरे वर्तमान आवेदन काम करता है कि मैं जहां माउस कर्सर है, जबकि उपयोगकर्ता बाईं माउस बटन नीचे धारण से अंक पर कब्जा है। बिंदुओं की एक सूची को इशारा पहचानकर्ता को फ़ीड मिल जाता है और फिर यह कैप्चर किए गए बिंदुओं के लिए कोरसपॉन्ड का सबसे अच्छा आकार/इशारा होने के बारे में सोचता है।

मेरे विचार:

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

एक तरीका मैंने सोचा कि यह निर्धारित करने में अच्छा होगा कि अंक की मेरी सूची में अलग-अलग रेखाएं हैं, जो अंक के समूह का नमूनाकरण कर रही हैं और उनकी ढलान को देख रही हैं। यदि अंकों के नमूने वाले समूह की ढलान नमूना बिंदुओं के किसी अन्य समूह से X% भिन्न होती है तो यह मानना ​​सुरक्षित होगा कि वास्तव में एक अलग पंक्ति मौजूद है।

मैं क्या सोचता संभावित समस्याओं मेरी सोच में हैं:

  • मैं एक पंक्ति के अंत और एक अलग लाइन की शुरुआत कहाँ तय करते हैं? अगर मैं बिंदुओं के समूह की ढलान की जांच करने के विचार का उपयोग करना चाहता था और फिर यह निर्धारित किया कि एक अलग रेखा मौजूद है जिसका मतलब यह नहीं है कि मुझे निस्संदेह एक अलग रेखा की ढलान मिली है। उदाहरण के लिए यदि आप दाएं कोण के साथ सीधे किनारे वाले "एल" को आकर्षित करना चाहते हैं और "एल" के कोने के चारों ओर बिंदुओं की ढलान का नमूना देते हैं तो आप देखेंगे कि ढलान गूंजने वाला संकेत देगा कि एक अलग रेखा मौजूद है लेकिन वे बिंदु एक अलग रेखा की शुरुआत के अनुरूप नहीं हैं।

  • घुमावदार रेखा की कभी-कभी बदलती ढलान से कैसे निपटें? इशारा पहचानकर्ता जिसे मैं पहले से ही वैसे ही हैंडल वक्र का उपयोग करता हूं।लेकिन मैं नहीं चाहता कि मैं अपनी विधि को अलग-अलग लाइनों को निर्धारित करने के लिए उपयोग करता हूं ताकि वे वक्र में इन तथाकथित अलग-अलग लाइनों को देख सकें क्योंकि जब मैं अंक के समूह का नमूना देता हूं तो इसकी ढलान हर समय बदलती जा रही है। एक बार ढलान X% से अधिक बार पंक्ति में बदल जाने के बाद क्या मैं नमूना अंक बंद कर दूंगा?

  • मैं अलग लाइनों को निर्धारित करने के लिए गणित के सही "प्रकार" का उपयोग नहीं कर रहा हूं। गणित मेरा सबसे मजबूत विषय नहीं है लेकिन मैंने कुछ शोध किया है। मैंने डॉट उत्पादों को देखने की कोशिश की और देखा कि क्या मुझे कुछ दिशा में इंगित किया जाएगा, लेकिन मुझे नहीं पता कि यह क्या होगा। क्या किसी ने इस तरह या कुछ अन्य विधि करने के लिए डॉट प्रोडक्ट्स का उपयोग किया है?

अंतिम विचार, टिप्पणियां, और धन्यवाद:

मेरी समस्या का एक हिस्सा मुझे पसंद लग रहा है मैं नहीं जानता कि कैसे compeletly मेरे सवाल पूछने के लिए है। मुझे आश्चर्य नहीं होगा अगर इस समस्या को पहले से ही पूछा जा चुका है (एक तरफ या किसी अन्य तरीके से) और एक समाधान मौजूद है जिसे गुगल किया जा सकता है। लेकिन Google पर मेरे खोज परिणामों ने कोई समाधान नहीं दिया क्योंकि मुझे अभी पता नहीं है कि अभी तक मेरे प्रश्न से कैसे पूछना है। अगर आपको लगता है कि यह भ्रमित है तो कृपया मुझे बताएं कि कहां और क्यों और मैं इसे स्पष्ट करने में मदद करूंगा। ऐसा करने में शायद Google पर मेरी खोज अधिक सटीक हो जाएगी और मैं समाधान ढूंढ पाऊंगा।

मैं बस अपनी पोस्ट पढ़ने के लिए धन्यवाद कहना चाहता हूं। मुझे इसकी लंबी जानकारी है लेकिन वास्तव में यह नहीं पता था कि यह कहां से पूछना है। इमामा कार्यालय के आस-पास के कुछ अन्य लोगों के साथ बात करती है लेकिन पूरे स्कूल में मैंने अपने सभी बेहतरीन समाधानों का उपयोग स्टैक ओवरफ्लो समुदाय से किया है, इसलिए मुझे आपके लिए बहुत धन्यवाद देना है। इस पोस्ट के लिए

संपादन:

(7/6 4:00 PM) एक और विचार के बारे में मैं एक न्यूनतम/अधिकतम बिंदु से पहले सभी बिंदुओं की तुलना की गई थी सोचा। उदाहरण के लिए, यदि मैंने माउस डाउनवर्ड को ऊपर की तरफ ले जाया है, तो मेरा शुरुआती बिंदु वर्तमान मैक्स पॉइंट होगा जबकि उस बिंदु पर जहां मैं माउस को ऊपर की तरफ ले जाना शुरू करूँगा, मेरा न्यूनतम बिंदु होगा। मैं आगे बढ़ सकता था और देख सकता था कि न्यूनतम बिंदु के बाद कोई बिंदु है या नहीं और यदि ऐसा कहें कि एक नई संभावित रेखा हो सकती है। मुझे पता नहीं है कि यह सितारों जैसे अन्य आकारों पर कितना अच्छा काम करेगा लेकिन यह एक और चीज है जिसे मैं देखने जा रहा हूं। क्या किसी ने इससे पहले ऐसा कुछ किया है?

+0

क्या आप संतुष्ट होंगे यदि आपके रिकॉग्नाइज़र ने इसे "जेन-यूपी" के एक इशारे के रूप में पहचाना है, या क्या आप वाकई इशारा को दो आदिम संकेतों, {डाउन, यूपी} के अनुक्रम में तोड़ना चाहते हैं? – Beta

+1

यदि मैं सही ढंग से समझ गया तो आपके पास पहले से ही लाइनों की एक सेरी है, जिसे प्रत्येक बिंदु जोड़ी द्वारा परिभाषित किया गया है, लेकिन सरलीकरण चाहता है - बस "इच्छित" रेखाएं। मेरा सुझाव है कि आप डगलस-पेकर लाइन सरलीकरण एल्गोरिदम पर एक नज़र डालें। यह आपको वह देना चाहिए जो आप खोज रहे हैं। http://www.cs.sunysb.edu/~algorith/implement/DPsimp/implement.shtml –

+0

अगर मैं इसे एक "इशारा-यूपी" के रूप में पहचानता हूं तो मैं संतुष्ट होगा।लेकिन यह जानना अभी भी महत्वपूर्ण होगा कि इस मामले में मेरी मूल पोस्ट में लिखे गए कुछ कैसे करें जो अब संतोषजनक नहीं है। धन्यवाद विदर। मैं अभी उस पर देखो। : डी – Chris

उत्तर

1

आपकी समस्या को सीधे या सुचारू रूप से घुमावदार आंशिक लाइनों में एक सामान्य वक्र अलग तोड़ने तक ही सीमित हो सकते हैं तो आप इस की कोशिश कर सकते।

खंडों की ढलान तुलना और तोड़ने अंक की पहचान जहां यह अधिक से अधिक तो कुछ सीमा एक बहुत ही सरल बनाया मामले में काम होता है। एक पूरी तरह से गठित एल-आकार की कल्पना करें जहां आपके पास दो सीधी रेखाओं के बीच एक सही कोण है। स्पष्ट रूप से कोने बिंदु एकमात्र ऐसा होगा जहां ढलान अंतर थ्रेसहोल्ड से ऊपर है जब तक कि सीमा 0 और 9 0 डिग्री के बीच हो, और इस प्रकार एक पहचानने योग्य बिंदु।

हालांकि, ऊर्ध्वाधर और क्षैतिज लाइनों थोड़ा तो सीमा ढलान में इन छोटे मतभेदों को तोड़ने के अंक के रूप में ध्यान नहीं दिया जा करने के लिए के लिए काफी बड़ी अवश्य होना चाहिए कि घुमावदार हो सकता है। आपको यह भी तय करना होगा कि एक कोने के रूप में एल्गोरिदम को कितना तेज़ करना चाहिए। 90 डिग्री या उससे अधिक की आवश्यकता है, या 30 डिग्री भी पर्याप्त है? यह एक महत्वपूर्ण सवाल है।

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

मूल रूप से एल्गोरिथ्म होगा:

  • प्रत्येक जांच बिंदु के लिए (अनुक्रम में एन अंक शुरुआत और अंत से पहले एन अंत के बिंदुओं।)
    • कंप्यूट की औसत ढलान एन पिछले खंड।
    • एन अगले खंडों की औसत ढलान की गणना करें।
    • यदि औसत का अंतर थ्रेसहोल्ड से अधिक है, तो वर्तमान बिंदु को ब्रेकिंग पॉइंट के रूप में चिह्नित करें।

यह काफी मेरे सिर के ऊपर से है। आपको इसे अपने आवेदन में आजमाने की ज़रूरत होगी।

+0

मैं निश्चित रूप से आपके विचार की तरह हूं। मुझे पता है कि एक तथ्य के लिए मैं उन रेखाओं को पहचानने में सक्षम हूं जिनके पास एक कोने है जो 10 से 170 डिग्री के बीच है। इंसानों से बहुत अधिक स्टैंड प्वाइंट अगर वे अंतर कर सकते हैं कि कुछ कोने (चाहे लाइनें चिकनी हों या नहीं) तो मुझे पृथक रेखा खंडों को अलग करने में सक्षम होना चाहिए। जहां तक ​​एक अच्छा एन मुझे लगता है मुझे बस प्रयोग करना होगा? वर्तमान में मेरा विनिर्देश/डिज़ाइन 64 प्रविष्टियों से कम या कम अंक की एक सूची प्रदान करता है। इससे कोई फर्क नहीं पड़ता कि मैं ढलान के लिए किस बिंदु का उपयोग करता हूं? आईई क्या मैं ढलान लेने के लिए 1 और 5 वें बिंदु का उपयोग कर सकता हूं? – Chris

+0

हां, एन को परीक्षण और त्रुटि से चुना जाना होगा। यदि यह बहुत छोटा है तो आप अलग-अलग रेखाओं के रूप में छोटे जिगल्स उठाएंगे और घुमावदार कोनों को याद करेंगे जो टूट जाना चाहिए था। यदि यह दूसरी तरफ बहुत बड़ा है तो आप आसानी से घुमावदार लाइनों को तोड़ सकते हैं और घुमावदार ब्रेस ({) में मध्यवर्ती जैसे स्थानीय कोनों को याद कर सकते हैं। इसे टिकाऊ रखें और आपको निश्चित रूप से कुछ उपयुक्त सेटिंग मिल जाएगी। ढलान के लिए मैं केवल आसन्न बिंदुओं का उपयोग करता हूं। (1, 2), (द्वितीय, तीसरा), आदि। एन-औसत का उपयोग करके निरीक्षण बिंदु से दूर ढलानों को स्वाभाविक रूप से परिणाम में तौला जाएगा। –

1

यदि आप ऊपर और नीचे की तरह पूर्ण कोणों के साथ काम करते हैं, तो आप केवल दो बिंदुओं (अनिवार्य रूप से आसन्न) के बीच पूर्ण ढलान नहीं ले सकते हैं यह निर्धारित करने के लिए कि यह सही है, बाएं, यूपी, नीचे (यदि वह एक भेद पर्याप्त है)

कला ताकि कोण यादृच्छिक नहीं है अंक के बीच एक दूरी को मिल रहा है (1px साथ, कोण की 45 डिग्री)

एक बहु वहाँ नेविगेशन के लिए एक फ़ायरफ़ॉक्स प्लगइन माउस संकेत उपयोग कर रहा है हो जाएगा कि बहुत अच्छी तरह से काम करता है। मुझे लगता है कि यह फायर जेस्चर है, लेकिन मुझे यकीन नहीं है। मुझे लगता है कि आप उस

अतिरिक्त विचार: यदि आप लगातार अंक से कनेक्शन बनाते हैं, तो पहले बिंदु पर कनेक्ट करके, क्षेत्र और अंतिम पंक्ति खंड की लंबाई के बीच अनुपात भी एक संकेतक है इशारा के "edginess" के लिए

+0

मेरे कोण वास्तव में बिल्कुल नहीं हैं क्योंकि मैं एक विकर्ण रेखा इशारा का परीक्षण और पहचान कर सकता हूं। मुझे लगता है कि आप क्या पूछ रहे हैं? मुझे नहीं लगता कि मैं आपकी पोस्ट को पूरी तरह से समझता हूं जब आप यह भी कहते हैं कि कला अंक के बीच दूरी ढूंढना है ताकि कोण यादृच्छिक न हो। मैं भी फ़ायरफ़ॉक्स प्लगइन में भी देखता हूं। एक बार फिर धन्यवाद! : डी – Chris

+0

मेरा मतलब था कि इससे कोई फर्क नहीं पड़ता कि इशारा कौन सा घूर्णन है। आपको सिर्फ यह पता होना चाहिए कि कोई रेखा नीचे जाती है, न कि अगर समग्र इशारा आधा सर्कल की तरह कुछ जटिल आकार बनाता है, जो ऊपरी या निचले आधा हो सकता है। मेरा दूसरा बयान यह था कि यदि दूरी बहुत छोटी है, तो उपयोगकर्ता ठीक से नियंत्रित नहीं कर सकता कि वह किस दिशा में जाएगा। जैसे यदि आप सीधे एक रेखा खींचते हैं, तो आप कुछ पिक्सेल बंद हो जाएंगे। यदि आप प्रत्येक दो बिंदुओं को व्यक्तिगत लाइनों के रूप में देखते हैं, तो जहां आप गलत हो गए हैं, वे 45 डिग्री बंद होंगे। लेकिन यदि आपकी लाइन सेगमेंट बहुत लंबी हैं, तो आप किनारों को नहीं देखते हैं। संतुलित नौकरी चुनने के लिए आपका काम है –

1

यदि आप बस ऊपर/नीचे/बाएं/दाएं में रुचि रखते हैं, तो पहला अनुमान एक सर्कल के 45 डिग्री सेगमेंट की जांच करना है। यह अंक के बीच लंबवत अंतर के खिलाफ (क्रमिक) बिंदुओं के बीच क्षैतिज अंतर की जांच करके आसानी से किया जाता है।

कहें कि आपके पास लंबवत अंतर से अधिक सकारात्मक क्षैतिज अंतर है, तो यह 'दाएं' होगा।

यूपी/दाएं/नीचे से यूपी/डाउन को अलग करने में, उदाहरण के लिए एकमात्र कठिनाई होती है। लेकिन यह अंक के बीच दूरी से किया जा सकता है। यदि आप यह निर्धारित करते हैं कि माउस 20 पिक्सेल से कम के लिए सही स्थानांतरित हो गया है, तो आप उस आंदोलन को अनदेखा कर सकते हैं।

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