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