গেমগুলিতে আতান এবং আতান 2 কীসের জন্য ব্যবহৃত হয়?


47

আমি কিছু কষ্ট বোঝার হচ্ছে Math.tan()এবং Math.atan()এবং Math.atan2()

আমার ত্রিকোণমিতির প্রাথমিক জ্ঞান আছে তবে গেমের বিকাশের জন্য এসআইএন, সিওএস এবং ট্যান ইত্যাদির ব্যবহার আমার কাছে খুব নতুন।

আমি কয়েকটি টিউটোরিয়াল পড়ছি এবং আমি দেখতে পেলাম যে ট্যানজেন্ট ব্যবহার করে আমরা এমন কোণটি পেতে পারি যেখানে একটি বস্তুকে কতটা ঘোরানো দরকার যাতে অন্য কোনও বস্তুর মুখোমুখি হতে হয় উদাহরণস্বরূপ আমার মাউস। তাহলে কেন আমাদের এখনও আটান বা অ্যাটান 2 ব্যবহার করা দরকার?


আটান এক হাজার বিভিন্ন জিনিসের জন্য কোণ নির্ধারণ করতে ব্যবহৃত হয়। এটির ব্যবহার সম্পর্কে আপনার কাছে কি সত্যিকারের প্রশ্ন আছে বা আপনি কেবল সাধারণ গণিত সহায়তা খুঁজছেন?
ব্লুরাজা - ড্যানি পিফ্লুঘিওফট

5
আপনাকে অবশ্যই সেই ফাংশনের পিছনে গণিত / জ্যামিতি বুঝতে হবে; আপনি একবার তাদের দক্ষ হয়ে উঠলে, তারা আপনার "বিশ্ব বোঝার" অংশ হয়ে উঠবে, আপনি প্রতিদিন যে ব্যাকরণটি बोलতে প্রতিদিন ব্যবহার করেন তার মতো। একবার আপনি "গণিত / জ্যামিতি বলতে" সক্ষম হয়ে গেলে দেখতে পাবেন যে ফলগুলি অর্জন করার জন্য এই ফাংশনগুলি সরল সরঞ্জাম, ব্যবহার করা সবচেয়ে স্বাভাবিক।
FxIII

এই টিউটোরিয়ালগুলি হয় ভুল হয় বা আপনি ভুল বোঝে। আপনি একটি বস্তু থেকে অন্য বস্তুতে কোণ পেতে atan2 () ব্যবহার করেন। কিভাবে যে কাজ করে নীচে ব্যাখ্যা করা হয়।
ধাঁধা দিন

উত্তরের জন্য লোককে ধন্যবাদ, এখন আমি ক্লাসে বেশি মনোযোগ না
দেওয়ার জন্য আফসোস করছি

উত্তর:


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 ডায়াগ্রাম

(চিত্রের সৌজন্যে গ্যারেথ, দয়া করে তার উত্তরটিও দিন)


গেম বিকাশে ত্রিকোণমিতির ব্যবহার বেশ সাধারণ, বিশেষত ভেক্টরগুলির সাথে, তবে সাধারণত গ্রন্থাগারগুলি আপনার জন্য ত্রিকোণমিতির কাজটি গোপন করে। আপনি ত্রিভুজ থেকে কোনও মান খুঁজে পেতে জ্যামিতিক ম্যানিপুলেশনগুলিকে জড়িত এমন অনেক কাজের জন্য sin / cos / tan ব্যবহার করতে পারেন। একটি আয়তক্ষেত্র ত্রিভুজের অন্যান্য মানগুলি খুঁজে পেতে আপনার কেবলমাত্র 3 টি মান (পাশের দৈর্ঘ্য / কোণ মানের) প্রয়োজন তাই এটি বেশ কার্যকর।

আপনি এমনকি কোনও গেমের বিশেষ আচরণের জন্য সাইন এবং কোসাইন ফাংশনগুলির "সাইক্লিং" প্রকৃতিটি ব্যবহার করতে পারেন, যেমন আমি দেখেছি যে কোস / পাপ একটি অন্যকে ঘুরিয়ে দেওয়ার জন্য প্রচুর ব্যবহার করেছে।


8
উইকিপিডিয়ায় কেবল শূন্য দ্বারা বিভাজনকে এড়িয়ে যাওয়ার চেয়ে আতান 2 ( অতন নয় ) এর অন্যান্য ব্যবহারগুলি বর্ণনা করা মূল্যবান । উদাহরণস্বরূপ, এটি কোয়াড্র্যান্ট ব্যবহৃত হওয়ার জন্য নিজেকে সংশোধন করে, যেখানে সাধারণত আপনি নিজের যা করতে চান তা সবই ঘটে।
ডপপেলগ্রিনিয়ার

সত্যই, খুব গুরুত্বপূর্ণ নোট ঠিক আছে। আমার উত্তর আপডেট করা হচ্ছে।
জেসি এমন্ড

আপনি কি আপনার প্রথম দীর্ঘ অনুচ্ছেদে টান এবং অতন পিছন দিকে পেয়েছেন? আপনি কোণ পেতে (যেমন সমীকরণটি বিপরীত করুন) এবং পক্ষগুলির অনুপাত (যেমন সমীকরণটি যা বলেছেন ঠিক তাই) পেতে ট্যানটি ব্যবহার করবেন d
জোক করা হচ্ছে

ঠিক আছে আপনি যদি জানেন যে o / a সমান 3 উদাহরণস্বরূপ, তবে আপনি যদি কোণটি আটান (3) করেন তবে এটি আমার অর্থ: আপনি যদি কোণটি বিচ্ছিন্ন করতে চান তবে আপনি অনুপাতের উপর আটান ব্যবহার করবেন। আপনি যদি অনুপাতটি আলাদা করতে চান তবে আপনি কোণে ট্যান ব্যবহার করুন।
জেসি এমন্ড

আমি তখন আপনার শব্দ পরিবর্তন করব, কারণ মনে হচ্ছে আপনি বিপরীত কথা বলছিলেন।
59

63

এখানে চিত্র বর্ণনা লিখুন


1
এটিতে এই ডায়াগ্রামটি রাখার জন্য কি উত্তরের উত্তরটি সম্পাদনা করা অসম্পূর্ণ হবে? এই চিত্রটি দুর্দান্ত এবং জেসির আটান 2 () এর লিখিত ব্যাখ্যার পরে ঠিক ফিট হবে।
12:34 এ ঝাঁকুনি দেওয়া

1
এগিয়ে যান: আমার অতিথি হন! আপনার উত্তর শেষ হয়ে যাওয়ার পরে আমি এই উত্তরটি মুছব।
গ্যারেথ রিস

7
না না. এটা বজায় রাখা! এটি জমা দেওয়া হয়েছে এবং লোকেরা এখনও চিত্রটির জন্য এখানে উত্সাহ দেওয়া উচিত।
জেসি এমন্ড

12

আতন () এবং আতান 2 () সহ ট্রাইগ ফাংশন সম্পর্কে চিন্তা করার কিছুটা ভিন্ন উপায় এখানে - যা আমি সহায়ক ("বিপরীত / সংলগ্ন" পদে ব্যাখ্যা কেবল কোনও কারণে আমাকে বিভ্রান্ত করে) খুঁজে পাই।

এক্স, ওয়াই, আর, থিতা

অনুভূমিকভাবে x একক এবং y ইউনিটকে উল্লম্বভাবে সরানো ( আয়তক্ষেত্রাকার বা কার্টেসিয়ান স্থানাঙ্ক বলা হয় ) বা Ɵ এর কোণে দূরত্ব r সরানো ( 2D তে পোলার স্থানাঙ্ক বলা হয় ) দ্বারা আপনি এক বিন্দু থেকে অন্য দিকে যেতে পারেন ।

বলুন আমাদের একটি পোলার স্থানাঙ্ক রয়েছে (r, Ɵ) এবং আমরা এটিকে (x, y) রূপান্তর করতে চাই।

কোস (Ɵ) আপনাকে x অক্ষের সাথে থাকা আর এর অনুপাত দেয় :

  • যদি r = 1 হয় তবে এক্স = কোস (Ɵ)।
  • যদি r = 100 হয় তবে এক্স = 100 * কোস (Ɵ)।
  • সাধারণ x = r * cos (Ɵ)।

তেমনি পাপ (Ɵ) আপনাকে y এর অক্ষের সাথে থাকা আর এর অনুপাত দেয় :

  • যদি r = 1 হয় তবে y = sin (Ɵ)।
  • যদি r = 100 হয় তবে y = 100 * sin (Ɵ)।
  • সাধারণ y = r * sin (Ɵ)।

আয়তক্ষেত্রাকার স্থানাঙ্ক (x, y )কে পোলার স্থানাঙ্কে (আর, Ɵ) রূপান্তর সম্পর্কে কীভাবে?

r হ'ল x এবং y দ্বারা গঠিত ডান ত্রিভুজটির অনুমিতি , তাই:

  • আর = স্কয়ার্ট (x x + y y)

ট্যান (Ɵ) দৈর্ঘ্যের আর দিয়ে রেখার slাল - রানের উপরে বৃদ্ধি দেয় । তাই:

  • ট্যান (Ɵ) = y / x
  • Ɵ = আতান (y / x)

তবে, y / x সম্পাদন করার সময় 3/4 গণনা করা -3 / -4 গণনার সমান উত্তর দেয়। তেমনিভাবে -3/4 3 / -4 হিসাবে একই উত্তর দেয়। সুতরাং আমাদের atan2 (y, x) আছে যা পৃথক চিহ্নগুলি সঠিকভাবে পরিচালনা করে এবং বিভাজন দ্বারা শূন্য / অনন্ত ত্রুটি প্রতিরোধ করে।

  • Ɵ = আতান 2 (y, x)

4

জেসি এবং সিড মূলত সঠিক, তবে আমি সন্দেহ করি যে আপনি সমস্যাটির অন্তর্দৃষ্টি পরে আছেন।

আতান 2 () এর দরকার যেমন অতনান () আপনাকে যে অনুভূমিক দিক থেকে চতুষ্কোণগুলি মোকাবেলা করতে পারে না সেগুলি আপনাকে দেয় না।

এর অর্থ হ'ল ভেক্টরগুলির জন্য আতান (-2,2) এবং (2, -2) একই মান দেবে। তারপরে আপনি আপনার যুক্তির চিহ্নটি স্যুইচ করতে এবং ফলাফলটিতে পাই যুক্ত করতে চান। এছাড়াও, জেসি উল্লেখ করেছেন তা বিবেচনা করার জন্য আপনার শূন্যের বিশেষ ক্ষেত্রে বিভাজন রয়েছে। এছাড়াও x 0 এর কাছাকাছি থাকলে atan2 () atan এর চেয়ে আরও ভাল কাজ করে

সুতরাং আপনি যদি পি-পি এবং পাই এর মধ্যে একটি ভেক্টরের কোণ চান

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 হওয়া উচিত। যারা এই আবর্জনা দিয়ে ভোট দিয়েছেন তাদের জন্য লজ্জা পান।

কোডটি এখনও ভুল। আপনি y==0তখন xঅন্য শাখায় ভাগ করে নেওয়ার জন্য পরীক্ষা করছেন ।
সাম হোচেভার

0

আমি একটি সংক্ষিপ্ত পদ্ধতিতে কয়েকটি বিষয় পরিষ্কার করব will বিস্তারিত ব্যাখ্যার জন্য দয়া করে অনলাইনে ত্রিকোণমিতি টিউটোরিয়াল পড়ুন।

একটি কোণ হতে দিন। তারপরে ট্যান (ক) = ট্যান (এ + 2 * পাই)।

আটান ট্যান বিপরীতমুখী হয়, যা আপনাকে ট্যান প্রদত্ত কোণ দেয়। আপনি যখন আতনকে কল করবেন (ট্যান (a + 2 * পাই)), উত্তরটি হ'ল একটি। এটি আপনার আবেদনের পক্ষে অপর্যাপ্ত।

atan2 এই সঠিক পরিস্থিতিতে সাহায্য করতে 2 টি যুক্তি নেবে। অটান x এবং y নেয় যা মূলত কোস (ক) এবং পাপ (ক)।

আতান 2 (পাপ (ক), কোস (ক)) = এটান 2 (পাপ (a + 2 * পাই), কোস (এ + 2 * পিআই)) = এ + 2 * পিআই / * পাপ এবং কোসের আলাদা চিহ্ন রয়েছে, যা নেতৃস্থানীয় একটি ভিন্ন উত্তরে * /

কেন এইভাবে হয় তা বোঝাতে দয়া করে কিছু টিউটোরিয়াল সন্ধান করুন।

আপনার কোডটি এমন কিছু হওয়া উচিত:

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 এর মধ্যে একটি ফাংশন। এটি এই প্যাটার্নটির পুনরাবৃত্তি করে তবে এটি কোনও ফাংশন নয় যা কোনও কম্পিউটারের জন্য সমস্যা কারণ এটি একাধিক উত্তর পরিচালনা করে না।

এটি -PI / 2 এবং PI / 2 এবং acos 0 এবং PI এর মধ্যে একই ac এটি কোনও ক্রিয়াকলাপের জন্য সবচেয়ে সহজ রেঞ্জ st আতান এবং আসিনের জন্য এটি এর সবচেয়ে নেতিবাচক থেকে তার সবচেয়ে ইতিবাচক দিকে যায়। অ্যাকোসের জন্য এটি এর সবচেয়ে ইতিবাচক থেকে তার সবচেয়ে নেতিবাচক দিকে যায়। (এটি আরও সঠিক উত্তরগুলিকে বিভক্ত করতে সহায়তা করে)

সুতরাং আসিন, অ্যাকোস এবং আতান হল গাণিতিক ক্রিয়া।

এটিান 2 তবে প্রোগ্রামিংয়ের জন্য অনেক বেশি উপকারী কারণ এটি সম্পূর্ণ বিপ্লব সরবরাহ করে (রেডিয়ানগুলিতে পিআই বা 360 ডিগ্রি বা 400 গ্রেডিয়ান)। নোট করুন যে তারা কেবল ট্যানের জন্য একটি উত্পাদন করেছে পাপ বা কোসগুলির জন্য নয়। ট্যান হ'ল একমাত্র অনুভূমিক এবং উল্লম্ব ব্যবহার করে (x, y)

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