2 डी टक्कर का पता लगाने


11

आइए मान लें कि मैं इस चरित्र का उपयोग कर रहा हूं।

चिड़िया
(स्रोत: iconbug.com )

आप इसके लिए टकराव का पता कैसे लगाएंगे? एक बाउंडिंग बॉक्स का उपयोग करना एक अच्छा अनुमान नहीं लगता है, क्योंकि पक्षी का आकार एक वर्ग के पास कहीं नहीं है।

मैं ऑब्जेक्ट के अंदर एक प्रकार का क्वाड ट्री डेटा संरचना होने की सोच रहा था जो छवि के कुछ हिस्सों का प्रतिनिधित्व करता है। प्रत्येक पत्ती या तो हो सकती है false(यदि यह पक्षी के बाहर सफेद / पारदर्शी स्थान को कवर करती है) या true(मामले में यह पक्षी का एक क्षेत्र अर्थात चोंच, आंख आदि का प्रतिनिधित्व करती है)। फिर किसी तरह पक्षी के साथ टकराव के लिए दृश्य में एकमात्र बाधा का परीक्षण करें

लेकिन मेरे दृष्टिकोण में मेरी समस्याएं हैं:

  1. मुझे नहीं पता कि कैसे क्वाड ट्री को इनिशियलाइज़ किया जाए।
  2. एक बार जब क्वाड ट्री को इनिशियलाइज़ कर लिया जाता है, तो मुझे यकीन नहीं होता कि इमेज के निर्देशांक के भीतर बाधा आने पर उसे कैसे ट्रेस और उपयोग करना है।

आप गैर-विद्रोही पात्रों के साथ टकराव का पता कैसे लगाएंगे?

LE: मैंने जो अन्य दृष्टिकोण देखा है वह कई बाउंडिंग बॉक्स का उपयोग करना था। उदाहरण के लिए मेरे पास चोंच के लिए एक या कुछ बाउंडिंग बॉक्स होंगे, फिर उनमें से कुछ बाल या पूंछ के लिए। लेकिन यह थकाऊ हो सकता है। यदि यह मेरे मामले में एक वैध दृष्टिकोण है, तो मैं उन बाउंडिंग बॉक्सों को कैसे उत्पन्न करूंगा? मुझे संदेह है कि मुझे अपने कार्यक्रम में उन्हें हार्डकोड करना होगा।

LE2: मुझे काफी सटीक टक्करों की परवाह है। मैं कल्पना नहीं कर सकता कि एक एकल बाउंडिंग बॉक्स या सर्कल कम से कम अनुमानित रूप से उस आकृति को कैसे बना सकता है, इसलिए यह दृष्टिकोण काम नहीं करेगा।


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

धन्यवाद, मैं वैसे भी ऐसा करने की योजना बना रहा था, लेकिन मुझे पूरी तरह से यकीन नहीं है कि 'ग्रैन्यूलर चेक' क्या होना चाहिए। :)
async

1
एकमात्र महत्वपूर्ण विवरण गायब है: आप इसके साथ क्या करना चाहते हैं? क्या आप सटीक टक्करों की परवाह करते हैं? क्या आप एक सर्कल के साथ चरित्र को अनुमानित करने के लिए खुश हैं? क्या आप चाहते हैं कि धूल के कण बाकी हिस्सों से अलग चरित्र की आंखों से टकराएं?
एको

@ अको आप एक चक्र के साथ उस आकृति का अनुमान कैसे लगा सकते हैं? मैं काफी सटीक टकरावों के बारे में परवाह करता हूं-वास्तव में पिक्सेल सटीक, लेकिन कुछ ऐसा जो अच्छा / स्वाभाविक लगेगा-।
async

1
इस तरह । "अच्छा" और "प्राकृतिक" का क्या अर्थ है? क्या यह एक दार्शनिक प्रश्न है?
एको

जवाबों:


12

सर्किल टकरानेवाला। इसके लिए पर्याप्त है कि मैं कहूंगा कि जब तक आप कुछ भागों के साथ कुछ नहीं कर रहे हैं, भौतिकी से प्रभावित हो रहे हैं या टकराव अप्राकृतिक दिख रहे हैं, और यहां तक ​​कि अगर आपको इसे कई हिस्सों में विभाजित करने की आवश्यकता है, तो मुझे आपसे एक बात कहनी होगी:

इसे अधूरा मत करो।

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


3
हां, अगर कोई एकल आकृति इसे कवर नहीं करेगी, तो बस कई आकृतियों का एक छोटा सा सरणी बनाएं। उदाहरण के लिए: i.imgur.com/Dd4yyGN.png
MichaelHouse

धन्यवाद Jonkel & @ Byte56 कुछ आकृतियों का उपयोग करना मेरी स्थिति में सही समाधान लगता है। लागू करने के लिए सीधा, सटीक और तेज। विश्वास नहीं कर सकता मैं इस पर विचार किए बिना सीधे क्वाड पेड़ों पर कूद गया! उह।
async

अतिरिक्त सटीकता के लिए, चोंच के लिए शरीर और आयताकार के लिए एक सर्कल कोलाइडर।
मई को क्रोल्टन

14

एक दो कदम की जाँच प्रक्रिया

पहले चरण पर, आप बाउंडिंग बॉक्स की जांच करते हैं , और अगर वहाँ कोई टक्कर नहीं है, तो परीक्षण खत्म हो गया है। यदि टक्कर होती है, तो आप दूसरे पास पर जाते हैं

दूसरे पास पर , यदि आप अधिक सटीक चाहते हैं, और आप एक सच्चे पिक्सेल सही समाधान चाहते हैं, तो आप बस एक पिक्सेल सही चेक पास कर सकते हैं

चूँकि आपकी छवि एक PNG (या कोई अन्य फ़ाइल प्रारूप है जिसमें एक अल्फा चैनल शामिल है) यह आसान नहीं होगा

  1. दृश्य और पक्षी में उस एक वस्तु के बीच के चौराहे क्षेत्र की गणना करें, दोनों छवियों पर चौराहे की एक सरल आयत
  2. उस चौराहे के भीतर, जांचें कि प्रत्येक पिक्सेल का बीओटीएच छवियों में एक अल्फा मान> 0 है
  3. यदि ऐसा कोई पिक्सेल मौजूद है, तो आपकी टक्कर हुई। नहीं तो नहीं

यदि आप अपने चित्रों को अल्फा चैनल पर देखते हैं, तो आप देख सकते हैं कि पिक्सेल पर सटीक टक्कर के लिए आपके पास पहले से ही सभी जानकारी कैसे हो सकती है

छवि से अल्फा चैनल

पिक्सेल परफेक्ट टकराव आमतौर पर महंगे होते हैं, इसलिए पहली बार एक बाउंडिंग बॉक्स या एक अधिक विस्तृत टकराव के आंकड़े के साथ एक मोटा अनुमान लगाते हैं (जैसे एक Anko का सुझाव दिया गया) आपको कुछ कीमती समय बचा सकता है

"महीन" विस्तृत टक्कर बाउंडिंग बॉक्स Anko का सुझाव दिया:

अधिक विस्तृत बाउंडिंग बॉक्स

पुनश्च: यदि आपकी छवि में एक प्रभामंडल, एक प्रभाव या अन्य गैर-0 अल्फा चैनल है जिसके साथ आप टकराव नहीं करना चाहते हैं, तो एल्गोरिथ्म सीमा को आसानी से समायोजित किया जा सकता है।


1
धन्यवाद! लेकिन मुझे सब के बाद पिक्सेल की सही सटीकता की आवश्यकता नहीं होगी। उत्कृष्ट उत्तर हालांकि, बाद की तारीख में उपयोगी होगा।
async

बेशक, हाँ, पिक्सेल सही टक्कर लगभग हमेशा एक overkill है, खेल है कि वास्तव में इसकी जरूरत है (2 डी सेनानियों की तरह) को छोड़कर
कोडमेक

3

मैं शरीर के लिए एक चक्र और चोंच के लिए एक ही आयत का उपयोग करूंगा, लेकिन यह सिर्फ मेरी राय है। अपनी टक्कर की ज्यामिति को ओवरकम्प्लीकेट करते हुए, आपके ऐप को धीमा कर सकता है, हालांकि, आप व्यावहारिक रूप से ई-स्क्रीन के पात्रों की संख्या को दोगुना (या अधिक) कर रहे हैं।


0

हो सकता है कि आप किसी तरह के विस्की पॉलीगॉन / एज कोलाइडर का इस्तेमाल कर सकें।

यकीन नहीं होता कि यह कैसे काम करेगा, लेकिन:

दो वस्तुएं: वस्तु 1: पक्षी (ओ 1), वस्तु 2: वह चीज जो पक्षी को मार सकती है (ओ 2)

1) एक बाउंडिंग आकार को परिभाषित करें जो एक बहुभुज है जो प्रश्न में पहली वस्तु (ओ 1) के करीब फिट बैठता है।

2) ओ 1, ओ 2 के किनारों को प्राप्त करें जो कि बिना गर्भधारण के टकरा सकते हैं, बिना ओ 2 या ओके से गुजरते हुए बिना गर्भधारण के टकरा सकते हैं।

आकार (ओ 2) की स्थिति और आकार के साथ आप संभवतः किनारों (ओ 1 के) को अलग कर सकते हैं जो कि गर्भ धारण नहीं कर सकते हैं, चाहे यह कारण हो कि वे "दूसरे किनारे" (ओ 1 के) के पीछे हैं जो ओ 2 के करीब है। यदि आपके पास एक समकोण त्रिभुज होता है, जिसका कर्ण और दाहिनी ओर सामना होता है और एक आयत सीधे उस पर (एक्स-अक्ष के साथ लंबे पक्ष के साथ) पहुंचती है, तो आप बता सकते हैं कि किन किनारों को छोड़ना है क्योंकि वे शुरुआत और अंत y मान दोनों हैं आयत के ऊपर या नीचे।

3) निर्धारित करें कि ओ 2 के किनारे पर एक बिंदु ओ 1 के किसी भी किनारे पर एक बिंदु के समान है जिसे आपने चरण 2 में चुना था।

यह अवधारणा संभवतः बहुभुज (यानी स्पष्ट किनारों वाली चीजें) को टकराने के लिए सबसे अच्छा काम करती है, लेकिन हो सकता है कि आप एक सर्कल को एक लंबे किनारे के रूप में मान सकते हैं (जैसे कि ओ 2 एक सर्कल था)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.