İlk olarak başlangıç noktası ve bitiş noktası arasındaki farkı bulun (burada, çizgiler "sonsuz" olduğundan ve belirli bir noktada başlamadığından, "çizgi" değil, daha çok yönlendirilmiş bir çizgi segmentidir.
deltaY = P2_y - P1_y
deltaX = P2_x - P1_x
Ardından açıyı (pozitif X ekseninden P1
pozitif Y eksenine doğru giden P1
) hesaplayın .
angleInDegrees = arctan(deltaY / deltaX) * 180 / PI
Ancak arctan
ideal olmayabilir, çünkü farklılıkları bu şekilde bölmek, açının hangi kadranı ayırt etmek için gerekli ayrımı silecektir (aşağıya bakınız). Dilinizde bir atan2
işlev varsa aşağıdakileri kullanın :
angleInDegrees = atan2(deltaY, deltaX) * 180 / PI
EDIT (22 Şubat 2017): Bununla birlikte, genel olarak, atan2(deltaY,deltaX)
sadece doğru açıyı almak için çağrıda bulunur cos
ve sin
yetersiz olabilir. Bu gibi durumlarda, genellikle aşağıdakileri yapabilirsiniz:
(deltaX, deltaY)
Bir vektör gibi davranın .
- Bu vektörü birim vektöre normalize edin. Bunu bölmek yapmak için
deltaX
ve deltaY
vektörün uzunluğu (tarafından sqrt(deltaX*deltaX+deltaY*deltaY)
uzunluğu 0 olmadıkça).
- Bundan sonra,
deltaX
şimdi vektör ve yatay eksen arasındaki açının kosinüsü olacaktır (pozitif X'ten pozitif Y eksenine doğru yönde P1
).
- Ve
deltaY
şimdi bu açının sinüsü olacak.
- Vektörün uzunluğu 0 ise, yatay eksen ile onun arasında bir açı olmaz (bu nedenle anlamlı bir sinüs ve kosinüs içermez).
EDIT (28 Şubat 2017): Normalleştirmeden bile (deltaX, deltaY)
:
- İşareti,
deltaX
3. adımda açıklanan kosinüsün pozitif veya negatif olup olmadığını söyleyecektir.
- İşareti,
deltaY
4. adımda açıklanan sinüsün pozitif veya negatif olup olmadığını söyleyecektir.
- Aşağıdaki konumdaki pozitif X eksenine göre açının hangi çeyrek dairenin işaretleri olduğunu
deltaX
ve deltaY
size söyleyecektir P1
:
+deltaX
, +deltaY
: 0 ila 90 derece.
-deltaX
, +deltaY
: 90 ila 180 derece.
-deltaX
, -deltaY
: 180 ila 270 derece (-180 ila -90 derece).
+deltaX
, -deltaY
: 270 ila 360 derece (-90 ila 0 derece).
Python'da radyan kullanan bir uygulama (cevabımı düzenleyen Eric Leschinski tarafından 19 Temmuz 2015'te sağlandı):
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)
Tüm testler geçer. Bkz. Https://en.wikipedia.org/wiki/Unit_circle