সি ++ তে আতান এবং আতান 2 এর মধ্যে পার্থক্য কী?


157

সি ++ এর মধ্যে atanএবং পার্থক্য কী atan2?

উত্তর:



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চতুর্ভুজ দ্বিতীয় থেকে একটি পয়েন্ট ( ) অন্তর্ভুক্ত ।
জেড বোসন

28

আরেকটি বিষয় উল্লেখ করতে হবে তা atan2হ'ল স্থিতিশীল হয় যখন স্পর্শের মতো ব্যবহার করে স্পর্শকীকরণগুলি গণনা করা হয় atan(y / x)এবং x0 বা 0 এর কাছাকাছি হয়।


আকর্ষণীয়, আপনার কি এটির জন্য উত্স আছে? এটি সাধারণভাবে বা কেবল সি ++ এর জন্য সত্য?
জেরার্ড

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)
Yesraaj

নীতি মান পরিসীমা (-pi,pi]কিন্তু ATAN2 পরিসর আছে [-pi,pi]তাই এটি এক অতিরিক্ত মান অন্তর্ভুক্ত -piঅন্য শাখা থেকে কারণে atan2(-0.0,x)জন্য x<0
জেড বোসন 11

4

আমার ধারণা মূল প্রশ্নটি বের করার চেষ্টা করেছে: "কখন আমি একটি বা অন্যটি ব্যবহার করব", বা "যা ব্যবহার করা উচিত", বা "আমি কি সঠিকটি ব্যবহার করছি"?

আমি অনুমান করি যে গুরুত্বপূর্ণ পয়েন্টটি হ'ল আতান কেবল সময়-দূরত্বের ভেক্টরগুলির মতো ডান-উপরের দিকের বক্ররেখায় ইতিবাচক মানগুলি খাওয়ানো হয়েছিল। সিરો সর্বদা বাম দিকে নীচে থাকে এবং থিগগুলি কেবল উপরের এবং ডানদিকে যেতে পারে, কেবল ধীর বা দ্রুত। আতান নেতিবাচক সংখ্যাগুলি ফেরায় না, সুতরাং আপনি কেবল তার ফলাফল যুক্ত / বিয়োগ করে কোনও পর্দার 4 দিকের মধ্যে জিনিসগুলি ট্রেস করতে পারবেন না।

অ্যাটান 2 মূলটি মাঝখানে হওয়ার জন্য তৈরি করা হয় এবং জিনিসগুলি পিছনে বা নীচে যেতে পারে। এটি আপনি পর্দার উপস্থাপনায় ব্যবহার করবেন, কারণ আপনি বক্ররেখাটি যে দিকে যেতে চান তা বিবেচ্য। সুতরাং অ্যাটান 2 আপনাকে নেতিবাচক সংখ্যা দিতে পারে, কারণ এর সেরোটি কেন্দ্রে রয়েছে এবং এর ফলাফল এমন একটি জিনিস যা আপনি 4 টি দিকে জিনিসগুলি ট্রেস করতে ব্যবহার করতে পারেন।


2

Atan2 এর সাহায্যে আপনি এখানে বর্ণিত চতুষ্কোণ নির্ধারণ করতে পারেন ।

চতুর্ভুজ নির্ধারণ করার প্রয়োজন হলে আপনি atan2 ব্যবহার করতে পারেন।


2

একটি সমকোণী ত্রিভুজ বিবেচনা করুন। আমরা অনুভূতি r, অনুভূমিক দিকের y এবং উল্লম্ব পার্শ্ব x লেবেল করি। আগ্রহের কোণ x হল x এবং r এর মধ্যবর্তী কোণ।

সি ++ atan2(y, x)আমাদের রেডিয়ানগুলিতে কোণ of এর মান দেবে। atanযদি আমরা ব্যক্তিগতভাবে কেবল y / x নয় y এবং x সম্পর্কে আগ্রহী বা আগ্রহী হয় তবে এটি ব্যবহৃত হয়। সুতরাং যদি p = y / x হয় তবে get আমরা ব্যবহার করব atan(p)

atan2কোয়াড্রেন্ট নির্ধারণের জন্য আপনি ব্যবহার করতে পারবেন না , আপনি atan2যদি ইতিমধ্যে জেনে থাকেন যে কোন কোয়াড্রেন্ট আপনার মধ্যে রয়েছে! বিশেষত ধনাত্মক x এবং y বলতে প্রথম চতুর্ভুজ, ধনাত্মক y এবং negativeণাত্মক এক্স, দ্বিতীয় এবং আরও বোঝায়। atanবা atan2তারা কেবল একটি ইতিবাচক বা নেতিবাচক সংখ্যা ফেরত দেয়, এর চেয়ে বেশি কিছুই নয়।


4
আপনার যা কিছু আছে তা p=y/xযদি আপনি এখনও ব্যবহার করতে পারেন atan2(p,1)
মার্ক রান্সম

0

নীচে মেহরল্ফ সঠিক, তবে এখানে একটি হিউরিস্টিক যা সাহায্য করতে পারে:

যদি আপনি একটি দ্বি-মাত্রিক সমন্বয় সিস্টেমে কাজ করছেন যা প্রায়শই বিপরীত স্পর্শক প্রোগ্রামিংয়ের ক্ষেত্রে ঘটে থাকে তবে আপনার অবশ্যই atan2 ব্যবহার করা উচিত। এটি পুরো 2 পাই রেঞ্জের কোণ সরবরাহ করবে এবং আপনার জন্য এক্স কোঅর্ডিনেটে শূন্যগুলির যত্ন নেবে।

এটি বলার আর একটি উপায় হ'ল আতান (y / x) কার্যত সর্বদা ভুল। যুক্তিটিকে y / x হিসাবে ভাবা না হলে কেবল আতান ব্যবহার করুন।


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.