2009-01-05 10 views
13

शुरुआत से, टकराव का पता लगाना लगता है कि यह एक ओ (एन^2) समस्या है।2 डी टकराव जांच को छूने के लिए किस तकनीक का उपयोग किया जाना चाहिए?

आपके पास ऑब्जेक्ट्स का एक समूह है और आपको यह जांचने की आवश्यकता है कि प्रत्येक ऑब्जेक्ट किसी अन्य ऑब्जेक्ट के साथ टकरा रहा है या नहीं। हालांकि, मुझे पता है कि यह सभी ऑब्जेक्ट्स के खिलाफ प्रत्येक वस्तु को जांचने के लिए जंगली रूप से अक्षम है। दो गेंदों के बीच तुलनात्मक रूप से महंगा टकराव की जांच क्यों करें यदि वे एक-दूसरे के करीब न हों?

यहाँ मेरी साधारण प्रोग्राम का उदाहरण मैं पर काम कर रहा हूँ है:

alt text

आप फिर उसे 1000 गेंदों है, तो अगर आप अनुभवहीन टक्कर पता लगाने के साथ चला गया आप 1000^2 संग्रह चेकों के लिए होता है (एक मिलियन)! यह टक्कर जांच जल्दी से मेरे आवेदन में बाधा बन गई है। कुछ व्यापक चरण छंटनी को लागू करने के लिए I की आवश्यकता है।

2 डी-सर्कुलर ऑब्जेक्ट्स के साथ काम करते समय टक्कर जांच को रोकने के लिए किन तकनीकों का उपयोग किया जाना चाहिए? मैंने क्वाड्रिस, बीएसपी, स्थानिक हैशिंग, आदि के बारे में पढ़ा है, लेकिन यह पता लगाना मुश्किल है कि इस विधि के मामले में कौन सी विधि सबसे उपयुक्त है।

क्या किसी को भी कोई जानकारी है कि सबसे अच्छा क्या काम कर सकता है?

उत्तर

6

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

आप इष्टतम खोजने के लिए ग्रिड आकार के साथ प्रयोग कर सकते हैं। आप पाते हैं कि यह आपके कितने गेंदों पर निर्भर करता है।

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

+0

मेरे उत्तर में संबंधित प्रश्न जोड़े गए और यह आपके उत्तर से प्रश्न को विचलित कर दिया गया क्योंकि यह विचलित हो गया था। – mmcdole

+0

अच्छी तरह से किया गया, @ सिमुकाल। –

2

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

+0

उपरोक्त छवि को देखते हुए, क्या आप कहेंगे कि असमान पर्याप्त एकाग्रता का गठन होता है? अक्सर गेंदें नीचे की ओर गेंदों के साथ बहुत बड़ी होती हैं। क्या आप अभी भी बीएसपी पर ग्रिड सुझाएंगे? – mmcdole

+0

एक बीएसपी एक अनियमित ग्रिड है, और मैं एक नियमित शतरंज की तरह ग्रिड का सुझाव दे रहा हूं। अंतर एक शतरंज की तरह ग्रिड को बीएसपी की तुलना में कार्यान्वित करना और डीबग करना आसान है, और पेशेवर गेम के लिए भी उपयुक्त है।यदि प्रदर्शन एक समस्या है, या व्यक्तिगत चुनौती –

+0

के रूप में आप अपने ग्रिड को बीएसपी में ले जा सकते हैं, तो आपके मामले में एकाग्रता वास्तव में असमान है, नीचे आपके पास बहुत सारी गेंदें हैं और शीर्ष कम गेंदें हैं। तो आप नीचे की तरफ एक बेहतर ग्रिड आकार का उपयोग कर सकते हैं, जो विशेषज्ञ ज्ञान का एक अनुप्रयोग है, क्योंकि आप जानते हैं कि क्या उम्मीद करनी है, और यह पूल टेबल की तरह वास्तव में सामान्य स्थिति नहीं है। –

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