पहले प्रारंभ बिंदु और अंतिम बिंदु के बीच अंतर खोजें (यहां, यह एक निर्देशित रेखा खंड का अधिक है, न कि "लाइन", क्योंकि लाइनें असीम रूप से विस्तारित होती हैं और किसी विशेष बिंदु पर शुरू नहीं होती हैं)।
deltaY = P2_y - P1_y
deltaX = P2_x - P1_x
फिर कोण की गणना करें (जो सकारात्मक X अक्ष से P1सकारात्मक Y अक्ष पर चलती है P1)।
angleInDegrees = arctan(deltaY / deltaX) * 180 / PI
लेकिन arctanआदर्श नहीं हो सकता है, क्योंकि इस तरह से मतभेदों को विभाजित करने से यह भेद करने के लिए आवश्यक भेद मिट जाएगा कि कोण किस कोण में है (नीचे देखें)। यदि आपकी भाषा में कोई atan2फ़ंक्शन शामिल है, तो इसके बजाय निम्नलिखित का उपयोग करें :
angleInDegrees = atan2(deltaY, deltaX) * 180 / PI
EDIT (22 फरवरी, 2017): सामान्य तौर पर, हालांकि, इसके atan2(deltaY,deltaX)लिए उचित कोण प्राप्त करने के लिए सिर्फ कॉल करना cosऔर sinअयोग्य हो सकता है। उन मामलों में, आप अक्सर इसके बजाय निम्नलिखित कर सकते हैं:
(deltaX, deltaY)एक वेक्टर के रूप में समझो ।
- उस वेक्टर को एक इकाई वेक्टर से सामान्यीकृत करें। इतना विभाजित करने के लिए,
deltaXऔर deltaYवेक्टर की लंबाई (से sqrt(deltaX*deltaX+deltaY*deltaY)), जब तक लंबाई 0 है।
- उसके बाद,
deltaXअब वेक्टर और क्षैतिज अक्ष (सकारात्मक X से सकारात्मक Y अक्ष पर दिशा में P1) के बीच के कोण का कोसाइन होगा ।
- और
deltaYअब उस कोण की साइन होगी।
- यदि वेक्टर की लंबाई 0 है, तो इसके और क्षैतिज अक्ष के बीच एक कोण नहीं होगा (इसलिए इसमें सार्थक साइन और कॉसियस नहीं होगा)।
EDIT (28 फरवरी, 2017): सामान्यीकरण के बिना भी (deltaX, deltaY):
deltaXवसीयत का संकेत आपको बताएगा कि चरण 3 में वर्णित कोसाइन सकारात्मक है या नकारात्मक।
- यह संकेत
deltaYआपको बताएगा कि चरण 4 में वर्णित साइन सकारात्मक है या नकारात्मक।
- के संकेत
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.wikipedia.org/wiki/Unit_circle देखें