C ++ में atan और atan2 में क्या अंतर है?


जवाबों:


131

std::atan2सभी चार चतुर्भुजों के अभिजात वर्ग की गणना करने की अनुमति देता है। std::atanकेवल चतुर्भुज 1 और 4 से गणना करने की अनुमति देता है।


322

स्कूल के गणित से हम जानते हैं कि स्पर्शरेखा की परिभाषा है

tan(α) = sin(α) / cos(α)

और हम कार्यों के लिए आपूर्ति करने वाले कोण के आधार पर चार चतुर्थांशों के बीच अंतर करते हैं। के संकेत sin, cosऔर tanनिम्नलिखित संबंध हैं (जहां हम सटीक गुणकों की उपेक्षा करते हैं π/2):

  Quadrant    Angle              sin   cos   tan
-------------------------------------------------
  I           0    < α < π/2      +     +     +
  II          π/2  < α < π        +     -     -
  III         π    < α < 3π/2     -     -     +
  IV          3π/2 < α < 2π       -     +     -

यह देखते हुए कि मूल्य tan(α)सकारात्मक है, हम अंतर नहीं कर सकते हैं, चाहे कोण पहले या तीसरे चतुर्थांश से था और यदि यह नकारात्मक है, तो यह दूसरे या चौथे चतुर्थांश से आ सकता है। तो सम्मेलन द्वारा, मूल atan()या चौथे चतुर्थांश (यानी -π/2 <= atan() <= π/2) से एक कोण देता है , मूल इनपुट की परवाह किए बिना।

पूरी जानकारी वापस पाने के लिए, हमें विभाजन के परिणाम का उपयोग नहीं करना चाहिए, sin(α) / cos(α)लेकिन हमें साइन और कोसाइन के मूल्यों को अलग-अलग देखना होगा। और यही atan2()करता है। यह दोनों, ले जाता है sin(α)और cos(α)और जोड़कर सभी चार चतुर्थ भाग निराकरण πके परिणाम के atan()लिए जब भी कोज्या नकारात्मक है।

टिप्पणी:atan2(y, x) समारोह वास्तव में एक लेता है yऔर एक xतर्क है, जो लंबाई के साथ एक वेक्टर के प्रक्षेपण है vऔर कोण αy- पर और x- अक्ष, यानी

y = v * sin(α)
x = v * cos(α)

जो संबंध देता है

y/x = tan(α)

निष्कर्ष: atan(y/x) कुछ जानकारी को वापस रखा गया है और केवल यह मान सकते हैं कि इनपुट क्वाड्रंट I या IV से आया है। इसके विपरीत, atan2(y,x)सभी डेटा प्राप्त करता है और इस प्रकार सही कोण को हल कर सकता है।


3
एक छोटा विवरण, श्रेणी में -π/2 <= atan() <= π/2वास्तव में pi/2चतुर्थांश II से एक बिंदु ( ) शामिल है ।
जेड बोसोन

28

उल्लेख करने के लिए एक और बात यह है कि atan2जब अभिव्यक्ति की तरह स्पर्शरेखा की गणना की जाती है तो यह अधिक स्थिर होती है atan(y / x)और x0 या करीब 0 होती है।


दिलचस्प है, क्या आपके पास इसके लिए एक स्रोत है? क्या यह सामान्य रूप से सही है या सिर्फ C ++ के लिए?
गेरार्ड

26

वास्तविक मूल्य रेडियन में हैं, लेकिन उन्हें डिग्री में व्याख्या करने के लिए यह होगा:

  • atan = -90 और 90 के बीच का कोण मान देता है
  • atan2 = -180 और 180 के बीच कोण मूल्य देता है

मेरे काम के लिए जिसमें विभिन्न कोणों की गणना शामिल है जैसे कि नेविगेशन में शीर्षक और असर, atan2ज्यादातर मामलों में काम करता है।


12

atan (x) रेडियन में व्यक्त x के चाप स्पर्शक के मुख्य मूल्य को लौटाता है।

atan2 (y, x) रेडियन में व्यक्त y / x के चाप स्पर्श के प्रमुख मूल्य को लौटाता है।

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


3
atan2 (x, y) -> atan2 (y, x)
यशराज

सिद्धांत मानों की श्रेणी है (-pi,pi]लेकिन atan2 श्रृंखला है [-pi,pi]तो यह एक अतिरिक्त मूल्य शामिल -piअन्य शाखा से की वजह से atan2(-0.0,x)के लिए x<0
Z बोसोन

4

मुझे लगता है कि मुख्य प्रश्न यह पता लगाने की कोशिश करता है: "मुझे एक या दूसरे का उपयोग कब करना चाहिए", या "मुझे किसका उपयोग करना चाहिए", या "क्या मैं सही का उपयोग कर रहा हूं"?

मुझे लगता है कि महत्वपूर्ण बिंदु यह है कि केवल समय-दूरी वाले वैक्टर की तरह एक सही-दिशा में वक्र में सकारात्मक मूल्यों को खिलाने का इरादा था। Cero हमेशा नीचे बाईं ओर है, और थिग्स केवल ऊपर और दाएं जा सकते हैं, बस धीमे या तेज। atan नकारात्मक संख्या नहीं लौटाता है, इसलिए आप इसके परिणाम को जोड़ / घटाकर स्क्रीन पर 4 दिशाओं में चीजों को ट्रेस नहीं कर सकते।

atan2 की उत्पत्ति मध्य में होना है, और चीजें पीछे या नीचे जा सकती हैं। यही कारण है कि आप एक स्क्रीन प्रतिनिधित्व में उपयोग करेंगे, क्योंकि यह बात करता है कि आप किस दिशा में वक्र जाना चाहते हैं। इसलिए atan2 आपको नकारात्मक संख्या दे सकता है, क्योंकि इसका सेरो केंद्र में है, और इसका परिणाम कुछ है जिसका उपयोग आप 4 दिशाओं में चीजों का पता लगाने के लिए कर सकते हैं।


2

Atan2 के साथ आप यहां बताए गए चतुर्थांश को निर्धारित कर सकते हैं

यदि आपको क्वाड्रेंट निर्धारित करने की आवश्यकता है, तो आप atan2 का उपयोग कर सकते हैं।


2

एक समकोण त्रिभुज पर विचार करें। हम कर्ण r, क्षैतिज पक्ष y और ऊर्ध्वाधर पक्ष x लेबल करते हैं। ब्याज α का कोण x और r के बीच का कोण है।

सी ++ atan2(y, x)हमें रेडियन में कोण α का मान देगा। atanउपयोग किया जाता है अगर हम केवल व्यक्तिगत रूप से y / x में रुचि रखते हैं या नहीं जानते हैं। तो अगर p = y / x तो α प्राप्त करने के लिए हम उपयोग करेंगे atan(p)

आप atan2क्वाड्रेंट को निर्धारित करने के लिए उपयोग नहीं कर सकते हैं, आप atan2केवल तभी उपयोग कर सकते हैं जब आप पहले से जानते हों कि आपका कौन सा क्वाड्रेंट है! विशेष रूप से सकारात्मक x और y का अर्थ है पहला चतुर्थांश, सकारात्मक y और ऋणात्मक x, दूसरा और इसी तरह। atanया atan2खुद को केवल एक सकारात्मक या नकारात्मक संख्या लौटाएं, इससे ज्यादा कुछ नहीं।


4
यदि आपके पास है p=y/xतो आप अभी भी उपयोग कर सकते हैं atan2(p,1)
मार्क रैनसम

0

नीचे मेहरवॉल्फ सही है, लेकिन यहां एक अनुमान है जो मदद कर सकता है:

यदि आप एक 2-आयामी समन्वय प्रणाली में काम कर रहे हैं, जो अक्सर उलटा स्पर्शरेखा की प्रोग्रामिंग के लिए होता है, तो आपको निश्चित रूप से atan2 का उपयोग करना चाहिए। यह कोणों की पूरी 2 पाई रेंज देगा और आपके लिए x समन्वय में शून्य का ध्यान रखेगा।

यह कहने का एक और तरीका है कि अतन (y / x) वस्तुतः हमेशा गलत है। यदि तर्क को y / x के रूप में नहीं सोचा जा सकता है, तो केवल atan का उपयोग करें।


0

atan2(y,x)आम तौर पर उपयोग किया जाता है यदि आप कार्टेशियन निर्देशांक को ध्रुवीय निर्देशांक में बदलना चाहते हैं। यह आपको कोण देगा, जबकि sqrt(x*x+y*y), या यदि उपलब्ध हो, तो hypot(y,x)आपको आकार देगा।

atan(x)बस तन का विलोम है। कष्टप्रद मामले में आपको atan(y/x)इसलिए उपयोग करना होगा क्योंकि आपका सिस्टम प्रदान नहीं करता है atan2, आपको सही कोण प्राप्त करने के लिए xऔर y, और इसके संकेतों के लिए अतिरिक्त जांच करनी होगी x=0

नोट: atan2(y,x) के सभी वास्तविक मूल्यों के लिए परिभाषित किया गया है yऔर xजब दोनों बहस शून्य हैं, स्थिति को छोड़कर।


0

Atan2 में, उत्पादन होता है: -pi< atan2(y,x)< pi
और में atan, उत्पादन होता है: -pi/2< atan(y/x)< pi/2 // यह तिमाही विचार नहीं खुराक।
आप उन्मुखीकरण के बीच प्राप्त करना चाहते हैं 0और 2*pi(उच्च विद्यालय के गणित), हमें atan2 उपयोग करने की आवश्यकता और ऋणात्मक मानों के लिए जोड़ने 2*piके बीच अंतिम परिणाम प्राप्त करने के लिए 0और 2*pi
यह स्पष्ट रूप से समझाने के लिए जावा स्रोत कोड है:

System.out.println(Math.atan2(1,1)); //pi/4 in the 1st quarter
System.out.println(Math.atan2(1,-1)); //(pi/4)+(pi/2)=3*(pi/4) in the 2nd quarter

System.out.println(Math.atan2(-1,-1 ));//-3*(pi/4) and it is less than 0.
System.out.println(Math.atan2(-1,-1)+2*Math.PI); //5(pi/4) in the 3rd quarter

System.out.println(Math.atan2(-1,1 ));//-pi/4 and it is less than 0.
System.out.println(Math.atan2(-1,1)+2*Math.PI); //7*(pi/4) in the 4th quarter

System.out.println(Math.atan(1 ));//pi/4
System.out.println(Math.atan(-1 ));//-pi/4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.