बहुभुज के लिए बहुभुज एल्गोरिथ्म में बिंदु


11

मेरे पास उस पर बहुभुजों के गुच्छा के साथ एक Google मानचित्र है।

यहाँ एक समस्या है जिसमें मुझे दिलचस्पी है: एक अव्यक्त, lng बिंदु को देखते हुए, सभी बहुभुजों को निर्धारित करने का सबसे अच्छा तरीका क्या है जिसमें यह बिंदु निहित है?

स्पष्ट तरीका प्रत्येक बहुभुज के लिए चलने वाले एल्गोरिदम में "बहुभुज में एक बिंदु" एल्गोरिदम को चलाना है, लेकिन मैं सोच रहा था कि क्या ऐसे प्रश्नों का उत्तर देने के लिए एक कुशल एल्गोरिदम है, खासकर यदि आपके पास हजारों बहुभुज हैं।


मुझे Google मानचित्र API के बारे में अधिक जानकारी नहीं है, लेकिन ब्राउज़र इस तरह के बड़े प्रश्नों को करने के लिए सबसे अच्छी जगह नहीं है। PostGIS (मुक्त), आर्चर या Oracle स्थानिक इस तरह के अनुरोधों को बेहतर तरीके से संभालते हैं।
बजे canisrufus

मुझे एल्गोरिथ्म में कुछ और से ज्यादा दिलचस्पी है। BTW, आप PostGIS में यह कैसे करेंगे।
अंकन

निम्न url बहुभुज में बिंदु के बारे में बोलता है .. (मैंने इसका उपयोग कभी नहीं किया है) .. एक कोशिश दे .. यह कुछ विचार दे सकता है। eriestuff.blogspot.com/2008/02/…

3
यहां मेरी अनिवार्य टिप्पणी है कि "बिंदु-इन-बहुभुज" एक गोले पर एक बिंदु के लिए कोई मतलब नहीं है, क्योंकि एक क्षेत्र पर एक बहुभुज सिर्फ गोले को दो भागों में विभाजित करता है, जिनमें से किसी को भी 'अंदर' कहने का अधिकार है। क्या भूमध्य रेखा को परिभाषित करने वाले बहुभुज के अंदर उत्तरी या दक्षिणी ध्रुव है? याद रखें, लैट-लॉन्ग कार्टेशियन नहीं है ...
Spacedman

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

जवाबों:


12

लगभग ऐसे सभी सवालों के साथ, इष्टतम दृष्टिकोण "उपयोग के मामलों" पर निर्भर करता है और सुविधाओं का प्रतिनिधित्व कैसे किया जाता है। उपयोग के मामलों को आम तौर पर (क) द्वारा परिभाषित किया जाता है कि क्या प्रत्येक परत में कई या कुछ वस्तुएं हैं और (ख) या तो (या दोनों) परतें कुछ डेटा संरचनाओं को प्रीकोम्प्यूट करने की अनुमति देती हैं; वह यह है कि, प्री-कॉम्पटिशन में निवेश करने के लिए उनमें से एक या दोनों पर्याप्त रूप से स्थिर और अपरिवर्तनीय हैं।

वर्तमान मामले में, यह निम्नलिखित परिदृश्यों को जन्म देता है। आम तौर पर अंक गतिशील होते हैं: अर्थात, उन्हें पहले से नहीं दिया जाता है। (यदि वे पहले से उपलब्ध हैं, या बहुत बड़े समूहों में हैं, तो उन्हें छांटने के आधार पर कुछ अनुकूलन उपलब्ध होंगे।) Q प्रश्न क्वेरी पॉइंट की संख्या हो और P बहुभुज कोने की संख्या हो

वेक्टर बहुभुज डेटा

(1) कुछ बिंदु, टोट में कुछ बहुभुज कोने । ब्रूट-बल प्रक्रिया का उपयोग करें, जैसे कि क्लासिक लाइन-स्टैबिंग एल्गोरिथ्म । किसी भी सभ्य विधि के लिए, लागत O (P * Q) है, क्योंकि एक बहुभुज किनारे पर एक बिंदु की तुलना करने के लिए O (1) समय खर्च होता है और ऐसी सभी तुलनाएं करनी पड़ती हैं।

(2) संभवतः कई बहुभुज लंबवत हैं, लेकिन वे गतिशील हैं: प्रत्येक बार जब एक बिंदु का उपयोग क्वेरी में किया जाता है, तो बहुभुज सभी बदल सकते हैं। फिर से एक जानवर बल एल्गोरिथ्म का उपयोग करें। लागत अभी भी O (P * Q) है, जो बड़ी होगी क्योंकि P बड़ी होगी, लेकिन इसमें कोई मदद नहीं है। यदि परिवर्तन छोटे या नियंत्रित होते हैं ( उदाहरण के लिए , पॉलीगॉन थोड़ा बदलते आकार या बस धीरे-धीरे घूम रहे हैं) तो आप अगले समाधान के एक संस्करण का उपयोग करने में सक्षम हो सकते हैं और पॉलीगॉन बदलते ही डेटा संरचनाओं को अपडेट करने का एक कुशल तरीका खोज सकते हैं। यह मूल शोध के लिए एक मामला होगा।

(3) कई बहुभुज कोने और स्थिर बहुभुज (अर्थात, बहुभुज परत शायद ही कभी बदलेगी)। खोज का समर्थन करने के लिए एक डेटा संरचना को रोकें (जो एक लाइन स्वीप या एक क्वाडट्री एल्गोरिदम पर आधारित हो सकती है)। इन एल्गोरिदम के लिए प्रीकंप्यूटेशन की लागत O (P * log (P)) है, लेकिन प्रश्नों की लागत O (Q * log (P)) बन जाती है, इसलिए कुल लागत O ((P + Q) * log (A) है पी))।

कुछ सुधार विशेष मामलों में उपलब्ध हैं , जैसे कि

(ए) सभी पॉलीगॉन उत्तल हैं ( पॉलीगोन को प्रीप्रोसेस करना अधिक तेज़ी से किया जा सकता है ),

(b) सभी बहुभुज अंदरूनी आपस में जुड़े हुए हैं , जिस स्थिति में आप उनके संघ को एक एकल बहुभुज होने के रूप में सोच सकते हैं (जो सीधे-सीधे कुशल एल्गोरिदम की अनुमति देता है, जैसे कि त्रिभुज के आधार पर, और

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

(d) अंकों की संख्या बड़ी है। उन्हें क्रमबद्ध करने से समय में सुधार हो सकता है। उदाहरण के लिए, जब बाएँ-से-दाएँ लाइन स्वीप पॉइंट-इन-बहुभुज एल्गोरिथ्म को लागू करते हैं, तो आप उनके पहले समन्वय पर अंक को सॉर्ट करेंगे, जिससे आप पॉलीगॉन किनारों पर स्वीप करने के साथ-साथ पॉइंट्स पर भी स्वीप कर सकेंगे। मुझे पता नहीं है कि इस तरह का अनुकूलन प्रकाशित किया गया है। एक, जो प्रकाशित किया गया है, हालांकि, सभी बिंदुओं और बहुभुज कोने के संघ के एक विवश त्रिभुज को निष्पादित करना है : एक बार जब त्रिभुज पूरा हो जाता है, तो आंतरिक बिंदुओं की पहचान जल्दी होनी चाहिए। कम्प्यूटेशनल लागत ओ (क्यू * लॉग (क्यू) + (पी + क्यू) * लॉग (पी + क्यू)) के रूप में पैमाने पर होगी।

रेखापुंज बहुभुज डेटा

यह अविश्वसनीय रूप से आसान है: बहुभुज परत को एक द्विआधारी संकेतक रेखापुंज के रूप में देखें (1 = बहुभुज के अंदर, 0 = बाहर)। (यह रैस्टर मानों को अंदर / बाहर के संकेतक में बदलने के लिए लुकअप टेबल की आवश्यकता हो सकती है।) प्रत्येक बिंदु की जांच के लिए अब रास्टर सेल को इंडेक्स करने के लिए O (1) प्रयास की आवश्यकता है और इसके मूल्य को पढ़ें। कुल प्रयास हे (क्यू) है।

सामान्य रूप में

एक अच्छा संकर समाधानकई स्टैटिक वेक्टर पॉलीगन्स (वेक्टर केस 3 ऊपर) के मामले में शुरू में पॉलीगन्स को रोकना है, शायद एक मोटे रिज़ॉल्यूशन के साथ भी, इस बार किसी भी सेल को बहुभुज सीमा के किसी भी हिस्से को भेदते हुए (उन्हें 2 का मान दें, कहें) । रेखापुंज जांच (लागत: O (1)) का उपयोग आमतौर पर एक निश्चित उत्तर में होता है (बिंदु अंदर या बाहर जाना जाता है), लेकिन कभी-कभी एक अनिश्चित उत्तर में परिणाम होता है (बिंदु एक सेल में गिरता है जिसके माध्यम से कम से कम एक किनारे होता है पास), जिस स्थिति में अधिक महंगी O (लॉग (P)) वेक्टर क्वेरी बनी है। यह विधि रास्टर के लिए कुछ अतिरिक्त भंडारण लागत लगाती है, लेकिन कई मामलों में यहां तक ​​कि एक छोटे से रेखापुंज (एक एमबी 2000 तक 2000 के लिए अनुमति देगा रैस्टर जो {0,1,2, null} मानों को संग्रहीत करता है) कम्प्यूटेशनल समय में भारी लाभ प्रदान कर सकता है । asymptotically,


7

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


1

PostGIS में ST_Intersects पहले खोज करने के लिए उपयोग करता है अनुक्रमित बिंदु बहुभुज के सीमांकन बॉक्स के अंदर है और फिर अगर यह वास्तव में बहुभुज के अंदर है देखने के लिए एक की पुनः जांच करता है तो। यह तेज है, अक्सर बहुत तेज है।

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

/ Nicklas

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.