मुझे एक सरल, वैकल्पिक दृष्टिकोण मिला जो एक नियमित चेकरबोर्ड के समान तर्क का उपयोग करता है। यह प्रत्येक टाइल के केंद्र में और प्रत्येक शीर्ष पर (एक तंग ग्रिड बनाकर और वैकल्पिक बिंदुओं की अनदेखी करके) बिंदुओं के साथ एक स्नैप-टू-ग्रिड प्रभाव बनाता है।
यह दृष्टिकोण कैटन जैसे खेलों के लिए अच्छी तरह से काम करता है, जहां खिलाड़ी टाइल और कोने के साथ बातचीत करते हैं, लेकिन उन खेलों के लिए अनुकूल नहीं है जहां खिलाड़ी केवल टाइल के साथ बातचीत करते हैं, क्योंकि यह रिटर्न देता है कि कौन से केंद्र बिंदु या शीर्ष निर्देशांक निकटतम हैं, बजाय हेक्सागोनल टाइल। निर्देशांक भीतर हैं।
ज्यामिति
यदि आप किसी ऐसे स्तंभ में बिंदु रखते हैं, जो किसी टाइल की चौड़ाई से चौथाई है, और पंक्तियाँ जो टाइल की ऊँचाई से आधी हैं, तो आपको यह पैटर्न मिलेगा:
यदि आप एक चेकबोर्ड पैटर्न (छोड़ें if column % 2 + row % 2 == 1
) में हर दूसरे डॉट को छोड़ने के लिए कोड को संशोधित करते हैं , तो आप इस पैटर्न के साथ समाप्त होते हैं:
कार्यान्वयन
उस ज्यामिति को ध्यान में रखते हुए, आप एक 2 डी सरणी बना सकते हैं (जैसे आप एक वर्ग ग्रिड के साथ करेंगे), ग्रिड में x, y
प्रत्येक बिंदु के लिए निर्देशांक को संग्रहीत करना (पहले आरेख से) - ऐसा कुछ:
points = []
for x in numberOfColumns
points.push([])
for y in numberOfRows
points[x].push({x: x * widthOfColumn, y: y * heightOfRow})
नोट: जब आप बिंदुओं के चारों ओर एक ग्रिड बना रहे होते हैं, तब सामान्य रूप से, (बिंदुओं पर बिंदुओं को रखने के बजाय ), आपको मूल ऑफसेट करने की आवश्यकता होती है (स्तंभ की आधी चौड़ाई को घटाकर x
और पंक्ति की आधी ऊंचाई सेy
)।
अब जब आप अपने 2 डी सरणी ( points
) को आरंभीकृत कर चुके हैं, तो आप माउस को निकटतम बिंदु पा सकते हैं जैसे आप एक वर्ग ग्रिड पर होंगे, केवल दूसरे आरेख में पैटर्न का उत्पादन करने के लिए हर दूसरे बिंदु को अनदेखा करना होगा:
column, row = floor(mouse.x / columnWidth), floor(mouse.y / rowHeight)
point = null if column % 2 + row % 2 != 1 else points[column][row]
यह काम करेगा, लेकिन निर्देशांक निकटतम बिंदु (या कोई बिंदु) पर गोल किए जा रहे हैं, जिसके आधार पर सूचक आयत के भीतर है। आप वास्तव में बिंदु के चारों ओर एक गोलाकार क्षेत्र चाहते हैं (इसलिए स्नैप-रेंज हर दिशा में बराबर है)। अब जब आप जानते हैं कि किस बिंदु को जांचना है, तो आप आसानी से दूरी (पायथागोरस के प्रमेय का उपयोग करके) पा सकते हैं। निहित सर्कल को अभी भी मूल बाउंडिंग आयत के अंदर फिट होना होगा, इसकी अधिकतम व्यास को एक कॉलम की चौड़ाई तक सीमित करना (एक टाइल की चौड़ाई चौथाई), लेकिन यह अभी भी अभ्यास में अच्छी तरह से काम करने के लिए पर्याप्त बड़ा है।