सबसे पहले प्रारंभ बिंदु और अंत बिंदु के बीच का अंतर पाएं (यहां, यह एक निर्देशित लाइन सेगमेंट है, न कि "लाइन", क्योंकि रेखाएं असीमित रूप से बढ़ती हैं और किसी विशेष बिंदु पर शुरू नहीं होती हैं)।
deltaY = P2_y - P1_y
deltaX = P2_x - P1_x
फिर कोण (जो P1
पर सकारात्मक Y अक्ष को P1
पर सकारात्मक एक्स अक्ष से चलाता है) की गणना।
angleInDegrees = arctan(deltaY/deltaX) * 180/PI
लेकिन arctan
, आदर्श नहीं हो सकता है क्योंकि इस तरह के मतभेदों को भेद भेद करने के लिए जो कोण वृत्त का चतुर्थ भाग की जरूरत मिटा देगा में है विभाजित (नीचे देखें)।
angleInDegrees = atan2(deltaY, deltaX) * 180/PI
संपादित करें (फरवरी 22, 2017): निम्नलिखित बजाय यदि अपनी भाषा एक atan2
समारोह भी शामिल है का उपयोग करें सामान्य में, तथापि, atan2(deltaY,deltaX)
बुला सिर्फ cos
के लिए उचित कोण पाने के लिए और sin
असजीला हो सकता है। उन मामलों में, आप अक्सर निम्नलिखित कार्य कर सकते हैं:
(deltaX, deltaY)
एक वेक्टर के रूप में व्यवहार करें।
- वेक्टर को एक वेक्टर वेक्टर को सामान्यीकृत करें। जब तक लंबाई 0.
- उसके बाद तो, वेक्टर की दूरी (
sqrt(deltaX*deltaX+deltaY*deltaY)
) द्वारा deltaX
और deltaY
विभाजित करने के लिए, deltaX
अब (वेक्टर और क्षैतिज अक्ष के बीच के कोण की कोज्या हो जाएगा से दिशा में 0 एक्सपर सकारात्मक वाई धुरी के लिए सकारात्मक एक्स)।
- और
deltaY
अब कि कोण की ज्या हो जाएगा।
- तो वेक्टर की दूरी 0 है, यह यह और क्षैतिज अक्ष के बीच एक कोण के लिए नहीं होगा (इसलिए यह एक सार्थक साइन और कोसाइन की ज़रूरत नहीं होगी)।
संपादित करें (फरवरी 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 डिग्री)।
(एरिक Leschinski, जो मेरा उत्तर संपादित द्वारा 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
आप इस पाया है और आप जावास्क्रिप्ट का उपयोग कर रहे यह बहुत महत्वपूर्ण है ध्यान दें कि Math.sin और मठ।क्योंकि आप रेडियंस लेते हैं ताकि आपको परिणाम को डिग्री में परिवर्तित करने की आवश्यकता न हो! तो * 180/पीआई बिट को नजरअंदाज करें। मुझे यह पता लगाने में 4 घंटे लग गए। :) – sidonaldson
वर्टिकल धुरी के साथ कोण की गणना करने के लिए किसी को क्या उपयोग करना चाहिए? – ZeMoon
@akashg: '90 - कोण इन डिग्री '? – jbaums