2 डी ग्रिड कोशिकाओं को एक घूमने वाले चक्र द्वारा कैसे पाया जाए?


9

मैं 2 डी ग्रिड पर आधारित एक गेम बना रहा हूं, जिसमें कुछ सेल निष्क्रिय हैं और कुछ नहीं हैं। डायनेमिक ऑब्जेक्ट ग्रिड से स्वतंत्र रूप से लगातार आगे बढ़ सकते हैं, लेकिन अगम्य कोशिकाओं से टकराने की जरूरत है।

मैंने ग्रिड के खिलाफ एक किरण का पता लगाने के लिए एक एल्गोरिथ्म लिखा था, जो मुझे उन सभी कोशिकाओं को देता है जो किरण प्रतिच्छेद करती हैं। हालांकि, वास्तविक वस्तु बिंदु-आकार नहीं है; मैं वर्तमान में उन्हें मंडलियों के रूप में प्रस्तुत कर रहा हूँ। लेकिन मैं मूविंग सर्कल का पता लगाने के लिए एक प्रभावी एल्गोरिदम का पता नहीं लगा सकता। यहाँ एक तस्वीर है जो मुझे चाहिए: यहाँ छवि विवरण दर्ज करें

संख्याएँ इस क्रम में दिखाती हैं कि वृत्त ग्रिड कोशिकाओं से किस क्रम में टकराता है। किसी को भी इन टकरावों को खोजने के लिए एल्गोरिथ्म पता है? अधिमानतः सी # में।

अपडेट सर्कल एकल ग्रिड सेल से बड़ा हो सकता है।


mmh 3 से पहले 4 क्यों टकराए?
FxIII

@FxIII मैंने वास्तव में चित्र में सर्कल को स्थानांतरित किया, और यह 3 से पहले 4 मारा। केवल मुश्किल से, लेकिन अभी भी पहले।
बात नहीं

जवाबों:


6

मुझे लगता है कि आपकी ड्राइंग थोड़ा भ्रामक है क्योंकि आप सर्कल से बिंदु पर स्ट्रोक को अपनी चलती दिशा में खींचने के लिए चुनते हैं। मैं देख सकता हूं कि जब आपके सर्कल के TOP और LEFT अंक एक किनारे को छूते हैं तो आपके ग्रिड किनारों से टकराव खुश हो जाता है।

चलो सी अपने केंद्र हो सकता है और r त्रिज्या तो पी ' = सी + ( आर , 0) और पी' = सी + (0, आर)।

यदि D आपकी दिशा वेक्टर है (छंद) तो आपकी दो लाइनें हैं:

R '= D · t + P' ,

आर "= डी · टी + पी"

आपको सरलता से समीकरण की रेखाओं के साथ उन पंक्तियों का प्रतिच्छेदन ज्ञात करना है:

y = i और y = i जो कि आपके ग्रिड के किनारे हैं!

समाधान आसान है, क्योंकि आपको केवल R या R के x या y घटक पर विचार करना है। आप प्रत्येक प्रतिच्छेदन के लिए t s मान पाएंगे, और thoose t s के लिए बिंदु, बस उन बिंदुओं को t और आप द्वारा क्रमबद्ध करें। कार्य पूर्ण।

मेरा मानना ​​है कि आप आसानी से कह सकते हैं कि चौराहे के बिंदु को जानने पर कौन सी सेल हिट होती है।

यह काम करता है अगर r <1 (सेल की चौड़ाई और ऊंचाई)।

यह अन्य मामलों के लिए भी काम करता है, बस P ' और P "के बारे में कुछ विचार कर रहे हैं । हम दिशा के कारण TOP और LEFT चुनते हैं, BOTTOM और RIGHT को विपरीत दिशा के लिए माना जाना चाहिए, आप समझते हैं क्यों।

अब इस छवि को देखें: दीर्घ वृत्ताकार

सर्कल बड़ा है और फिर एक ही सेल है और हमें लगता है कि यह आपके ड्राइंग के समान दिशा में जा रहा है। पी 1 पहला बिंदु है जो स्पर्श करेगा, पी 2 दूसरा है, पी 3 बेकार है क्योंकि नीचे के आधे हिस्से में है। आपको जो करने की ज़रूरत है वह P1 और P2 से किरणों को डालना है जैसा कि हमने पहले देखा था और ऊर्ध्वाधर लाइनों के लिए भी ऐसा ही किया था।

सामान्य तौर पर आपके पास TOP और LEFT के साथ अन्य शुरुआती बिंदु होंगे जहां से आपकी किरणें शूट होती हैं, आपका सर्कल जितना बड़ा होता है, उतनी ही अधिक किरणें डाली जाती हैं।

कुछ ईमानदार होने के लिए आप उन सभी को शूट करने से बच सकते हैं जो कुछ ज्यामितीय विचार कर रही हैं, लेकिन इससे चीजें समझने में मुश्किल हो सकती हैं।


हाँ, मैंने सोचा था कि पी 'और पी "अपने आप को इंगित करता है, लेकिन यह पता नहीं लगा सकता कि जब एक ही सेल से बड़ा सर्कल होता है तो क्या करना है। अतिरिक्त अंक वास्तव में समझ में आता है (और मुझे स्पष्ट रूप से केवल पी के बीच किरणों को जोड़ने की आवश्यकता है ) पी ")
नेवरमाइंड

ज्यामितीय विचार किया जा सकता है जो संगणनाओं को सरल बनाता है लेकिन कार्यान्वयन का उपयोग करने से आप अनुभव के अनुसार परिणाम प्राप्त कर सकते हैं।
FxIII

क्या यह स्पष्ट है कि आपको क्षैतिज और ऊर्ध्वाधर ग्रिड लाइनों के लिए अलग से परीक्षण करना होगा?
FxIII

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

@ यदि वे एक साथ केवल तभी स्पर्श करते हैं जब पुटिका द्विभाजक की दिशा में बिल्कुल यात्रा करती है।
FxIII

1

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

आप शायद इस पर थोड़ा सुधार कर सकते हैं - उदाहरण के लिए एक वृत्त के केंद्र से दूसरे खंड के केंद्र तक लाइन खंड का उपयोग करके, लेकिन वृत्त के त्रिज्या द्वारा दोनों तरफ विस्तारित, साथ ही समानांतर रेखा खंडों पर दोनों ओर मंडलियों के छोर पर।


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

प्रत्येक टक्कर के लिए एक टी-मान बनाए रखने के लिए अपने किरण-टकराव एल्गोरिथ्म को संवर्धित करें। जब आपको कोशिकाओं का मिलन होता है, तो आप सही क्रम प्राप्त करने के लिए टी-वैल्यू पर छाँट सकते हैं।
ट्रेडबेडेड

लेकिन मैं विभिन्न किरणों के टी-मूल्य की तुलना कैसे कर सकता हूं ?
बात नहीं

यदि आप हमेशा एक ही सर्कल से उत्पन्न होते हैं, तो आपके चौराहे के बिंदु उस सर्कल से दूरी होंगे। जब आप पहले से ही देखे गए सेल में आते हैं, यदि वर्तमान टक्कर का टी-मूल्य पिछले वाले से छोटा है, तो इसका उपयोग करें ... अन्यथा, चौराहे को छोड़ दें (मूल रखते हुए)।
ट्रेडबेडेड

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

1

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


मैं इस बारे में भी सोच रहा था, लेकिन यह मेरी राय में, यह सही एल्गोरिथ्म नहीं है। ब्रेसेनहैम केवल एक पिक्सेल चुनता है, उसे सभी की आवश्यकता है। और यह सिर्फ एक पिक्सेल के चक्र के लिए ब्रेसेनहैम को अनुकूलित करने के लिए अलग-अलग होगा।
zacharmarz

मेरे द्वारा उपयोग किया जाने वाला किरण अनुरेखक वास्तव में ब्रेसेनहैम एल्गोरिथ्म पर आधारित थोथा-सॉर्टा है। मुझे इसे एक पतली रेखा से "वसा" के लिए सामान्य करने में परेशानी होती है, विशेष रूप से सर्कल-स्वेप्ट।
नेवरमाइंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.