यह मानते हुए कि आपके स्प्राइट्स टाइलों के आयताकार सेट हैं जो आयताकार हैं (यदि वे मनमाना सेटों पर कब्जा करते हैं, तो आप सामान्य मामले में बिल्कुल भी सही ढंग से आकर्षित नहीं कर सकते हैं), समस्या यह है कि तत्वों के बीच कुल क्रम संबंध नहीं है, इसलिए आप सॉर्ट कर सकते हैं एक तरह का उपयोग करके उन्हें ओ (नॉग्लन) की तुलना में परिणाम होगा।
ध्यान दें कि किसी भी दो वस्तुओं ए और बी के लिए, ए को बी (ए <- बी) से पहले खींचा जाना चाहिए, बी को ए (बी <- ए) से पहले खींचा जाना चाहिए या उन्हें किसी भी क्रम में खींचा जा सकता है। वे एक आंशिक क्रम बनाते हैं। यदि आप 3 अतिव्यापी वस्तुओं के साथ अपने आप को कुछ उदाहरण देते हैं, तो आप देख सकते हैं कि भले ही 1 और 3 ऑब्जेक्ट ऑब्जेक्ट ओवरलैप न हों, इस प्रकार प्रत्यक्ष निर्भरता नहीं होने पर, उनका ड्राइंग ऑर्डर उनके बीच के 2 ऑब्जेक्ट पर निर्भर करता है - कैसे आप इसे रखते हैं, आप अलग-अलग ड्राइंग ऑर्डर प्राप्त करेंगे। निचला रेखा - पारंपरिक प्रकार यहां काम नहीं करते हैं।
एक उपाय यह है कि तुलना (दानी द्वारा उल्लिखित) का उपयोग किया जाए और प्रत्येक वस्तु की एक-दूसरे से तुलना करके उनकी निर्भरता का निर्धारण किया जाए और एक निर्भरता ग्राफ बनाया जाए (जो कि DAG होगा)। फिर ड्राइंग ऑर्डर निर्धारित करने के लिए ग्राफ पर एक टोपोलॉजिकल सॉर्ट करें। यदि बहुत अधिक वस्तुएँ नहीं हैं, तो यह काफी तेज़ हो सकता है (यह O(n^2)
)।
एक और उपाय है कि (शेष - छद्म के लिए ) क्वाड ट्री का उपयोग किया जाए और इसमें सभी वस्तुओं के आयतों को संग्रहीत किया जाए।
फिर सभी ऑब्जेक्ट्स X के माध्यम से पुनरावृत्ति करें, और यह जांचने के लिए कि क्या कोई ऑब्जेक्ट में ऑब्जेक्ट X के ऊपर पट्टी में कोई ऑब्जेक्ट Y हैं, जो सबसे बाईं ओर से शुरू होता है और ऑब्जेक्ट X के सबसे दाएं कोने से समाप्त होता है - ऐसे सभी Y, Y के लिए। - X. इस तरह, आपको अभी भी एक ग्राफ़ बनाना होगा और स्थाई रूप से सॉर्ट करना होगा।
लेकिन आप इससे बच सकते हैं। आप वस्तुओं की एक सूची Q का उपयोग करते हैं, और वस्तुओं की एक तालिका T. आप x- अक्ष (एक पंक्ति) पर छोटे से लेकर बड़े मानों तक सभी दृश्यमान स्लॉट्स को पुन: क्रमबद्ध करते हैं, जो कि y- अक्ष पर पंक्ति से पंक्ति में चलते हैं। यदि उस स्लॉट में किसी ऑब्जेक्ट का निचला कोना है, तो निर्भरता निर्धारित करने के लिए ऊपर की प्रक्रिया करें। यदि कोई वस्तु X किसी अन्य वस्तु Y पर निर्भर करती है जो आंशिक रूप से उसके ऊपर है (Y <- X), और ऐसा प्रत्येक Y पहले से ही Q में है, तो X को Q में जोड़ें। यदि कुछ Y है जो Q में नहीं है, तो X को जोड़ें T और निरूपित करें कि Y <- X. हर बार जब आप Q में कोई ऑब्जेक्ट जोड़ते हैं, तो आप T में लंबित वस्तुओं की निर्भरता को हटा देते हैं। यदि सभी निर्भरताएं हटा दी जाती हैं, तो T से किसी ऑब्जेक्ट को Q में स्थानांतरित कर दिया जाता है।
हम मान रहे हैं कि वस्तु स्प्राइट्स नीचे, बाएं या दाएं (केवल आपकी तस्वीर के पेड़ों की तरह) शीर्ष पर अपने स्लॉट्स से बाहर नहीं झांक रही है। इससे बड़ी संख्या में ऑब्जेक्ट के लिए प्रदर्शन में सुधार होना चाहिए। यह दृष्टिकोण फिर से होगा O(n^2)
, लेकिन केवल सबसे खराब स्थिति में जिसमें अजीब आकार की वस्तुएं और / या वस्तुओं के अजीब विन्यास शामिल हैं। ज्यादातर मामलों में, यह है O(n * logn * sqrt(n))
। अपने स्प्राइट्स की ऊँचाई को जानकर sqrt(n)
आप इसे समाप्त कर सकते हैं , क्योंकि आपको ऊपर की पूरी पट्टी की जाँच करने की आवश्यकता नहीं है। स्क्रीन पर ऑब्जेक्ट्स की संख्या के आधार पर, आप एक ट्री के साथ क्वाड ट्री को बदलने की कोशिश कर सकते हैं, जिसमें यह संकेत मिलता है कि कौन से स्लॉट लिए गए हैं (अगर कई ऑब्जेक्ट हैं तो समझ में आता है)।
अंत में, कुछ विचारों के लिए इस स्रोत कोड का निरीक्षण करने के लिए स्वतंत्र महसूस करें: https://github.com/axel22/sages/blob/master/src/gui/scala/name/brijest/sages/gui/Canvas.scala