जवाबों:
std::atan2
सभी चार चतुर्भुजों के अभिजात वर्ग की गणना करने की अनुमति देता है। std::atan
केवल चतुर्भुज 1 और 4 से गणना करने की अनुमति देता है।
स्कूल के गणित से हम जानते हैं कि स्पर्शरेखा की परिभाषा है
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)
सभी डेटा प्राप्त करता है और इस प्रकार सही कोण को हल कर सकता है।
उल्लेख करने के लिए एक और बात यह है कि atan2
जब अभिव्यक्ति की तरह स्पर्शरेखा की गणना की जाती है तो यह अधिक स्थिर होती है atan(y / x)
और x
0 या करीब 0 होती है।
वास्तविक मूल्य रेडियन में हैं, लेकिन उन्हें डिग्री में व्याख्या करने के लिए यह होगा:
atan
= -90 और 90 के बीच का कोण मान देता हैatan2
= -180 और 180 के बीच कोण मूल्य देता हैमेरे काम के लिए जिसमें विभिन्न कोणों की गणना शामिल है जैसे कि नेविगेशन में शीर्षक और असर, atan2
ज्यादातर मामलों में काम करता है।
atan (x) रेडियन में व्यक्त x के चाप स्पर्शक के मुख्य मूल्य को लौटाता है।
atan2 (y, x) रेडियन में व्यक्त y / x के चाप स्पर्श के प्रमुख मूल्य को लौटाता है।
ध्यान दें कि साइन अस्पष्टता के कारण, एक फ़ंक्शन निश्चितता के साथ निर्धारित नहीं कर सकता है जिसमें कोण केवल अपने स्पर्शरेखा मूल्य (अकेले एटैन) से गिरता है। यदि आपको क्वाड्रेंट निर्धारित करने की आवश्यकता है, तो आप atan2 का उपयोग कर सकते हैं।
(-pi,pi]
लेकिन atan2 श्रृंखला है [-pi,pi]
तो यह एक अतिरिक्त मूल्य शामिल -pi
अन्य शाखा से की वजह से atan2(-0.0,x)
के लिए x<0
।
मुझे लगता है कि मुख्य प्रश्न यह पता लगाने की कोशिश करता है: "मुझे एक या दूसरे का उपयोग कब करना चाहिए", या "मुझे किसका उपयोग करना चाहिए", या "क्या मैं सही का उपयोग कर रहा हूं"?
मुझे लगता है कि महत्वपूर्ण बिंदु यह है कि केवल समय-दूरी वाले वैक्टर की तरह एक सही-दिशा में वक्र में सकारात्मक मूल्यों को खिलाने का इरादा था। Cero हमेशा नीचे बाईं ओर है, और थिग्स केवल ऊपर और दाएं जा सकते हैं, बस धीमे या तेज। atan नकारात्मक संख्या नहीं लौटाता है, इसलिए आप इसके परिणाम को जोड़ / घटाकर स्क्रीन पर 4 दिशाओं में चीजों को ट्रेस नहीं कर सकते।
atan2 की उत्पत्ति मध्य में होना है, और चीजें पीछे या नीचे जा सकती हैं। यही कारण है कि आप एक स्क्रीन प्रतिनिधित्व में उपयोग करेंगे, क्योंकि यह बात करता है कि आप किस दिशा में वक्र जाना चाहते हैं। इसलिए atan2 आपको नकारात्मक संख्या दे सकता है, क्योंकि इसका सेरो केंद्र में है, और इसका परिणाम कुछ है जिसका उपयोग आप 4 दिशाओं में चीजों का पता लगाने के लिए कर सकते हैं।
एक समकोण त्रिभुज पर विचार करें। हम कर्ण r, क्षैतिज पक्ष y और ऊर्ध्वाधर पक्ष x लेबल करते हैं। ब्याज α का कोण x और r के बीच का कोण है।
सी ++ atan2(y, x)
हमें रेडियन में कोण α का मान देगा।
atan
उपयोग किया जाता है अगर हम केवल व्यक्तिगत रूप से y / x में रुचि रखते हैं या नहीं जानते हैं। तो अगर p = y / x तो α प्राप्त करने के लिए हम उपयोग करेंगे atan(p)
।
आप atan2
क्वाड्रेंट को निर्धारित करने के लिए उपयोग नहीं कर सकते हैं, आप atan2
केवल तभी उपयोग कर सकते हैं जब आप पहले से जानते हों कि आपका कौन सा क्वाड्रेंट है! विशेष रूप से सकारात्मक x और y का अर्थ है पहला चतुर्थांश, सकारात्मक y और ऋणात्मक x, दूसरा और इसी तरह। atan
या atan2
खुद को केवल एक सकारात्मक या नकारात्मक संख्या लौटाएं, इससे ज्यादा कुछ नहीं।
p=y/x
तो आप अभी भी उपयोग कर सकते हैं atan2(p,1)
।
नीचे मेहरवॉल्फ सही है, लेकिन यहां एक अनुमान है जो मदद कर सकता है:
यदि आप एक 2-आयामी समन्वय प्रणाली में काम कर रहे हैं, जो अक्सर उलटा स्पर्शरेखा की प्रोग्रामिंग के लिए होता है, तो आपको निश्चित रूप से atan2 का उपयोग करना चाहिए। यह कोणों की पूरी 2 पाई रेंज देगा और आपके लिए x समन्वय में शून्य का ध्यान रखेगा।
यह कहने का एक और तरीका है कि अतन (y / x) वस्तुतः हमेशा गलत है। यदि तर्क को y / x के रूप में नहीं सोचा जा सकता है, तो केवल atan का उपयोग करें।
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
जब दोनों बहस शून्य हैं, स्थिति को छोड़कर।
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
-π/2 <= atan() <= π/2
वास्तव मेंpi/2
चतुर्थांश II से एक बिंदु ( ) शामिल है ।