एटन और एटैन 2 का उपयोग खेलों में किस लिए किया जाता है?


47

मैं कुछ समझने में कठिनाई आ रहा Math.tan()है और Math.atan()और Math.atan2()

मुझे त्रिकोणमिति का बुनियादी ज्ञान है लेकिन खेल विकास के लिए SIN, COS और TAN आदि का उपयोग मेरे लिए बहुत नया है।

मैं कुछ ट्यूटोरियल पर पढ़ रहा हूं और मैं देखता हूं कि स्पर्शरेखा का उपयोग करके हम उस कोण को प्राप्त कर सकते हैं जिसमें एक वस्तु को घुमाया जाना चाहिए ताकि उदाहरण के लिए किसी अन्य वस्तु का सामना करना पड़े। तो हमें अभी भी atan या atan2 का उपयोग करने की आवश्यकता क्यों है?


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

5
आपको निश्चित रूप से उन फ़ंक्शन के पीछे गणित / ज्यामिति को समझने की आवश्यकता है; एक बार जब आप उन्हें मास्टर कर लेते हैं, तो वे आपकी "दुनिया की समझ" का एक हिस्सा बन जाएंगे, जैसे कि मूल व्याकरण जिसे आप बोलने के लिए हर रोज इस्तेमाल करते हैं। एक बार जब आप "गणित / ज्यामिति बोलने के लिए" सक्षम हो जाते हैं, तो आप देखेंगे कि उन कार्यों को परिणाम प्राप्त करने के लिए simpy उपकरण हैं, उपयोग करने के लिए सबसे प्राकृतिक।
FxIII

वे ट्यूटोरियल गलत हैं या आप गलत समझे हैं। आप एक वस्तु से दूसरी वस्तु पर कोण प्राप्त करने के लिए atan2 () का उपयोग करते हैं। उस काम को नीचे कैसे समझाया गया है।
१२:३h बजे

उत्तर के लिए लोगों को धन्यवाद, अब
व्यक्त करते हैं

जवाबों:


93

स्पर्शरेखा सूत्र यह है:

tan(angle) = opposite/adjacent

इस ड्राइंग का संदर्भ लें:

एक समकोण त्रिभुज का आरेख, एक कोण थीटा और इसके विपरीत और आसन्न पक्षों के साथ चिह्नित है

जहां aबगल वाला पक्ष है, oविपरीत पक्ष है और thetaकोण है। इसी तरह, साइन और कोसाइन पाप हैं (कोण) = ओ / एच और कॉस (कोण) = ए / एच जहां hलंबे पक्ष हैं: http://www.mathwords.com/s/sohcahtoa.htm

इस बीच atan( चाप-स्पर्शक के लिए छोटा , व्युत्क्रम स्पर्शरेखा के रूप में भी जाना जाता है ) इसके विपरीत है tan, जैसे:

atan(opposite/adjacent) = angle

इस प्रकार, यदि आप विपरीत और आसन्न दोनों पक्षों के मूल्यों को जानते हैं (उदाहरण के लिए, माउस निर्देशांक से ऑब्जेक्ट के निर्देशांक को घटाकर) तो आप कोण का मान प्राप्त कर सकते हैं atan

खेल के विकास में, यह काफी बार हो सकता है कि आसन्न पक्ष 0 के बराबर है (उदाहरण के लिए एक वेक्टर का x निर्देशांक 0)। यह याद रखना कि tan(angle) = opposite/adjacentविनाशकारी विभाजन-दर-शून्य त्रुटि की क्षमता स्पष्ट होनी चाहिए। इसलिए बहुत सारे पुस्तकालय एक फ़ंक्शन की पेशकश करते हैं atan2, जिसे कहा जाता है , जो आपको xऔर yमापदंडों दोनों को निर्दिष्ट करने की अनुमति देता है , ताकि आपके लिए शून्य से विभाजन न हो और सही क्वाड्रेंट में एक कोण दे।

atan2 आरेख

(चित्र के सौजन्य से चित्र, कृपया अपना उत्तर भी लिखें)


खेल के विकास में त्रिकोणमिति का उपयोग बहुत आम है, विशेष रूप से वैक्टर के साथ, लेकिन आमतौर पर पुस्तकालय आपके लिए त्रिकोणमिति का काम छिपाते हैं। आप बहुत सारे कार्यों के लिए पाप / कोस / टैन का उपयोग कर सकते हैं जिसमें त्रिकोण से मान खोजने के लिए ज्यामितीय जोड़तोड़ शामिल हैं। आयत त्रिकोण के अन्य मूल्यों को खोजने के लिए आपको बस 3 मान (साइड लेंग्थ / एंगल वैल्यू) चाहिए, इसलिए यह काफी उपयोगी है।

तुम भी एक खेल में विशेष व्यवहार के लिए साइन और कोसाइन कार्यों के "साइकलिंग" प्रकृति का उपयोग कर सकते हैं, उदाहरण के लिए मैंने देखा है कि एक वस्तु को एक दूसरे के चारों ओर मोड़ने के लिए बहुत अधिक उपयोग किया जाता है।


8
यह ध्यान देने योग्य है कि विकिपीडिया Atan2 के लिए अन्य उपयोगों का वर्णन करता है ( atan नहीं ) केवल शून्य द्वारा विभाजन से बचने की तुलना में। मिसाल के तौर पर, यह इस्तेमाल किए जा रहे क्वाड्रेंट के लिए खुद को सही करता है, जहां आमतौर पर आपको वह सब करना पड़ता है जो आप खुद करते हैं।
doppelgreener

दरअसल, बहुत महत्वपूर्ण नोट वहीं। मेरे उत्तर को अपडेट करना।
जेसी इमोंड

क्या आपको अपने पहले लंबे पैराग्राफ में टैन और एटन पीछे नहीं मिला था? आप कोण (यानी समीकरण को उल्टा करें) और पक्षों के अनुपात को प्राप्त करने के लिए टैन का उपयोग करेंगे (यानी समीकरण क्या कहता है)।
झूलते हुए

यदि आप जानते हैं कि ओ / ए उदाहरण के लिए 3 के बराबर है, तो यदि आप कोण को आप एटैन (3) करना चाहते हैं, तो मेरा यही मतलब है: यदि आप कोण को अलग करना चाहते हैं, तो आप अनुपात पर एटैन का उपयोग करते हैं। यदि आप अनुपात को अलग करना चाहते हैं, तो आप कोण पर टैन का उपयोग करते हैं।
जेसी इमोंड

मैं आपका शब्द बदल दूंगा, क्योंकि ऐसा लगता है कि आप इसके विपरीत कह रहे थे।
झूल

63

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


1
क्या यह इस आरेख में शीर्ष उत्तर को संपादित करने के लिए अयोग्य होगा? यह आरेख महान है और जेनी के एटान 2 () के लिखित स्पष्टीकरण के ठीक बाद फिट होगा।
बजे

1
आगे बढ़ो: मेरे मेहमान बनो! आपके द्वारा किए जाने के बाद मैं इस उत्तर को हटा दूंगा।
गारेथ रीस

7
नहीं नहीं। कीप आईटी उप! इसका श्रेय जाता है और लोगों को अभी भी यहां आरेख के लिए उत्थान करना चाहिए।
जेसी इमोंड

12

यहाँ ट्रिगर कार्यों के बारे में सोचने का थोड़ा अलग तरीका है - जिसमें atan () और atan2 () शामिल हैं - जो मुझे सहायक लगते हैं ("विपरीत / आसन्न" के संदर्भ में स्पष्टीकरण बस मुझे किसी कारण से भ्रमित करते हैं)।

x, y, r, थीटा

आप एक्स इकाइयों को क्षैतिज रूप से और y इकाइयों को लंबवत ( आयताकार या कार्टेशियन निर्देशांक कहा जाता है ) या at के कोण पर दूरी आर ( 2 डी में ध्रुवीय निर्देशांक) कहकर चलती है ।

कहें कि हमारे पास एक ध्रुवीय समन्वय है (r, have) और हम इसे (x, y) में बदलना चाहते हैं।

cos (lies) आपको x अक्ष के साथ स्थित r का अनुपात देता है:

  • यदि r = 1 है तो x = cos ( x )।
  • यदि r = 100 तो x = 100 * cos (x)।
  • सामान्य x = r * cos (Ɵ) में।

इसी तरह पाप (Ɵ) आपको y अक्ष के साथ r का अनुपात देता है:

  • यदि r = 1 तो y = sin ( y )।
  • यदि r = 100 तो y = 100 * पाप (y)।
  • सामान्य तौर पर y = r * sin (*)।

आयताकार समन्वय (x, y) को ध्रुवीय समन्वय (r, ting) में बदलने के बारे में कैसे?

आर सही त्रिकोण द्वारा गठित की कर्ण है x और y , तो:

  • r = sqrt (x x + y y)

टैन (over) ढलान देता है - रन पर वृद्धि - लंबाई आर के साथ लाइन का । इसलिए:

  • tan (Ɵ) = y / x
  • (= अतन (y / x)

हालांकि, y / x का प्रदर्शन करते समय, 3/4 की गणना करने पर -3 / -4 की गणना के समान उत्तर मिलता है। इसी तरह -3/4 3 / -4 के समान उत्तर देता है। इसलिए हमारे पास atan2 (y, x) है जो व्यक्तिगत संकेतों को सही ढंग से संभालता है और एक विभाजन-दर-शून्य / अनंत त्रुटि को रोकता है।

  • 2 = atan2 (y, x)

4

जेसी और सिड मूल रूप से सही हैं, लेकिन मुझे संदेह है कि समस्या में अंतर्दृष्टि के बाद आप वास्तव में हैं।

Atan2 () की जरूरत है क्योंकि atan () आपको क्षैतिज से कोण को नहीं बताता है जो आपको चाहिए क्योंकि यह क्वाड्रंट्स के साथ सामना नहीं करता है।

इसका मतलब है कि वैक्टर (-2,2) और (2, -2) के लिए एटैन का उपयोग करने पर समान मूल्य मिलेगा। फिर आपको अपने तर्कों के संकेत पर स्विच करना होगा और परिणाम में pi जोड़ना होगा। इसके अलावा, आपके पास जेसी का उल्लेख करने के लिए शून्य विशेष मामले द्वारा विभाजित है। जब एक्स 0 के करीब होता है तो एटैन 2 () एटैन से बेहतर काम करता है

तो आप अगर आप -pi और पी के बीच एक वेक्टर का कोण चाहते हैं

x = -2
y = 2
angle = Math.Atan2(y, x)

या

x = -2
y = 2
angle = calculateAngle(y, x);

double CalculateAngle(double y, double x)
{
    double angle = 0;
    if (x == 0)
    {
        if (y == 0)
            angle = 0;
        else if (y > 0)
            angle = Math.PI/2;
        else
            angle = -Math.PI/2;
    }
    else
    {
        angle = Math.Atan(y/x);
        if (x < 0)
        {
            if (y > 0)
            {
                angle += Math.PI;
            }
            else if (y < 0)
            {
                angle -= Math.PI;
            }
            else
            {
                angle = Math.PI;
            }
        }
    }
    return angle;
}

1
"इसका मतलब है कि वैक्टर (-2,2) और (2,2) के लिए एटैन का उपयोग करने से समान मूल्य मिलेगा।" यदि यह मामला है, तो आपका एटन अविश्वसनीय रूप से टूट गया है, क्योंकि उनमें से एक होना चाहिए -π / 4 और दूसरा 4/4। इस कचरे को वोट करने वाले सभी पर शर्म करो।

कोड अभी भी गलत है। y==0तब आप xदूसरी शाखा में विभाजित करके परीक्षण कर रहे हैं ।
सैम होसेवर

0

मैं कुछ चीजों को संक्षिप्त तरीके से स्पष्ट करूंगा। कृपया विस्तृत विवरण के लिए त्रिकोणमिति ट्यूटोरियल को ऑनलाइन देखें।

चलो एक कोण बनो। फिर तान (a) = tan (a + 2 * pi)।

atan टैन इनवर्स है, यानी आपको टैन दिए गए कोण देता है। जब आप अतन (तन (a + 2 * pi)) कहते हैं, तो उत्तर a होगा। यह आपके आवेदन के लिए अपर्याप्त होगा।

atan2 इस सटीक स्थितियों की मदद के लिए 2 तर्क देगा। atan x और y लेता है, जो मूल रूप से cos (a) और sin (a) हैं।

atan2 (sin (a), cos (a) = a atan2 (sin (a + 2 * pi), cos (a + 2 * pi)) = a + 2 * pi / * sin और cos के अलग-अलग संकेत होते हैं, जिससे अग्रणी एक अलग उत्तर के लिए * /

कृपया इस तरह से क्यों है, यह समझाने के लिए कुछ ट्यूटोरियल खोजें।

आपका कोड कुछ इस तरह होना चाहिए:

if (mouseMoved)
{
  double angle = atan2(mousey - objecty, mousex - objectx);

  object. setTransform to Rotate(angle);

  // If you want to print it
  print radian_to_degrees(angle); // Because angle is in radian 360 degrees = 2*Pi radians
}

tan(a) = - tan(-a)आप जिस समीकरण को व्यक्त करना चाहते थे वह शायद थाtan(a) = tan(pi+a)
Ali1S232

0

atan2मेरे कोड में पाया गया एक उपयोग "हस्ताक्षरित कोण" है।

आम तौर पर जिस तरह से आपको दो वैक्टर के बीच का कोण मिलेगा

inline float angleWith( const Vector2f& o ) const
{
    return acosf( this->normalizedCopy().dot(o.normalizedCopy()) ) ;
}

लेकिन यह आपको नहीं बताता है कि कौन सा "लीड" है (यानी दूसरे की तुलना में "आगे दक्षिणावर्त" है)। यह जानकारी जेस्चर ट्रैकिंग के लिए महत्वपूर्ण हो सकती है।

आप (1,0)दोनों वैक्टरों के लिए एक्स अक्ष से कोण पा सकते हैं , लेकिन अस्पष्टता की यह बहुत ही खराब समस्या है: 315 डिग्री के कोण के साथ एक वेक्टर cosऊपर की विधि का उपयोग करके 45 डिग्री लौटाता है, और इसलिए 45 डिग्री का कोण होता है। आप yइसे ठीक करने के लिए साइन चेक कर सकते थे, या आप उपयोग कर सकते थे atan2

// Returns + if this leads o.
// more expensive than unsigned angle.
inline float signedAngleWith( const Vector2f& o ) const
{
  float aThis = atan2f( y, x );
  float aO = atan2f( o.y, o.x ) ;
  return aThis - aO ;
}

0

कृपया ध्यान दें कि एटान टूटा नहीं है। आर्कन या टैन इनवर्स केवल -PI / 2 और PI / 2 के बीच एक फंक्शन है। यह इस पैटर्न को दोहराता है लेकिन फिर यह एक फ़ंक्शन नहीं है जो कंप्यूटर के लिए एक समस्या है क्योंकि यह कई उत्तरों को संभाल नहीं पाता है।

यह पीआई / 2 और पीआई / 2 के बीच असिन और 0 और पीआई के बीच एको के लिए समान है। किसी फ़ंक्शन को होने के लिए ये सबसे सरल श्रेणियां हैं। एटैन और असिन के लिए यह सबसे नकारात्मक से अपने सबसे सकारात्मक तक जाता है। एकोस के लिए यह अपने सबसे पॉजिटिव से अपने सबसे निगेटिव में जाता है। (यह अधिक सटीक उत्तरों को प्रक्षेपित करने में सहायता करता है)

इसलिए एसिन, एकोस और एटान गणितीय कार्य हैं।

atan2 हालांकि प्रोग्रामिंग के लिए बहुत अधिक उपयोगी है क्योंकि यह पूर्ण क्रांति (रेडियन या 360 डिग्री या 400 ग्रेडियन में पीआई) प्रदान करता है। ध्यान दें कि उन्होंने केवल पाप या कॉस के लिए नहीं तन के लिए उत्पादन किया है। टैन एकमात्र ऐसा है जो क्षैतिज और ऊर्ध्वाधर (x, y) का उपयोग करता है

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