माउस निर्देशांक को आइसोमेट्रिक इंडेक्स में कैसे बदलें?


21

मैं टाइल 64x32 के साथ आइसोमेट्रिक मानचित्र आकर्षित करता हूं :

const Offset = 160;
int X, Y;

for (int a=0; a < 6; a++)
  for (int b=0; b < 6; b++) {
    X = a * 32 - b * 32 + Offset;
    Y = a * 16 + b * 16;
    DrawTile(X, Y, tile);
  }

इस कोड को दर्शाने वाली छवि:

इस कोड को दर्शाने वाली छवि:

प्रिय पेशेवरों, कृपया, सेल के आइसोमेट्रिक इंडेक्स में माउस निर्देशांक के परिवर्तन के सूत्र के साथ मदद करें। उदाहरण: (१०५; १००) -> [१; 4]।



साइड नोट: यदि आप वास्तव में किसी वैरिएबल के पिछले मूल्य को एक्सेस नहीं करना चाहते हैं, जैसा कि while(val = arr[i++])या इसी तरह के कंस्ट्रक्शन में आप कर रहे हैं , तो इसका उपयोग न करें । उपयोग करें ++aऔर ++bइसके बजाय।
मार्टिन सोज्का

जवाबों:


25

आपको टाइल-स्पेस निर्देशांक से स्क्रीन-स्पेस निर्देशांक में परिवर्तन मैट्रिक्स निर्धारित करने की आवश्यकता है , फिर इसके लिए उलटा मैट्रिक्स की गणना करें, जो स्क्रीन-स्पेस निर्देशांक पर लागू होने पर उन्हें टाइल-स्पेस वाले में बदल देता है।

वैसे: आपकी ऑफसेट वास्तव में एक जगह की ओर इशारा कर रही है जो किसी भी समन्वय प्रणाली में (0.0, 1.0) होगी, लेकिन यह एक बड़ी समस्या नहीं है, बस कुछ ध्यान में रखना है। इसका मतलब यह है कि आपके रूपांतरित समन्वय प्रणाली की उत्पत्ति की भरपाई (ऑफसेट + 32, 0) पर है।


विशिष्ट मामला

आप मूल रूप से टाइल-स्पेस (ए, बी) के निर्देशन के लिए स्क्रीन-स्पेस (x, y) निर्देशांक में क्या कर रहे हैं, इसे निम्न परिवर्तन मैट्रिक्स के माध्यम से चलाना है:

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

परिभाषाएँ: टाइल के लिए और बी (0, 0) रेंज में हैं (0.0, 1.0) साथ (0.0, 0.0) ऊपरी कोने में, (1.0, 1.0) निचले कोने में, (0.0, 1.0) बाएँ कोने में और (1.0, 0.0) स्क्रीन स्पेस में दाहिना कोना।

हम एक निरंतर तीसरे समन्वय द्वारा समन्वय परिभाषाओं का विस्तार करते हैं (यह हमेशा ठीक 1 है) अनुवाद को मैट्रिक्स में शामिल करने में सक्षम होने के लिए।

अब आप इस परिवर्तन के लिए उलटा मैट्रिक्स बना सकते हैं । मूल सूत्र है:

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

... C के लिए A के लिए cofactors का मैट्रिक्स होना

आपके मामले में, निर्धारक | | हमेशा 1024, कोई फर्क नहीं पड़ता ऑफसेट, तो उलटा मैट्रिक्स है:

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


उदाहरण गणना

अब, आपके उदाहरण डेटा के लिए ...

सूत्र में ऑफसेट के लिए अपना नंबर डालें, और आप प्राप्त करें:

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

मैट्रिक्स (105, 100, 1) (स्क्रीन निर्देशांक) मैट्रिक्स के साथ आपको मिलता है:

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

चूंकि तीसरा समन्वय हमेशा 1 होता है, हमें इसकी गणना करने की आवश्यकता नहीं है। निकटतम पूर्ण संख्या में नीचे राउंड करें, और आपको (1, 4) अपने टाइल स्थान के निर्देशांक के रूप में मिलता है, जैसा कि अपेक्षित था।


सामान्य डिमेट्रिक प्रोजेक्शन मैट्रिसेस

यदि आपके पास इस तरह का एक परिप्रेक्ष्य है जिसमें प्रत्येक टाइल 2 w चौड़ाई (64 उदाहरण में, इसलिए w = 32) और 2 h ऊंचाई (32 उदाहरण में, तो h = 16) है, और मूल बिंदु की ऑफसेट है स्क्रीन स्पेस में क्रमश: क्षैतिज और ऊर्ध्वाधर अक्ष के लिए f x और f y है (उदाहरण में 192 और 0), मैट्रिसेस इस प्रकार दिखते हैं।

स्क्रीन स्पेस के लिए टाइल की जगह

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

टाइल अंतरिक्ष के लिए स्क्रीन अंतरिक्ष

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

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