दो कोनों के साथ दृष्टि की विकर्ण रेखा


9

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

दृष्टि किनारे मामले की रेखा

जो परिणाम मैं चाहता हूं, वह दो दीवारों के बीच टाइल के लिए है ताकि इसे अमान्य माना जा सके।

वांछित परिणाम

इसे हल करने के लिए ब्रेसेनहैम की रेखा एल्गोरिथ्म को संशोधित करने का सबसे तेज़ तरीका क्या है? यदि कोई अच्छा समाधान नहीं है, तो क्या बेहतर अनुकूल एल्गोरिदम है? किसी भी विचार का स्वागत है। कृपया ध्यान दें कि समाधान 3 डी का समर्थन करने में सक्षम होना चाहिए।

संपादित करें: मेरा सरल समाधान यह जांचने के लिए था कि क्या लाइन के x और y निर्देशांक बदलने पर दोनों कोने बंद हो जाते हैं। कार्य स्रोत कोड और पूर्ण उत्पाद के एक इंटरैक्टिव डेमो के लिए कृपया देखें http://ashblue.github.io/javascript-pathfinding/


2
अगर आप स्टार्ट और एंड पॉइंट को स्विच करते हैं तो क्या इससे कोई फर्क पड़ता है? शायद तब आप परिणाम को स्वीकार कर सकते हैं यदि दोनों गणना दृष्टि की एक बाधित बाधा को वापस कर दें। तुम भी कुछ LOS लेख RogueBasin पर मददगार हो सकता है।
थलडोर

1
किसी भी तरह से, 4-5 पर उन दो काले ब्लॉक विकर्ण पहली जगह में एक दीवार से नहीं जुड़े हैं, और मैं यह कहता हूं क्योंकि आप स्पष्ट रूप से विकर्ण आंदोलन की अनुमति दे रहे हैं। आपको उस तिरछी दीवार को बनाने के लिए उस तिरछे को या तो चौकोर करना चाहिए या अपनी रेखा के चलने वाले को अपने विकर्ण चालों से दूर करना चाहिए बजाय इसके कि आप 2-3 और 4-5 की तरह विशुद्ध रूप से विकर्ण हो जाएँ।
पैट्रिक ह्यूजेस

यह एक अच्छा विचार की तरह लग रहा था flipping, लेकिन यह मुद्दे को हल नहीं करता है। केवल एक चीज जो मैं सोच सकता हूं वह यह है कि दो कोनों में से एक खाली है या नहीं। हालांकि महंगा लगता है।
ऐश ब्लू

5
"महंगा लगता है" कुछ भी कोशिश न करने के औचित्य के लिए पर्याप्त नहीं है। "बहुत महंगा होगा" आम तौर पर, यह मानते हुए कि आप साबित कर सकते हैं कि कुछ बहुत धीमा होगा।
मकोशा

3
केवल आवश्यक एल्गोरिथ्म में परिवर्तन यह है कि यदि X और Y दोनों एक ही चरण में बदल रहे हैं तो पहले X को बदलें और फिर Y को बदलें, इससे विकर्ण पूरी तरह से समाप्त हो जाएंगे।
पैट्रिक ह्यूजेस

जवाबों:


7

एरिक लिपिपर्ट ने आयताकार प्लेनर ग्रिड पर शैडो कास्टिंग के साथ सी # में लाइन-ऑफ-विजन उत्पन्न करने पर एक उत्कृष्ट श्रृंखला लिखी ।

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

मैंने एरिक के एल्गोरिथ्म को यहां एक हेक्सागोनल ग्रिड के रूप में अनुकूलित किया है , और एक व्यापक दृश्यता त्रिज्या (> 60 हेक्स) के साथ बड़े हेक्सागोनल ग्रिड (> 400 x 700) पर सफलतापूर्वक इसका इस्तेमाल किया है। यह कार्यान्वयन एक i7 सीपीयू का उपयोग करते हुए तेजी से पूरे क्षेत्र को देखने और प्रदर्शित करने के लिए प्रदर्शित करता है, जो मैं झपका सकता हूं। यह निश्चित रूप से किसी भी उपयोग के लिए पर्याप्त रूप से तेज़ है जो मुझे इसे लगाने की उम्मीद है।

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


मैं वास्तव में शैडो कास्टिंग खोद रहा हूं, लेकिन मैं एक समस्या में चला गया हूं। एक z- अक्ष के साथ संचालित करने के लिए एल्गोरिथ्म को स्केल करने पर कोई जानकारी प्राप्त करने में समस्या हो रही है। यह उल्लेख करने के लिए क्षमा करें, लेकिन क्या आपके पास इसे 3 डी में काम करने के लिए कोई सुझाव दिए गए संसाधन हैं?
ऐश ब्लू

@AshBlue: ऊपर का परिशिष्ट देखें
पीटर जार्जेंस

मैं आपका कोडबेस देख रहा हूं। इसमें बहुत अच्छी चीजें हैं, लेकिन मुझे हेक्सेज़ के लिए अनुकूलित एक ब्रेसेनहैम जैसी रेखा ड्राइंग एल्गोरिदम नहीं लगती है। क्या आप इसे LOS के साथ करते हैं?
MLProgrammer-CiM

@EfEs: FieldOfView लौटी हुई वस्तु है; ShadowCastingFov * .cs छायांकन करके फ़ील्ड-ऑफ-व्यू उत्पन्न करता है। यदि आपके पास कोड के बारे में विशिष्ट प्रश्न हैं, तो वे साइट के चर्चा अनुभाग में सबसे अच्छे तरीके से पूछे जा सकते हैं; अधिक सामान्य प्रश्न मुझे यहाँ उत्तर देने में खुशी हो रही है।
पीटर जार्जेंस

@PieterGeerkens आप यहां प्रश्न gamedev.stackexchange.com/questions/57087/…
MLProgrammer-CiM

1

क्या होगा अगर LOS गणना के लिए आपके पास एक अलग "उच्च रिज़ॉल्यूशन" ग्रिड है जो कोने के अंतराल में भरता है। मैं कुछ इस तरह सोच रहा था:

यहाँ छवि विवरण दर्ज करें

बाईं ओर 4 वर्गों का मूल खंड है।

दाईं ओर "उच्च रिज़ॉल्यूशन" संस्करण है, जैसा कि आप देख सकते हैं कि प्रत्येक मूल वर्ग को क्वाटर्स में विभाजित किया गया था और कोनों में से एक को भर दिया गया है। मुझे यकीन है कि एल्गोरिथ्म को उत्पन्न करने के लिए बंद नहीं किया गया है, लेकिन यह पूर्व-संगणित हो सकता है। वर्तमान मानचित्र से।

इसका मतलब यह है कि समन्वित स्थान चौगुना है, लेकिन मैं यह कल्पना नहीं करता कि एक महत्वपूर्ण प्रदर्शन मुद्दा है।


बहुत यकीन है कि उच्च रिज़ॉल्यूशन मूल के समान ही दिखाई देगा। ग्रिड को छोटे ग्रिड में विभाजित करते समय, आपको एक छोटा ग्रिड के साथ एक ही दृश्य प्रतिनिधित्व मिलता है। प्रत्येक एकल वर्ग एक ही स्थान पर 4 छोटे वर्ग बन जाते हैं।
माइकलहाउस H

@ बाइट 56 सही, मेरा मतलब था कि अतिरिक्त तर्क को उस प्रति में अतिरिक्त ब्लॉकों में जोड़ने के लिए विभाजित करने के बाद लागू किया जाएगा। ऐसा करने का तर्क पाठक के लिए एक अभ्यास है।
डेवि 8

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