मैं ऐसे गेम पर काम कर रहा हूं जहां स्थान पर वास्तव में एक ऑब्जेक्ट मौजूद हो सकता है (x, y)
जहां x
और y
ints
हैं। उदाहरण के लिए, (0, 0)
पर कोई ऑब्जेक्ट मौजूद हो सकता है या ऐसा नहीं हो सकता है, लेकिन एक साथ कई ऑब्जेक्ट मौजूद होने के लिए यह संभव नहीं है।आस-पास की ऑब्जेक्ट्स एल्गोरिदम
मैं यह तय करने की कोशिश कर रहा हूं कि कौन सी एसटीएल कंटेनर समस्या के लिए उपयोग करने के लिए और इस समस्या को हल करने का सबसे अच्छा तरीका है।
असल में, मैं किसी ऑब्जेक्ट और उसके (x, y)
स्थान से शुरू करता हूं। लक्ष्य सबसे लंबा निर्धारित करना है, उस वस्तु के आस-पास की वस्तुओं के आधार पर सबसे बड़ा संभव आयताकार। आयत वर्तमान वस्तु के ऊपर और नीचे सभी वस्तुओं का उपयोग करके बनाया जाना चाहिए। यही है, यह सबसे लंबा होना चाहिए कि यह संभवतः प्रारंभिक ऑब्जेक्ट स्थिति पर आधारित हो सकता है।
उदाहरण के लिए, निम्नलिखित मेरी वस्तु ग्रिड का प्रतिनिधित्व करता है और मैं स्थान (3, 4)
पर हरे रंग वस्तु के साथ शुरू कर रहा हूँ:
फिर, आयत मैं देख रहा हूँ गुलाबी वर्गों के प्रतिनिधित्व की जाएगी नीचे:
तो,, मैं (3, 4)
पर वस्तु के साथ शुरू संभालने उदाहरण की तरह चलता रहा होगा यह जांचने की आवश्यकता है कि क्या वस्तुओं (2, 4)
, (4, 4)
, (3, 3)
, और (3, 5)
पर मौजूद हैं या नहीं। यदि किसी भी स्थान पर कोई ऑब्जेक्ट मौजूद है, तो मुझे ऑब्जेक्ट के लिए सबसे बड़ा संभव आयताकार खोजने की प्रक्रिया को दोहराना होगा।
ये वस्तुएं दुर्लभ हैं और गेम की दुनिया भारी है। यह पूरी दुनिया की दुनिया के लिए केवल new
2 डी सरणी के लिए व्यावहारिक प्रतीत नहीं होता है क्योंकि अधिकांश तत्व खाली होंगे। हालांकि, मुझे किसी भी स्थिति में किसी ऑब्जेक्ट की जांच करने के लिए किसी भी स्थिति में अनुक्रमित करने की आवश्यकता है।
इसके बजाय, मैं का उपयोग कर के बारे में सोचा एक std::map
तो जैसे:
std::map< std::pair<int, int>, ObjectData> m_objects;
फिर, जैसा कि मैं आसपास के वस्तुओं जाँच कर रहा हूँ, मैं अपने पाश में map::find()
इस्तेमाल कर सकते हैं, पता चल सके कि आसपास के वस्तुओं मौजूद हैं:
if(m_objects.find(std::pair<3, 4>) != m_objects.end())
{
//An object exists at (3, 4).
//Add it to the list of surrounding objects.
}
यदि मैं ऐसा करने का निर्णय लेता हूं तो मैं संभावित रूप से map::find()
पर बहुत सी कॉल कर सकता हूं, लेकिन नक्शा पूरी दुनिया की 2 डी सरणी में new
से बहुत कम स्मृति लेगा।
क्या किसी को भी एक साधारण एल्गोरिदम पर कोई सलाह है जिसे मैं ढूंढने के लिए उपयोग कर सकता हूं? क्या मुझे std::map
का उपयोग करना जारी रखना चाहिए या इस तरह की समस्या के लिए कोई बेहतर कंटेनर है?
अपने ग्रिड है कम या घनी आबादी वाले? डेटा कितना बड़ा है जो इसे पॉप्युलेट करता है? – pmr
मामलों को और भी खराब बनाने के लिए, वास्तविक ग्रिड डेटा वर्तमान में लोड होने वाले मानचित्र के आधार पर अलग-अलग होगा। हालांकि, दुनिया के समग्र आकार के आधार पर, इसे शायद कम आबादी माना जाएगा। प्रत्येक 'ऑब्जेक्टडेटा' ऑब्जेक्ट 48 बाइट्स है। – user987280
दुर्लभ और बड़े पैमाने पर शब्द सापेक्ष हैं। क्या आप उन पर मूल्य डाल सकते हैं? क्या हजारों, लाखों, अरबों, ट्रिलियन हैं? –