यदि "सबसे तेज़" में आपके समय की राशि शामिल है जो खर्च की जाती है, तो समाधान इस बात पर निर्भर करेगा कि आप किस सॉफ्टवेयर के साथ सहज हैं और शीघ्रता से उपयोग कर सकते हैं। निम्नलिखित टिप्पणी सबसे तेजी से संभव कंप्यूटिंग समय को प्राप्त करने के लिए विचारों पर केंद्रित है ।
यदि आप एक डिब्बाबंद कार्यक्रम का उपयोग करते हैं, तो लगभग निश्चित रूप से आप जो सबसे अच्छा कर सकते हैं वह पॉलीगॉन को एक बिंदु-इन-बहुभुज डेटा संरचना, जैसे कि केडी ट्री या क्वाडट्री स्थापित करने के लिए पूर्व-प्रक्रिया है, जिसका प्रदर्शन आम तौर पर ओ (लॉग (वी) होगा ) * ((N + V)) जहां V बहुभुजों में कुल संख्याओं की संख्या है और N बिंदुओं की संख्या है, क्योंकि डेटा संरचना को बनाने में कम से कम O (लॉग (V) * V) प्रयास लगेगा और फिर होगा प्रति बिंदु लागत O (लॉग (V)) पर प्रत्येक बिंदु के लिए जांच की जानी चाहिए।
आप पहले से पॉलीगनों को ग्रिड करके, बिना किसी ओवरलैप की धारणा का फायदा उठाते हुए काफी बेहतर कर सकते हैं। प्रत्येक ग्रिड सेल या तो पूरी तरह से एक बहुभुज इंटीरियर ("सार्वभौमिक बहुभुज" के इंटीरियर सहित) है, जिस स्थिति में बहुभुज की आईडी के साथ सेल को लेबल करते हैं, या फिर इसमें एक या एक से अधिक बहुभुज किनारों होते हैं। सभी किनारों को रेखापुंज करते समय संदर्भित ग्रिड कोशिकाओं की संख्या के बराबर इस रेखांकन की लागत, O (V / c) है जहां c एक कोशिका का आकार है, लेकिन बड़े-O संकेतन में निहित स्थिरांक छोटा है।
(इस दृष्टिकोण की एक सुंदरता यह है कि आप मानक ग्राफिक्स रूटीन का शोषण कर सकते हैं। उदाहरण के लिए, यदि आपके पास एक सिस्टम है जो (ए) वर्चुअल स्क्रीन पर पॉलीगॉन का उपयोग करेगा (बी) प्रत्येक बहुभुज के लिए एक अलग रंग और (सी) की अनुमति देता है आप किसी भी पिक्सेल के रंग को पढ़ सकते हैं जिसे आप संबोधित करते हैं, आपने इसे बना लिया है।)
इस ग्रिड के साथ, प्रत्येक बिंदु (केवल कुछ घड़ियों की आवश्यकता वाले एक O (1) ऑपरेशन वाले सेल की गणना करके बिंदुओं को पूर्व-स्क्रीन करें)। जब तक अंक बहुभुज सीमाओं के आसपास नहीं होते हैं, यह आमतौर पर अस्पष्ट परिणामों के साथ केवल ओ (सी) अंक के बारे में छोड़ देगा। ग्रिड के निर्माण और प्री-स्क्रीनिंग की कुल लागत इसलिए O (V / c + 1 / c ^ 2) + O (N) है। आपको O (लॉग (V) * N * c) की कीमत पर शेष अंक (जो कि बहुभुज की सीमाओं के करीब हैं) को संसाधित करने के लिए कुछ अन्य विधि (जैसे कि अब तक सुझाई गई) का उपयोग करना होगा। ।
जैसा कि c छोटा हो जाता है, कम और कम अंक एक ही ग्रिड सेल में होगा जिसमें किनारे होंगे और इसलिए कम और कम को बाद के O (लॉग (V)) प्रसंस्करण की आवश्यकता होगी। इसके विरुद्ध कार्य करने के लिए O (1 / c ^ 2) ग्रिड कोशिकाओं को संग्रहीत करने और O (V / c + 1 / c ^ 2) समय बिताने के लिए बहुभुज को व्यवस्थित करने की आवश्यकता होती है। इसलिए एक इष्टतम ग्रिड आकार होगा सी। यह का उपयोग करना, कुल कम्प्यूटेशनल लागत हे (लॉग (वी) * एन) है, लेकिन अंतर्निहित निरंतर आम तौर पर है जिस तरह से , डिब्बाबंद प्रक्रियाओं का उपयोग पूर्व स्क्रीनिंग के हे (एन) की गति के कारण से छोटा है।
20 साल पहले मैंने इस दृष्टिकोण का परीक्षण किया (पूरे इंग्लैंड और अपतटीय में समान रूप से स्थान बिंदुओं का उपयोग करके और उस समय के वीडियो बफ़र्स द्वारा पेश किए गए लगभग 400K कोशिकाओं के अपेक्षाकृत कच्चे ग्रिड का दोहन) और सर्वोत्तम प्रकाशित एल्गोरिथम की तुलना में परिमाण गति के दो आदेश प्राप्त किए। पाते हैं। यहां तक कि जब बहुभुज छोटे और सरल होते हैं (जैसे त्रिकोण), तो आपको वास्तव में परिमाण गति के एक आदेश का आश्वासन दिया जाता है।
मेरे अनुभव में अभिकलन इतना तेज था कि पूरा संचालन डेटा I / O गति द्वारा सीमित था, सीपीयू द्वारा नहीं। यह अनुमान लगाते हुए कि मैं / ओ अड़चन हो सकता है, आप डेटा पढ़ने के समय को कम से कम करने के लिए संभव के रूप में एक प्रारूप को संपीड़ित करके बिंदुओं को संग्रहीत करके बहुत तेज़ परिणाम प्राप्त करेंगे। यह भी कुछ सोचें कि परिणाम कैसे संग्रहीत किए जाने चाहिए, ताकि आप डिस्क लेखन को सीमित कर सकें।