প্রথমে শুরুর পয়েন্ট এবং শেষ পয়েন্টের মধ্যে পার্থক্যটি সন্ধান করুন (এখানে, এটি একটি নির্দেশিত রেখাংশের বেশি, একটি "লাইন" নয়, যেহেতু লাইনগুলি সীমিতভাবে প্রসারিত হয় এবং কোনও নির্দিষ্ট বিন্দুতে শুরু হয় না)।
deltaY = P2_y - P1_y
deltaX = P2_x - P1_x
তারপরে কোণটি গণনা করুন (যা ইতিবাচক এক্স অক্ষ P1
থেকে ধনাত্মক Y অক্ষের দিকে চলে P1
)।
angleInDegrees = arctan(deltaY / deltaX) * 180 / PI
তবে arctan
আদর্শ হতে পারে না, কারণ এইভাবে পার্থক্যগুলিকে ভাগ করে নিলে কোণটি যে চতুর্ভুজটিতে রয়েছে তা আলাদা করার জন্য প্রয়োজনীয় পার্থক্য মুছে ফেলবে (নীচে দেখুন)। পরিবর্তে আপনার ভাষাতে কোনও atan2
ফাংশন অন্তর্ভুক্ত থাকলে নিম্নলিখিতটি ব্যবহার করুন :
angleInDegrees = atan2(deltaY, deltaX) * 180 / PI
সম্পাদনা (ফেব্রুয়ারি 22, 2017): সাধারণভাবে, atan2(deltaY,deltaX)
কেবলমাত্র উপযুক্ত কোণটি পেতে কল করা cos
এবং sin
তা নিষ্ক্রিয় হতে পারে। এই ক্ষেত্রে, আপনি প্রায়শই পরিবর্তে নিম্নলিখিতগুলি করতে পারেন:
(deltaX, deltaY)
ভেক্টর হিসাবে আচরণ করুন ।
- সেই ভেক্টরটিকে ইউনিট ভেক্টরে সাধারণ করুন। এটি করার জন্য, দৈর্ঘ্য 0 না হওয়া পর্যন্ত ভাগ
deltaX
এবং deltaY
ভেক্টরের দৈর্ঘ্য ( sqrt(deltaX*deltaX+deltaY*deltaY)
) দ্বারা বিভক্ত করুন ।
- এর পরে,
deltaX
এখন ভেক্টর এবং অনুভূমিক অক্ষের মধ্যে কোণটির কোসাইন হবে (ধনাত্মক এক্স থেকে ধনাত্মক Y অক্ষের দিকে P1
)।
- এবং
deltaY
এখন সেই কোণটির সাইন হবে।
- যদি ভেক্টরের দৈর্ঘ্য 0 হয় তবে এর মধ্যে অনুভূমিক অক্ষের মধ্যে একটি কোণ থাকবে না (সুতরাং এটিতে কোনও অর্থবহ সাইন এবং কোসাইন থাকবে না)।
সম্পাদনা (ফেব্রুয়ারি 28, 2017): এমনকি সাধারণ না করেও (deltaX, deltaY)
:
- সাইনটি
deltaX
আপনাকে বলবে যে 3 য় ধাপে বর্ণিত কোসাইন ইতিবাচক বা নেতিবাচক।
- সাইনটি
deltaY
আপনাকে জানাবে যে চতুর্থ ধাপে বর্ণিত সাইনটি ইতিবাচক বা নেতিবাচক।
- এর ধনাত্মক এক্স অক্ষের সাথে সম্পর্কিত কোণের কোণের কোণটি রয়েছে
deltaX
এবং এর লক্ষণগুলি deltaY
আপনাকে জানাবে P1
:
+deltaX
, +deltaY
: 0 থেকে 90 ডিগ্রি।
-deltaX
, +deltaY
: 90 থেকে 180 ডিগ্রি।
-deltaX
, -deltaY
: 180 থেকে 270 ডিগ্রি (-180 থেকে -90 ডিগ্রি)।
+deltaX
, -deltaY
: 270 থেকে 360 ডিগ্রি (-90 থেকে 0 ডিগ্রি)।
রেডিয়ান ব্যবহার করে পাইথনে একটি বাস্তবায়ন (আমার উত্তর সম্পাদনা করেছেন এরিক লেসচিনস্কি 19 জুলাই, 2015 এ সরবরাহ করেছেন):
from math import *
def angle_trunc(a):
while a < 0.0:
a += pi * 2
return a
def getAngleBetweenPoints(x_orig, y_orig, x_landmark, y_landmark):
deltaY = y_landmark - y_orig
deltaX = x_landmark - x_orig
return angle_trunc(atan2(deltaY, deltaX))
angle = getAngleBetweenPoints(5, 2, 1,4)
assert angle >= 0, "angle must be >= 0"
angle = getAngleBetweenPoints(1, 1, 2, 1)
assert angle == 0, "expecting angle to be 0"
angle = getAngleBetweenPoints(2, 1, 1, 1)
assert abs(pi - angle) <= 0.01, "expecting angle to be pi, it is: " + str(angle)
angle = getAngleBetweenPoints(2, 1, 2, 3)
assert abs(angle - pi/2) <= 0.01, "expecting angle to be pi/2, it is: " + str(angle)
angle = getAngleBetweenPoints(2, 1, 2, 0)
assert abs(angle - (pi+pi/2)) <= 0.01, "expecting angle to be pi+pi/2, it is: " + str(angle)
angle = getAngleBetweenPoints(1, 1, 2, 2)
assert abs(angle - (pi/4)) <= 0.01, "expecting angle to be pi/4, it is: " + str(angle)
angle = getAngleBetweenPoints(-1, -1, -2, -2)
assert abs(angle - (pi+pi/4)) <= 0.01, "expecting angle to be pi+pi/4, it is: " + str(angle)
angle = getAngleBetweenPoints(-1, -1, -1, 2)
assert abs(angle - (pi/2)) <= 0.01, "expecting angle to be pi/2, it is: " + str(angle)
সমস্ত পরীক্ষা পাস। Https://en.wikedia.org/wiki/Unit_circ দেখুন