2009-10-25 17 views
7

मैं एक इंडी वीडियो गेम विकसित कर रहा हूं, और इस धारणा के तहत काम कर रहा हूं कि मेरे नियंत्रक पर थंबस्टिक में गति की गोलाकार सीमा है, यह "परिपत्र" निर्देशांक देता है; यानी, कार्टेसियन निर्देशांक एक परिपत्र क्षेत्र (त्रिज्या 1) से बाधित हैं। वास्तव में, निर्देशांक "वर्ग" हैं; उदाहरण के लिए, शीर्ष-दाएं अंगूठे की स्थिति x = 1, y = 1 के रूप में पंजीकृत होती है। जब मैं कार्टेसियन से ध्रुवीय तक निर्देशांक परिवर्तित करता हूं, तो आयाम 1 से अधिक हो सकता है - जिसका प्रभाव यह है कि खिलाड़ी लंबवत या क्षैतिज रूप से तेज़ी से तिरछे स्थानांतरित हो सकता है।मैं एक सर्कल पर निर्देशांक के लिए एक वर्ग पर निर्देशांक कैसे परिवर्तित कर सकता हूं?

तो, स्पष्टीकरण के लिए, मैं दिशा और परिमाण के संदर्भ में एनालॉग थंबस्टिक की स्थिति रिकॉर्ड करना चाहता हूं, जहां परिमाण 0 और 1 के बीच है। थंबस्टिक एक स्क्वायर प्लेन पर निर्देशांक देता है, इसलिए समन्वय को परिवर्तित करना कार्टेशियन से ध्रुवीय तक पर्याप्त नहीं है। मुझे लगता है कि मुझे समन्वय स्पेस रूपांतरित करने की आवश्यकता है, लेकिन यह मेरे बंदर मस्तिष्क की सीमाओं को दबा रहा है।

+0

क्या "संपूर्ण" वर्ग लेता है या क्या यह समन्वय वापस करता है जो किसी सर्कल की तरह दिखता है? जैसेसुनिश्चित करें कि आप sqrt-magnitude ले सकते हैं (या नहीं कर सकते)। –

+0

क्या आप (x, y) क्या सीधे छड़ी के साथ मिलता है? इसके अलावा, क्या आपकी छड़ी एनालॉग या स्विच है? क्या आप मूल्य (0.5,0.5) प्राप्त कर सकते हैं? – Nosredna

+0

हां, समन्वय कोनों सहित सभी वर्गों में वितरित किया जाता है। – Metaphile

उत्तर

15

Mapping a Square to a Circle देखें। मानचित्रण के लिए भी एक अच्छा दृश्यता है। आपको मिलता है:

xCircle = xSquare * sqrt(1 - 0.5*ySquare^2) 
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2) 
+0

विज़ुअलाइज़ेशन के आधार पर, मुझे लगता है कि यह _exactly_ है जो मैं चाहता हूं। धन्यवाद! – Metaphile

0

एक मान वेक्टर को सभी मानों को सामान्य करने के लिए परिमाण से प्रत्येक मान को विभाजित करें, उदा।

magn = sqrt(x * x + y * y); 
newx = magn > 1.0 ? x/magn : x; 
newy = magn > 1.0 ? y/magn : y; 

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

+1

मैं निश्चित रूप से परिमाण को क्लिप नहीं करना चाहता हूं। मेरे पास पहले से ही एक डेडज़ोन है। दोनों एक साथ छड़ी की गति की प्रभावी सीमा को काफी कम कर देंगे। मुझे लगता है कि एमेली का सही विचार है। – Metaphile

8

मानचित्रण अद्वितीय नहीं है। इस सवाल के कई अन्य समाधान हैं।

उदाहरण के लिए, इस मानचित्रण भी काम करेंगे

यू = एक्स √ (x² + y² - x²y²)/√ (x² + y²)

वी = y √ (x² + y² - x²y²)/√ (x² + y²)

जहां (यू, वी) परिपत्र डिस्क निर्देशांक और (एक्स, वाई) वर्ग निर्देशांक हैं कर रहे हैं।

एक तस्वीर हजारों शब्दों के लायक है, इसलिए मैपिंग और इसके विपरीत की गैर विशिष्टता को चित्रित करने के लिए यहां कुछ छवियां दी गई हैं।

circular Brady bunch


squared Boston Celtics

इस मैपिंग की For a C++ implementation, जाने के लिए
http://squircular.blogspot.com/2015/09/fg-squircle-mapping.html
मानचित्रण परिणामों के अधिक छवियों के लिए http://squircular.blogspot.com देखें।

सबूत और व्युत्पन्न के साथ विभिन्न मैपिंग समीकरणों पर चर्चा करने वाले पेपर के लिए "Analytical Methods for Squaring the Disc" भी देखें।

+0

अच्छा। आपने आंकड़े कैसे उत्पन्न किए (भाषा/पुस्तकालय)? – Praxeolitic

+1

मैंने सी ++ में एक साधारण छवि प्रसंस्करण कार्यक्रम लिखा है जो प्रति पिक्सेल के विभिन्न मैपिंग समीकरणों का उपयोग करता है। नमूना कोड लिंक के लिंक देखें। लिपिंग पीएनजी फाइलों को पढ़ने और लिखने में उपयोगी है –

संबंधित मुद्दे

 संबंधित मुद्दे