2010-06-16 14 views
6

Na przykład GetAngle ((0,0), (100,0), (100,100)) = 90. Jak znaleźć kąt między 3 punktami 2D.Kąt między 3 wierzchołkami

+3

Gdyby to było miejsce matematyczne, miałbym ochotę oznaczyć to zadanie domowe. ;) To jest prosta trygonometria. http://en.wikipedia.org/wiki/ Trygonometria#Common_formulaty – Cogwheel

+0

Nie, to dla osobistego projektu – jmasterx

Odpowiedz

9

Biorąc pod uwagę punkty A, B i C, chcesz kąt między AB a AC? Najpierw obliczyć wektory AB i AC - to tylko współrzędne B minus współrzędne A i podobnie dla AC. Weź dot product z dwóch wektorów. Jest to tylko iloczyn współrzędnych x plus iloczyn współrzędnych y wektorów. Podziel tę liczbę przez długość AB i ponownie przez długość AC. Wynik ten jest cosinusem kąta między dwoma wektorami, więc weź arccos() i już go masz.

+0

Dzięki, zrobię to – jmasterx

+1

Z pytania Myślę, że pożądany kąt jest włączony pomiędzy BA i BC –

+0

@Dave Oh , Dzięki :-) – jmasterx

1

pomocą iloczynu skalarnego:

(a,b,c) dot (d,e,f) = ad + be + bf.

A dot B = length(A)*length(B)* cos(theta) 

theta = arccos((A dot B)/(length(A)*length(B)) jest kąt między wektorami A i B.

0

To proste, jeśli masz podstawową wiedzę na temat algebry liniowej.

Wektor v (w sensie algebry liniowej, nie std :: wektor;)) jest krotką v = (x, y, z).

Normą jest długość wektora | v | = Sqrt (x x + y y + z z *)

Wewnętrzna dwóch wektorów V1 = (x1, y1, z1) i V2 = (x2, y2, Z2) jest V1 · V2 = x1 * x2 + Y1 * y2 + z1 * z2

kąt wektorów V1 i V2 a = acos (V1 · V2/(| V1 | * | V2 |))

+0

Dzięki! Też to lubię :-) – jmasterx

6

problem z wykorzystaniem tylko Produktem o tej nazwie jest to, że jest niestabilny w pobliżu 0 lub 180 stopni - nachylenie acos() zbliża się do nieskończoności w pobliżu +/- 1,0, co spowoduje utratę precyzji.

Aby rozwiązać ten problem, można obliczyć produkt pseudo przekroju i użyć atan2(), w następujący sposób:

// given A, B, C are 2D points: 
BA= B - A; CA= C - A // vector subtraction, to get vector between points 
dot= BA.x * CA.x + BA.y * CA.y 
pcross= BA.x * CA.y - BA.y * CA.x 
angle= atan2(pcross, dot) // this should be the angle BAC, in radians 

ten powinien być numerycznie wytrzymały, chyba że jeden z ramion kąta ma długość zerową.

Należy zauważyć, że pod tym kątem podany zostanie również podany kąt, w zależności od tego, czy BAC jest zgodny z ruchem wskazówek zegara, czy przeciwnie do ruchu wskazówek zegara; metoda acos() zawsze da ci dodatnią wartość. Oczywiście, jeśli chcesz tylko pozytywny kąt, możesz wziąć abs(angle); metoda atan2() będzie jeszcze bardziej niezawodna i prawdopodobnie szybsza.

Powiązane problemy