2013-05-16 5 views
8

मैं एक छवि है से भी कम में एन (संभवतः अतिव्यापी) आयतों में से एक के अंदर है, और मैं टूलटिप्स दिखाना चाहते हैं जब कुछ आयताकार क्षेत्रों पर माउस ले जाता है। आयताकार क्षेत्र 1000 तक हो सकते हैं। हालांकि, यदि बिंदु उसमें है, तो प्रत्येक आयताकार को जांचना, जो ओ (एन) है, माउस को घुमाने पर इंटरफ़ेस को उत्तरदायी बनाता है।पता करें कि क्या बात हे (एन)

वहाँ भी कम समय में यह करने के लिए हे (एन) की तुलना में एक तरीका है? मैं आयत को पहले से सॉर्ट कर सकता हूं (मुझे लगता है कि इसकी आवश्यकता होगी)। आयताकार (बहुत ही कम) ओवरलैपिंग हो सकते हैं, लेकिन 4-5 से अधिक आयताकार एक ही क्षेत्र को ओवरलैप नहीं कर सकते हैं। उस स्थिति में मुझे सभी आयतों की एक सूची प्राप्त करने की आवश्यकता हो सकती है, लेकिन उनमें से कोई भी अभी भी पर्याप्त होगा।

लेकिन मैं यह सोचते कर रहा हूँ कि इस समस्या को पहले से ही खिड़की प्रबंधकों द्वारा हल किया गया है, आदि

+0

आपको 2-डी पेड़ की आवश्यकता है। –

+1

हालांकि यह एक * एल्गोरिदम * प्रश्न है, इंटरफ़ेस/संदर्भ शामिल होने से बेहतर सुझाव प्रदान करने में सहायता मिल सकती है - उदा। एक वेब पेज/जावास्क्रिप्ट पर्यावरण समाधान सी ++ ड्राइंग एप्लिकेशन की तुलना में अलग होगा –

+0

@ ring0 पर्याप्त मेला, मैं सी ++ और क्यूटी का उपयोग कर रहा हूं, और मैं एक ओसीआर के आउटपुट को विज़ुअलाइज़ कर रहा हूं, जो बक्से + मान्यता प्राप्त प्रतीक + अन्य है डेटा। – sashoalm

उत्तर

7

ऐसा लगता है कि आप एक R-Tree के भीतर अपनी आयतों भंडारण किया जाना है और फिर उस क्वेरी करने चाहते हैं।

चेक बाहर उनके STRtree कक्षाएं: वहाँ उपलब्ध कुछ कार्यान्वयन हैं।

1

ऐसे the quad-tree के रूप में एक स्थानिक खोज डेटा संरचना का उपयोग करें।

आप पहले से पेड़ को अपने आयतों जोड़ने की आवश्यकता होगी, लेकिन औसत खोज तेज किया जाएगा। सबसे बुरे मामले में आप अभी भी ओ (एन) हो सकता है।

+0

कोई भी लिंक जो एक ट्रैक्टर पेड़ के बारे में दिलचस्प और दृश्य जानकारी प्रदान करता है और यह इस प्रश्न/संदर्भ में कैसे मदद करता है? –

+0

@ ring0: सामान्य संदिग्ध, विकिपीडिया। –

+0

धन्यवाद। कुछ लोगों में उनके समाधान में लिंक शामिल होते हैं जो आलसी अन्य लोगों (जैसे मेरे) को खोज के बजाय बस क्लिक करने की अनुमति देते हैं। –

2

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

+0

यह एक अच्छा समाधान है :) दरअसल, मैंने समस्या का सामना करने के तुरंत बाद ऐसा किया है, लेकिन यह एक समाधान की तुलना में एक कामकाज की तरह लगता है, इसलिए मैं जानना चाहता था कि क्या एक और अधिक सुरुचिपूर्ण समाधान है। – sashoalm

1

की आयत की खोज गति है यदि आयताकार अक्ष-संरेखित हैं, तो आप विशेष डेटा संरचनाओं से बच सकते हैं।

पहले एक आयाम में स्थान को उप-विभाजित करें, उदा। क्षैतिज स्ट्रिप्स में क्षैतिज स्क्रीन को उप-विभाजित करना। प्रत्येक आयताकार कई स्ट्रिप्स में हो सकता है। फिर आप उस स्ट्रिप को ओवरलैप करने वाले आयतों के आधार पर प्रत्येक स्ट्रिप को उप-विभाजित करते हैं। खोज में दो ओ (लॉग एन) बाइनरी खोज या बाइनरी पेड़ शामिल हैं - एक स्ट्रिप की पहचान करने के लिए, एक आयत की पहचान करने के लिए।

यह एक मान्यता प्राप्त स्थानिक डेटा संरचना है, लेकिन मेरे लिए यह वास्तव में गिनती नहीं है - यह केवल सामान्य बाइनरी पेड़ का उपयोग कर रहा है। आप इसे std::map<int, std::map<int, int>> के साथ भी कर सकते हैं।

लेकिन वास्तव में ओ (1) खोजों का समर्थन करने वाला एक विकल्प है, जिसे "पिक्सेल पिकिंग" कहा जाता है। असल में, एक आय-स्क्रीन बिटमैप में आयतों को खींचें, प्रत्येक आयताकार को एक अलग रंग में, और सामने के आयताकार आखिरी आयत (पेंटर्स एल्गोरिदम) के रूप में अंतिम होते हैं। आप आसानी से उस पिक्सेल को पढ़कर किसी भी बिंदु पर कौन सा आयताकार सबसे आगे की पहचान कर सकते हैं।

अतिरिक्त बोनस - आपका ग्राफिक्स कार्ड आयताकारों को चित्रित करने में भी तेजी ला सकता है, इसलिए आपको आयताकारों के सेट में परिवर्तन करने के बारे में बहुत अधिक चिंता करने की आवश्यकता नहीं है (जो स्पष्ट रूप से उस ओ (1) में शामिल नहीं है)। यह स्मृति में थोड़ा महंगा है, लेकिन एक आधुनिक मशीन पर, आप इसकी परवाह नहीं कर सकते हैं।

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