क्वाडट्री: केवल अंक या क्षेत्रों को स्टोर करें?


9

मैं टक्कर का पता लगाने के लिए चलती वस्तुओं का ट्रैक रखने के लिए एक क्वाडट्री विकसित कर रहा हूं। प्रत्येक ऑब्जेक्ट का एक बाउंडिंग आकार होता है, मान लें कि वे सभी सर्कल हैं। (यह 2 डी टॉप-डाउन गेम है)

मैं अनिश्चित हूं कि क्या केवल प्रत्येक वस्तु की स्थिति, या पूरे बाउंडिंग आकार को संग्रहीत करना है।

यदि बिंदुओं के साथ काम करना, सम्मिलन और उपखंड करना आसान है, क्योंकि ऑब्जेक्ट कभी भी कई नोड्स नहीं फैलाएंगे। दूसरी ओर, किसी ऑब्जेक्ट के लिए निकटता क्वेरी टकराव को याद कर सकती है, क्योंकि यह ऑब्जेक्ट के आयामों को ध्यान में नहीं रखेगा। जब आपके पास केवल अंक हों, तो क्वेरी क्षेत्र की गणना कैसे करें?

पड़ोसी नोड्स से वस्तुओं के बीच टकराव

यदि क्षेत्रों के साथ काम करते हैं, तो एक ऑब्जेक्ट को कैसे संभालना है जो कई नोड्स को फैलाता है? क्या इसे निकटतम माता-पिता के नोड में डाला जाना चाहिए, जिसमें पूरी तरह से यह शामिल है, भले ही यह नोड की क्षमता से अधिक हो?

किस नोड में लाल वस्तु होनी चाहिए?

धन्यवाद।

जवाबों:


4

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

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

इसी तरह, एक क्षेत्र को क्वेरी करने के लिए, क्वेरी को सभी लीफ नोड्स को देखना चाहिए जो क्वेराइड क्षेत्र को छूता है।

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


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

4

आपको इसे सबसे छोटे नोड में संग्रहित करना चाहिए, जिसमें पूरी तरह से इसे शामिल किया गया हो- भले ही यह क्षमता से अधिक हो (उपयोग करने योग्य कंटेनर का उपयोग करें)।


2

मैं इसे @ नथन रीड के जवाब के जवाब में एक टिप्पणी के रूप में जोड़ूंगा, सिवाय इसके कि यह टिप्पणी होना बहुत बड़ी बात है, और शायद किसी भी मामले में एक अलग जवाब के योग्य है।

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

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

हमारे पास एक किनारे का मामला था जहां लगभग 100 ऑब्जेक्ट, सभी बाउंडिंग डिस्क के साथ, बहुत निकटता में क्लस्टर किए गए थे। इससे पेड़ में एक बहुत गहरी कील की समस्या पैदा हो गई, क्योंकि हम उस बिंदु पर पहुंच गए जहां वस्तुएं क्वाडट्री नोड्स द्वारा कवर किए गए क्षेत्र से बड़ी थीं, इसलिए प्रत्येक नई वस्तु को कई नोड्स में दिखाई दे रहा था, जिससे बड़े पैमाने पर उपखंड हो रहा था वृक्ष, इस प्रकार समस्या को नियंत्रण से बाहर कर रहे हैं।

इस से takeaway यह है कि यदि आप ऑब्जेक्ट क्षेत्रों को ओवरलैप करने की अनुमति देते हैं, तो चीजों पर कड़ी नज़र रखें यदि आपको ऑब्जेक्ट्स के तंग क्लस्टर मिलते हैं, तो यह सुनिश्चित करने के लिए कि आपका पेड़ बहुत गहरा नहीं है।

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

आपका वास्तविक लाभ भिन्न हो सकता है।

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