नहीं। टकराव का पता लगाना हमेशा O (N ^ 2) नहीं होता है।
उदाहरण के लिए, मान लें कि हमारे पास 100x100 की जगह है जिसमें आकार 10x10 है। हम एक ग्रिड के साथ इस जगह को 10x10 की कोशिकाओं में विभाजित कर सकते हैं।
प्रत्येक वस्तु 4 ग्रिड कोशिकाओं तक हो सकती है (यह एक ब्लॉक में सही बैठ सकती है या "कोशिकाओं के बीच" हो सकती है)। हम प्रत्येक सेल में वस्तुओं की एक सूची रख सकते हैं।
हमें केवल उन कोशिकाओं में टकराव की जाँच करने की आवश्यकता है। यदि प्रति ग्रिड सेल में वस्तुओं की अधिकतम संख्या है (कहते हैं, एक ही ब्लॉक में 4 से अधिक ऑब्जेक्ट्स कभी नहीं होते हैं), तो प्रत्येक ऑब्जेक्ट के लिए टकराव का पता लगाना ओ (1) है और सभी वस्तुओं के लिए टकराव का पता लगाना ओ (एन) है।
यह ओ (एन ^ 2) जटिलता से बचने का एकमात्र तरीका नहीं है। अन्य तरीके हैं, अन्य उपयोग-मामलों के लिए अधिक पर्याप्त हैं - अक्सर पेड़-आधारित डेटा संरचनाओं का उपयोग करना।
मैंने जो एल्गोरिथ्म का वर्णन किया है, वह एक प्रकार का Space विभाजन है , लेकिन अन्य अंतरिक्ष विभाजन एल्गोरिदम हैं। कुछ और एल्गोरिदम के लिए अंतरिक्ष विभाजन डेटा संरचनाओं के प्रकार देखें, जो O (N ^ 2) अस्थायी जटिलता से बचते हैं।
बॉक्स 2 डी और बुलेट दोनों चेक किए गए जोड़ों की संख्या को कम करने के लिए तंत्र का समर्थन करते हैं।
से मैनुअल , खंड 4.15:
एक भौतिकी कदम में टकराव की प्रक्रिया को संकीर्ण-चरण और व्यापक-चरण में विभाजित किया जा सकता है। संकीर्ण-चरण में हम आकृतियों के जोड़ों के बीच संपर्क बिंदुओं की गणना करते हैं। कल्पना कीजिए कि हमारे पास एन आकार हैं। जानवर बल का उपयोग करते हुए, हमें एन * एन / 2 जोड़े के लिए संकीर्ण-चरण प्रदर्शन करना होगा।
B2BroadPhase वर्ग जोड़ी प्रबंधन के लिए एक गतिशील पेड़ का उपयोग करके इस भार को कम करता है। यह संकीर्ण-चरण कॉल की संख्या को बहुत कम करता है।
आम तौर पर आप सीधे व्यापक-चरण के साथ बातचीत नहीं करते हैं। इसके बजाय, Box2D आंतरिक रूप से एक व्यापक चरण का निर्माण और प्रबंधन करता है। इसके अलावा, b2BroadPhase को Box2D के सिमुलेशन लूप को ध्यान में रखकर बनाया गया है, इसलिए यह अन्य उपयोग के मामलों के लिए अनुकूल नहीं है।
से गोली विकी :
विभिन्न प्रकार के ब्रॉडफेज एल्गोरिदम हैं जो भोले ओ (एन ^ 2) एल्गोरिथ्म में सुधार करते हैं जो सिर्फ जोड़े की पूरी सूची लौटाते हैं। ये अनुकूलित ब्रॉडफेज कभी-कभी और अधिक गैर-टकराव वाले जोड़े भी पेश करते हैं लेकिन यह आम तौर पर बेहतर निष्पादन समय से ऑफसेट होता है। उनके पास अलग-अलग प्रदर्शन विशेषताएं हैं और सभी स्थितियों में कोई भी दूसरों से बेहतर प्रदर्शन नहीं करता है।
गतिशील AABB ट्री
यह btDbvtBroadphase द्वारा बुलेट में लागू किया गया है।
जैसा कि नाम से पता चलता है, यह एक गतिशील AABB पेड़ है । इस प्रसारक की एक उपयोगी विशेषता यह है कि यह संरचना दुनिया के आयामों और इसकी सामग्री के लिए गतिशील रूप से अनुकूल है। यह बहुत अच्छी तरह से अनुकूलित है और एक बहुत अच्छा सामान्य उद्देश्य है। यह गतिशील दुनिया को संभालता है जहां कई वस्तुएं गति में हैं, और ऑब्जेक्ट जोड़ और निकालना एसएपी से तेज है।
स्वीप और प्रून (SAP)
बुलेट में, यह कक्षाओं की एक्सिसस्वीप श्रेणी है। यह भी एक अच्छा सामान्य उद्देश्य ब्रॉडपेज़ है, एक सीमा के साथ कि इसे एक निश्चित विश्व आकार की आवश्यकता होती है, जिसे पहले से जाना जाता है। इस ब्रॉडपेज़ में विशिष्ट डायनामिक्स दुनिया के लिए सबसे अच्छा प्रदर्शन है, जहां अधिकांश वस्तुओं में बहुत कम या कोई गति नहीं है। दोनों btAxisSweep3 और bt32AxisSweep3 प्रदर्शन में सुधार करने के लिए फ्लोटिंग पॉइंट नंबरों के बजाय पूर्णांक के रूप में प्रत्येक अक्ष के लिए आरंभ और अंत बिंदुओं को निर्धारित करते हैं।
निम्नलिखित लिंक ब्रॉडपेज़ के लिए एक सामान्य परिचय है और स्वीप और प्रून एल्गोरिथ्म का वर्णन भी है (हालांकि इसे "सॉर्ट और स्वीप" कहते हैं):
http://www.ziggyware.com/readarticle.php?article_id=128
इसके अलावा, विकिपीडिया पृष्ठ पर एक नज़र डालें:
http://en.wikipedia.org/wiki/Sweep_and_prune