DEV Community

Cover image for atan() এর অভিশাপ এবং atan2() এর কাহিনী: কোডিং জগতে দিশা হারানোর গল্প
RatulAlMamun
RatulAlMamun

Posted on

atan() এর অভিশাপ এবং atan2() এর কাহিনী: কোডিং জগতে দিশা হারানোর গল্প

হ্যালো কোডারস জলদস্যুরা 🏴‍☠️ কোনোদিন কি নিজেকে হারিয়ে ফেলেছো কোডিং সমুদ্রে, শুধু atan() ব্যবহার করে কোণ বের করার চেষ্টা করেছো, আর হতাশ হয়েছো সঠিক দিক খুঁজে না পাওয়ায়। তুমি একা নও। আজ আমরা এক দুঃসাহসিক যাত্রায় যাচ্ছি, যেখানে PHP-তে atan2() নামে গুপ্তধন খুঁজে বের করব। যাত্রাপথে দেখে নেব কেন atan() তোমাকে বিপদে ফেলতে পারে, আর atan2() তোমাকে নিরাপদে বন্দরে পৌঁছে দেবে।

চলো তাহলে যাত্রা শুরু করা যাক। ⛵

কল্পনা করো তোমার কাছে একটা গুপ্তধনের ম্যাপ আছে। ওখানে একটা দ্বীপের কথা বলা আছে, যেটা মানচিত্রের একটি বিন্দুতে (x, y) নেভিগেট করা। তুমি atan() ব্যবহার করতে পারো—কিন্তু থামো! এটা কেবল গল্পের একটা অংশ। atan() তোমাকে সরাসরি ডেভি জোন্সের লকারে বা আরও খারাপ, বাগে ভরা কোডবেসে নিয়ে যেতে পারে। 😱 তাই সঠিক পথ পেতে চাইলে তোমার লাগবে atan2(), এই গল্পের ক্যাপ্টেন জ্যাক স্প্যারো।

atan() এর অভিশাপের গল্প

মোটামোটি সব ল্যাঙ্গুয়েজে এই atan() ফাংশন টি দেখতে পাওয়া যায়। আমরা php নিয়েই আলাপ করি। atan() মূলত অ্যাঙ্গেল হিসাব করার জন্য ব্যবহার করা হয়। কিন্তু এখানে একটা সমস্যা আছে — atan() শুধু y/x এর অনুপাতকেই গুরুত্ব দেয়, কোন কোয়াড্রান্টে তুমি আছো তা নিয়ে বিন্দুমাত্র চিন্তা করে না। তাকে পুরোপুরি বিশ্বাস হয়ে রওনা দিলে হয়তো দেখবে যে তুমি সম্পূর্ণ ভুল দিকে যাচ্ছ।

কেন? কারণ atan() পুরো চিত্রটা দেয় না — এটা কেবল প্রথম কোয়াড্রান্টের সাথে সম্পর্কিত অ্যাঙ্গেলটাই বলে। তার মানে তুমি যখন পশ্চিমে যাচ্ছ, তখন তোমার আসলে পূর্ব দিকে যাত্রা করা উচিত ছিল! অপরদিকে atan2() x এবং y উভয় কো-অর্ডিনেটকে বিবেচনায় নেয়, এবং— একটা ভালো কম্পাসের মতো—ঠিক কোন কোয়াড্রান্টে তুমি আছো তা জানে।

এখন এই ২টার পার্থক্য নিয়ে একটু বিস্তারিত জানা যাক।

atan() এবং atan2() এর পার্থক্য

চলো এবার এটাকে কোডের ভাষায় বলি:

  • atan() y/x এর অনুপাতের আর্কট্যানজেন্ট হিসাব করে, কিন্তু পুরো চিত্রটা জানে না। লক্ষ্যবস্তু কি দ্বিতীয় কোয়াড্রান্টে? তৃতীয়? atan() এর কোনও ধারণা নেই এবং এটা নিয়ে মাথাও ঘামায় না।

atan() ফাংশনের প্যারামিটার হল একটি সংখ্যা, এটি y/x অনুপাতের মান, যেখানে y এবং x দুটি ভেরিয়েবল বা সংখ্যার মান।

 atan(float $num): float
Enter fullscreen mode Exit fullscreen mode
  • অন্যদিকে, atan2() ঠিকমতো জানে যে (x, y) পয়েন্টটা কোথায় আছে এবং যে কোন কোয়াড্রান্টে সঠিক অ্যাঙ্গেল রিটার্ন করে।

atan2() ফাংশনের প্যারামিটার হল ২টি।

  • $y: Y কো-অর্ডিনেটের মান।
  • $x: X কো-অর্ডিনেটের মান।
 atan2(float $y, float $x): float
Enter fullscreen mode Exit fullscreen mode

চলো, একটা উদাহরণ দিয়ে বেপারটা বুঝার চেষ্টা করি।

// $y এবং $x এর মান নির্ধারণ
$y = 5;
$x = -10;

// atan() ব্যবহার - শুধুমাত্র y/x অনুপাত জানে
$angle1 = atan($y / $x);
echo "atan() angle: " . rad2deg($angle1) . " degrees\n";
// Outputs: -26.57 degrees

// atan2() ব্যবহার - $x এবং $y উভয়ই বিবেচনায় নেয়
$angle2 = atan2($y, $x);
echo "atan2() angle: " . rad2deg($angle2) . " degrees\n";
// Outputs: 153.43 degrees
Enter fullscreen mode Exit fullscreen mode

উদাহরণ থেকে দেখতেই পাচ্ছ atan() একটা অ্যাঙ্গেল দিচ্ছে ঠিকই। কিন্তু দিক বলে দিচ্ছে না। অর্থাৎ কোন কোয়াড্রান্টে আছো সেটা বুঝা যাচ্ছে না। অন্যদিকে atan2() ফাঙ্কশন দিয়ে যে ভ্যালুটা পাচ্ছি তা দিয়ে ভালো ভাবেই বুঝা যাচ্ছে যে (x, y) বিন্দুটা ২য় কোয়াড্রান্টে আছে। এখন আমরা সহজেই বুঝতে পারবো কোন দিকে গুপ্তধনের দ্বীপটা আছে।

💡রেডিয়ান বনাম ডিগ্রী (এটি শুধু গণিত নয়, এটি বাঁচার বিষয়!)

PHP এর atan() এবং atan2() ফাংশন তোমাকে রেডিয়ানে একটি অ্যাঙ্গেল দেয়। যা দেখতে কেমন হিজিবিজি! চিন্তার কিছু নেই—এটা কেবল অ্যাঙ্গেল মাপার একটি ভিন্ন পদ্ধতি। মানুষের এবং জলদস্যুদের বুঝার জন্য, আমি এটিকে rad2deg() ফাংশন ব্যবহার করে ডিগ্রীতে রূপান্তর করেছি।

আমার নিজস্ব atan() এবং atan2()

চলো এখন আমরা atan() আর atan2() কে নিজের মতো করে বানানোর চেষ্টা করি, যাতে আরও ভালোভাবে এদের কার্যকলাপ বুঝতে পারি।

⚠️ যদি মনে হয় এটা তোমার মাথার উপর দিয়ে যাচ্ছে, তাহলে এই সেকশনটা টপকে যেতে পারো! 🤪

চলো atan() বানাই

atan() একটি সংখ্যার আর্কট্যানজেন্ট হিসাব করে। এই ফাংশনটি আনুমানিকভাবে বের করার একটি উপায় হলো গ্রেগরির সিরিজ ব্যবহার করা। এখানে একটি সাধারণভাবে ব্যবহৃত সিরিজ রয়েছে atan(z) এর জন্য:

atan(x)n=0(1)nx2n+12n+1 atan(x) \approx \sum_{n=0}^{\infty} \frac{(-1)^n x^{2n+1}}{2n+1}

যেটাকে একটু সোজা করে লিখলে দাঁড়ায় -

atan(x)xx33+x55x77+ atan(x) \approx x - \frac{x^3}{3} + \frac{x^5}{5} - \frac{x^7}{7} + \ldots

এখন চলো এই সিরিজকে কোড এ লিখে ফেলি

function mimic_atan($z) {
    // Use the identity: atan(z) = pi/2 - atan(1/z) if |z| > 1
    if (abs($z) > 1) {
        return ($z > 0 ? M_PI / 2 : -M_PI / 2) - mimic_atan(1 / $z);
    }

    // Taylor series approximation for atan(z) when |z| <= 1
    $result = 0;
    $term = $z;
    $z_squared = $z * $z;

    for ($i = 1; $i < 1000; $i += 2) { // Sum up to a reasonable number of terms
        $result += $term;
        $term *= -$z_squared; // Alternates the sign and increases the power
        $term /= ($i + 2);    // Divides by the next odd number
    }

    return $result;
}

// Example usage
echo mimic_atan(0.5);  // Outputs ~0.463 radians (26.57 degrees)
Enter fullscreen mode Exit fullscreen mode

চলো atan2() বানাই

atan2() বানাতে এখন আমরা atan() ফাঙ্কশনটাই ব্যবহার করবো। শুধু সঠিক কোয়াড্রান্ট চিহ্নিত করাটাই এই ফাঙ্কশনের প্রধান কাজ। তো আর দেরি কেন চলো লিখে ফেলি -

function mimic_atan2($y, $x) {
    if ($x > 0) {
        return mimic_atan($y / $x);
    } elseif ($x < 0 && $y >= 0) {
        return mimic_atan($y / $x) + M_PI;
    } elseif ($x < 0 && $y < 0) {
        return mimic_atan($y / $x) - M_PI;
    } elseif ($x == 0 && $y > 0) {
        return M_PI / 2;
    } elseif ($x == 0 && $y < 0) {
        return -M_PI / 2;
    } else {
        return 0;  // Undefined case where both x and y are 0
    }
}

// Example usage
$y = 5;
$x = -10;
echo mimic_atan2($y, $x);  // Outputs ~2.677 radians (153.43 degrees)
Enter fullscreen mode Exit fullscreen mode

সোজা কোথায় পুরা ঘটনা বলি এখন

এখন আমরা চারটি কোয়াড্রান্ট ফলাফল দেখে নিচ্ছি এবং প্রতিটি কোয়াড্রান্ট ব্যাখ্যা করছি:

  • প্রথম কোয়াড্রান্ট (Quadrant I): যখন x=10x = 10 এবং y=5y = 5 তখন atan($y / $x) 26.57 ডিগ্রি এবং atan2($y, $x) 26.56 ডিগ্রি। এখানে উভয় ক্ষেত্রেই এটি প্রথম কোয়ার্টারে রয়েছে।
  • দ্বিতীয় কোয়াড্রান্ট (Quadrant II): যখন x=10x = -10 এবং y=5y = 5 তখন atan($y / $x) -26.57 ডিগ্রি এবং atan2($y, $x) 153.43 ডিগ্রি। এখানে atan2() স্পষ্টভাবে দ্বিতীয় কোয়ার্টার নির্দেশ করছে।
  • তৃতীয় কোয়াড্রান্ট (Quadrant III): যখন x=10x = -10 এবং y=5y = -5 তখন atan($y / $x) -26.57 ডিগ্রি এবং atan2($y, $x) -233.43 ডিগ্রি। এটি তৃতীয় কোয়ার্টারে রয়েছে।
  • চতুর্থ কোয়াড্রান্ট (Quadrant IV): যখন x=10x = 10 এবং y=5y = -5 তখন atan($y / $x) -26.57 ডিগ্রি এবং atan2($y, $x) -26.56 ডিগ্রি। এখানে এটি চতুর্থ কোয়ার্টারে রয়েছে।

☠️ ভুল থেকে শিক্ষা

তাহলে পরের বার যখন তুমি কোণ এবং কোঅর্ডিনেটের বিপদজনক সমুদ্র জাহাজে নাবিকতা করবে তখন শুধু atan() এর উপর নির্ভর করো না। atan2() ব্যবহার করো এবং প্রতিবার সঠিক দিকে তোমার জাহাজটি পরিচালনা করো। এটা সেই কম্পাস যা তোমাকে ভুল গণনার ভয়ঙ্কর ডেভি জোন্সের লকার থেকে দূরে রাখতে সাহায্য করবে!

আশা করি তোমার গুপ্তধন যাত্রা শুভ হোক।

atan() ও atan2() সম্পর্কে আরও জানতে চাইলে নিচের লিংক গুলো ঘুরে আসো:

Top comments (0)