सबसे पहले, यहां कोड है। एक स्पष्टीकरण का पालन करेंगे:
/*
* tw, th contain the tile width and height.
*
* hitTest contains a single channel taken from a tile-shaped hit-test
* image. Data was extracted with getImageData()
*/
worldToTilePos = function(x, y) {
var eventilex = Math.floor(x%tw);
var eventiley = Math.floor(y%th);
if (hitTest[eventilex + eventiley * tw] !== 255) {
/* On even tile */
return {
x: Math.floor((x + tw) / tw) - 1,
y: 2 * (Math.floor((y + th) / th) - 1)
};
} else {
/* On odd tile */
return {
x: Math.floor((x + tw / 2) / tw) - 1,
y: 2 * (Math.floor((y + th / 2) / th)) - 1
};
}
};
ध्यान दें कि यह कोड आपके प्रश्न में दिखाए गए नक्शे के लिए बॉक्स से बाहर काम नहीं करेगा। इसका कारण यह है कि आपके पास बाईं ओर विषम टाइल ऑफ़सेट हैं, जबकि विषम टाइल आमतौर पर दाईं ओर ऑफ़सेट होती है (जैसा कि टाइल किए गए मानचित्र संपादक में मामला है )। आपको विषम-टाइल के मामले में लौटाए गए x मान को हटाकर इसे आसान करने में सक्षम होना चाहिए।
व्याख्या
यह इस कार्य को पूरा करने के लिए थोड़ा अधिक ब्रूट-फोर्स विधि प्रतीत हो सकता है, लेकिन इसमें पिक्सेल परफेक्ट और थोड़ा अधिक लचीला होने का कम से कम लाभ है।
चाल एक एकल कंपित ग्रिड के रूप में नक्शे को देखने में नहीं है, लेकिन दो ग्रिड के रूप में एक दूसरे के ऊपर ओवरले। वहाँ विषम पंक्तियों ग्रिड और समान पंक्तियों ग्रिड है, लेकिन चलो उन्हें लाल और हरे रंग के बजाय कॉल करें ताकि हम एक सुंदर आरेख बना सकें ...
उस छवि के दाईं ओर सूचना मैंने एक बिंदु को बैंगनी डॉट के साथ चिह्नित किया है। यह वह उदाहरण बिंदु है जिसे हम अपने मूल टाइल-स्थान में खोजने का प्रयास करेंगे।
दुनिया में किसी भी बिंदु के बारे में नोटिस करने की बात यह है कि यह हमेशा दो क्षेत्रों में झूठ होगा - एक लाल एक और एक हरा (जब तक कि यह एक किनारे पर न हो, लेकिन आप वैसे भी दांतेदार किनारे सीमा के भीतर क्लिपिंग करेंगे)। आइए जानें वो क्षेत्र ...
अब दोनों क्षेत्रों में से किसे चुनना सही है। हमेशा एक ही उत्तर होगा।
यहाँ से हम कुछ और सरल अंकगणित कर सकते हैं और अपने नमूने बिंदु से दो क्षेत्रों के प्रत्येक केंद्र बिंदु तक चौकोर दूरी तय कर सकते हैं। जो भी सबसे करीब होगा, वह हमारा जवाब होगा।
हालांकि एक वैकल्पिक तरीका है। प्रत्येक परीक्षण क्षेत्र के लिए, हम एक बिटमैप का नमूना लेते हैं जो हमारी टाइलों के सटीक आकार से मेल खाता है। हम उस एकल-टाइल के लिए स्थानीय निर्देशांक में अनुवादित बिंदु पर इसका नमूना लेते हैं। हमारे उदाहरण के लिए यह कुछ इस तरह दिखेगा:
एक बाईं ओर हम हरे क्षेत्र की जांच करते हैं और एक हिट (ब्लैक पिक्सेल) प्राप्त करते हैं। दाईं ओर हम लाल क्षेत्र का परीक्षण करते हैं और एक मिस (व्हाइट पिक्सेल) प्राप्त करते हैं। दूसरा परीक्षण बिल्कुल बेमानी है क्योंकि यह हमेशा एक या दूसरे के समान होगा, दोनों कभी नहीं।
हम फिर इस निष्कर्ष पर पहुँचते हैं कि हमारे पास 1,1 पर विषम टाइल में एक हिट है। यह समन्वय मूल टाइल के नक्शे के लिए सरल होना चाहिए जो विषम और यहां तक कि पंक्तियों के लिए एक अलग परिवर्तन का उपयोग कर निर्देशांक करता है।
यह विधि आपको पिक्सेल परीक्षण बिटमैप (ओं) पर सरल प्रति पिक्सेल गुण रखने की भी अनुमति देती है। जैसे सफेद ऑफ-टाइल है, काला हिट है, नीला पानी है, लाल ठोस है।