स्प्राइट और उपयोगकर्ता के बीच टकराव का पता कैसे लगाया जाए?


9

किसी प्रकार के स्प्राइट और उपयोगकर्ता-जनित आकृति के बीच टकराव का पता कैसे लगाया जाए।

उदाहरण के लिए। स्क्रीन पर कुछ ऑब्जेक्ट हैं। उपयोगकर्ता अपनी उंगली लेता है और एक ऑब्जेक्ट के चारों ओर एक सर्कल आकार बनाता है (चयन नियम स्प्राइट के चारों ओर पेंटिंग सर्कल है, लेकिन पेंटिंग आकार विभिन्न हो सकते हैं)। मुझे यह पता लगाने की जरूरत है कि कौन सी वस्तु चयनित है, जो इस प्रकार है:

(डेमो चित्र): मूल रूप से http://i52.tinypic.com/28h0t1g.png के रूप में पोस्ट किया गया


क्या आप बता सकते हैं कि आपके अंतिम उदाहरण में नीला क्यों चुना गया है और लाल नहीं? क्या आप यह भी स्पष्ट कर सकते हैं कि क्या वास्तव में लाइन स्प्राइट को छूती है? तीसरा उदाहरण लाल बॉक्स को नहीं छूता है लेकिन इसे चयनित के रूप में बताया गया है। 5 वां उदाहरण बहुत समान है लेकिन चयनित नहीं है। क्या अंतर है जो आप # 3 और # 5 के बीच देख रहे हैं?
Romen

जवाबों:


2

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


1

यदि आकार क्रेयॉन भौतिकी की तरह हाथ से तैयार किया गया है , तो आप सीधी रेखाओं की एक सरणी पकड़ सकते हैं और उनमें से प्रत्येक के साथ टकराव की जांच कर सकते हैं। सीधी रेखाओं के बावजूद आप बेजियर घटता या ऐसा कुछ उपयोग कर सकते हैं ।


0
  • स्क्रीन (या सतह जहां आपके आकार हैं) के समान आकार का एक बफर बनाएं। प्रत्येक स्थिति में यह बूलियन होता है चाहे स्प्राइट हो; फिर, उपयोगकर्ता आकार के सभी "पिक्सेल" की जांच करें कि क्या उनकी स्थिति स्प्राइट (उस बूलियन के मूल्य की जांच करके) है। वैकल्पिक रूप से, आप बूलियन के बजाय उनकी आईडी को स्टोर करके वहां अधिक स्प्राइट बना सकते हैं; लेकिन यह 1 स्प्राइट का मामला था।
  • यदि उपयोगकर्ता द्वारा बनाई गई आकृति को लाइनों के अनुक्रम द्वारा दर्शाया जा सकता है, तो आप जांच सकते हैं कि क्या ऐसी प्रत्येक रेखा स्प्राइट को पार करती है। चूंकि स्प्राइट में आयताकार आकार होता है और उपयोगकर्ता का आकार एक लाइन होती है, बस "लाइन आयत चौराहे" की तलाश करें ... (कुल्हाड़ियों के एल्गोरिथ्म को अलग करते हुए इसे करने का एक तरीका)

दृष्टिकोण इस बात पर निर्भर करते हैं कि आप किन डेटा संरचनाओं को चुनते हैं, चाहे वे बिटमैप या वैक्टर हों।

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

दूसरा दृष्टिकोण, लागू करने के लिए इतना सरल नहीं है, लेकिन अधिक प्रसंस्करण शक्ति का उपयोग करता है।

प्रत्येक मामले में अगर यह मायने रखता है। मैं पहले एक करने की कोशिश करूंगा क्योंकि इसे लागू करना सरल है। सौभाग्य। :)

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